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 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 pub fn from_abstract_geometric_primitive(
21 abstract_geometric_primitive: AbstractGeometricPrimitive,
22 ) -> Self {
23 Self {
24 abstract_geometric_primitive,
25 }
26 }
27}
28
29pub trait AsAbstractSurface: AsAbstractGeometricPrimitive {
31 fn abstract_surface(&self) -> &AbstractSurface;
33}
34
35pub trait AsAbstractSurfaceMut: AsAbstractSurface + AsAbstractGeometricPrimitiveMut {
37 fn abstract_surface_mut(&mut self) -> &mut AbstractSurface;
39}
40
41impl AsAbstractSurface for AbstractSurface {
42 fn abstract_surface(&self) -> &AbstractSurface {
43 self
44 }
45}
46
47impl AsAbstractSurfaceMut for AbstractSurface {
48 fn abstract_surface_mut(&mut self) -> &mut AbstractSurface {
49 self
50 }
51}
52
53#[macro_export]
54macro_rules! impl_abstract_surface_traits {
55 ($type:ty) => {
56 $crate::impl_abstract_geometric_primitive_traits!($type);
57
58 impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitive for $type {
59 fn abstract_geometric_primitive(
60 &self,
61 ) -> &$crate::model::geometry::primitives::AbstractGeometricPrimitive {
62 &<$type as $crate::model::geometry::primitives::AsAbstractSurface>::abstract_surface(self)
63 .abstract_geometric_primitive
64 }
65 }
66 };
67}
68
69#[macro_export]
70macro_rules! impl_abstract_surface_mut_traits {
71 ($type:ty) => {
72 $crate::impl_abstract_geometric_primitive_mut_traits!($type);
73
74 impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitiveMut for $type {
75 fn abstract_geometric_primitive_mut(
76 &mut self,
77 ) -> &mut $crate::model::geometry::primitives::AbstractGeometricPrimitive {
78 &mut <$type as $crate::model::geometry::primitives::AsAbstractSurfaceMut>::abstract_surface_mut(self)
79 .abstract_geometric_primitive
80 }
81 }
82 };
83}
84
85impl_abstract_surface_traits!(AbstractSurface);
86impl_abstract_surface_mut_traits!(AbstractSurface);