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(crate) 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
18pub trait AsAbstractSolid: AsAbstractGeometricPrimitive {
19    fn abstract_solid(&self) -> &AbstractSolid;
20}
21
22pub trait AsAbstractSolidMut: AsAbstractSolid + AsAbstractGeometricPrimitiveMut {
23    fn abstract_solid_mut(&mut self) -> &mut AbstractSolid;
24}
25
26impl AsAbstractSolid for AbstractSolid {
27    fn abstract_solid(&self) -> &AbstractSolid {
28        self
29    }
30}
31
32impl AsAbstractSolidMut for AbstractSolid {
33    fn abstract_solid_mut(&mut self) -> &mut AbstractSolid {
34        self
35    }
36}
37
38#[macro_export]
39macro_rules! impl_abstract_solid_traits {
40    ($type:ty) => {
41        $crate::impl_abstract_geometric_primitive_traits!($type);
42
43        impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitive for $type {
44            fn abstract_geometric_primitive(
45                &self,
46            ) -> &$crate::model::geometry::primitives::AbstractGeometricPrimitive {
47                use $crate::model::geometry::primitives::AsAbstractSolid;
48                &self.abstract_solid().abstract_geometric_primitive
49            }
50        }
51
52        impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitiveMut for $type {
53            fn abstract_geometric_primitive_mut(
54                &mut self,
55            ) -> &mut $crate::model::geometry::primitives::AbstractGeometricPrimitive {
56                use $crate::model::geometry::primitives::AsAbstractSolidMut;
57                &mut self.abstract_solid_mut().abstract_geometric_primitive
58            }
59        }
60    };
61}
62
63impl_abstract_solid_traits!(AbstractSolid);