Skip to main content

egml_core/model/geometry/primitives/
abstract_solid.rs

1use 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);