egml_core/model/geometry/primitives/
abstract_solid.rs1use crate::model::geometry::primitives::{
2 AbstractGeometricPrimitive, AsAbstractGeometricPrimitive, AsAbstractGeometricPrimitiveMut,
3};
4
5#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
6pub struct AbstractSolid {
7 pub abstract_geometric_primitive: AbstractGeometricPrimitive,
8}
9
10impl AbstractSolid {
11 pub fn new(abstract_geometric_primitive: AbstractGeometricPrimitive) -> Self {
12 Self {
13 abstract_geometric_primitive,
14 }
15 }
16
17 pub fn from_abstract_geometric_primitive(
18 abstract_geometric_primitive: AbstractGeometricPrimitive,
19 ) -> Self {
20 Self {
21 abstract_geometric_primitive,
22 }
23 }
24}
25
26pub trait AsAbstractSolid: AsAbstractGeometricPrimitive {
27 fn abstract_solid(&self) -> &AbstractSolid;
28}
29
30pub trait AsAbstractSolidMut: AsAbstractSolid + AsAbstractGeometricPrimitiveMut {
31 fn abstract_solid_mut(&mut self) -> &mut AbstractSolid;
32}
33
34impl AsAbstractSolid for AbstractSolid {
35 fn abstract_solid(&self) -> &AbstractSolid {
36 self
37 }
38}
39
40impl AsAbstractSolidMut for AbstractSolid {
41 fn abstract_solid_mut(&mut self) -> &mut AbstractSolid {
42 self
43 }
44}
45
46#[macro_export]
47macro_rules! impl_abstract_solid_traits {
48 ($type:ty) => {
49 $crate::impl_abstract_geometric_primitive_traits!($type);
50
51 impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitive for $type {
52 fn abstract_geometric_primitive(
53 &self,
54 ) -> &$crate::model::geometry::primitives::AbstractGeometricPrimitive {
55 &<$type as $crate::model::geometry::primitives::AsAbstractSolid>::abstract_solid(
56 self,
57 )
58 .abstract_geometric_primitive
59 }
60 }
61 };
62}
63
64#[macro_export]
65macro_rules! impl_abstract_solid_mut_traits {
66 ($type:ty) => {
67 $crate::impl_abstract_geometric_primitive_mut_traits!($type);
68
69 impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitiveMut for $type {
70 fn abstract_geometric_primitive_mut(
71 &mut self,
72 ) -> &mut $crate::model::geometry::primitives::AbstractGeometricPrimitive {
73 &mut <$type as $crate::model::geometry::primitives::AsAbstractSolidMut>::abstract_solid_mut(self)
74 .abstract_geometric_primitive
75 }
76 }
77 };
78}
79
80impl_abstract_solid_traits!(AbstractSolid);
81impl_abstract_solid_mut_traits!(AbstractSolid);