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(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);