Skip to main content

egml_core/model/geometry/primitives/
abstract_surface.rs

1use crate::model::geometry::primitives::{
2    AbstractGeometricPrimitive, AsAbstractGeometricPrimitive, AsAbstractGeometricPrimitiveMut,
3};
4/// Base data shared by all GML surface geometry types ([OGC 07-036 ยง10.5.1](https://docs.ogc.org/is/07-036/07-036.pdf)).
5///
6/// A surface is a 2-D geometric primitive.  Concrete surface types include
7/// [`Polygon`], [`Surface`], and [`CompositeSurface`].
8#[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
29/// Object-safe read accessor for [`AbstractSurface`] fields.
30pub trait AsAbstractSurface: AsAbstractGeometricPrimitive {
31    /// Returns a reference to the embedded [`AbstractSurface`] base data.
32    fn abstract_surface(&self) -> &AbstractSurface;
33}
34
35/// Mutable companion to [`AsAbstractSurface`].
36pub trait AsAbstractSurfaceMut: AsAbstractSurface + AsAbstractGeometricPrimitiveMut {
37    /// Returns a mutable reference to the embedded [`AbstractSurface`] base data.
38    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);