egml_core/model/geometry/primitives/
abstract_surface.rs1use crate::model::geometry::primitives::{
2 AbstractGeometricPrimitive, AsAbstractGeometricPrimitive, AsAbstractGeometricPrimitiveMut,
3};
4#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
9pub struct AbstractSurface {
10 pub(crate) abstract_geometric_primitive: AbstractGeometricPrimitive,
11}
12
13impl AbstractSurface {
14 pub fn new(abstract_geometric_primitive: AbstractGeometricPrimitive) -> Self {
15 Self {
16 abstract_geometric_primitive,
17 }
18 }
19}
20
21pub trait AsAbstractSurface: AsAbstractGeometricPrimitive {
23 fn abstract_surface(&self) -> &AbstractSurface;
25}
26
27pub trait AsAbstractSurfaceMut: AsAbstractSurface + AsAbstractGeometricPrimitiveMut {
29 fn abstract_surface_mut(&mut self) -> &mut AbstractSurface;
31}
32
33impl AsAbstractSurface for AbstractSurface {
34 fn abstract_surface(&self) -> &AbstractSurface {
35 self
36 }
37}
38
39impl AsAbstractSurfaceMut for AbstractSurface {
40 fn abstract_surface_mut(&mut self) -> &mut AbstractSurface {
41 self
42 }
43}
44
45#[doc(hidden)]
46#[macro_export]
47macro_rules! impl_abstract_surface_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 use $crate::model::geometry::primitives::AsAbstractSurface;
56 &self.abstract_surface().abstract_geometric_primitive
57 }
58 }
59
60 impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitiveMut for $type {
61 fn abstract_geometric_primitive_mut(
62 &mut self,
63 ) -> &mut $crate::model::geometry::primitives::AbstractGeometricPrimitive {
64 use $crate::model::geometry::primitives::AsAbstractSurfaceMut;
65 &mut self.abstract_surface_mut().abstract_geometric_primitive
66 }
67 }
68 };
69}
70
71impl_abstract_surface_traits!(AbstractSurface);