Skip to main content

egml_core/model/geometry/primitives/
abstract_ring.rs

1use crate::model::geometry::primitives::{AbstractCurve, AsAbstractCurve, AsAbstractCurveMut};
2
3/// Base data shared by all GML ring geometry types ([OGC 07-036 ยง10.5.6](https://docs.ogc.org/is/07-036/07-036.pdf)).
4///
5/// A ring is a closed curve used as the boundary of a surface patch.
6/// The only concrete ring type currently implemented is [`LinearRing`].
7#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
8pub struct AbstractRing {
9    pub abstract_curve: AbstractCurve,
10}
11
12impl AbstractRing {
13    pub fn new() -> Self {
14        Self {
15            abstract_curve: AbstractCurve::default(),
16        }
17    }
18
19    pub fn from_abstract_curve(abstract_curve: AbstractCurve) -> Self {
20        Self { abstract_curve }
21    }
22}
23
24/// Object-safe read accessor for [`AbstractRing`] fields.
25pub trait AsAbstractRing: AsAbstractCurve {
26    /// Returns a reference to the embedded [`AbstractRing`] base data.
27    fn abstract_ring(&self) -> &AbstractRing;
28}
29
30/// Mutable companion to [`AsAbstractRing`].
31pub trait AsAbstractRingMut: AsAbstractRing + AsAbstractCurveMut {
32    /// Returns a mutable reference to the embedded [`AbstractRing`] base data.
33    fn abstract_ring_mut(&mut self) -> &mut AbstractRing;
34}
35
36impl AsAbstractRing for AbstractRing {
37    fn abstract_ring(&self) -> &AbstractRing {
38        self
39    }
40}
41
42impl AsAbstractRingMut for AbstractRing {
43    fn abstract_ring_mut(&mut self) -> &mut AbstractRing {
44        self
45    }
46}
47
48#[macro_export]
49macro_rules! impl_abstract_ring_traits {
50    ($type:ty) => {
51        $crate::impl_abstract_curve_traits!($type);
52
53        impl $crate::model::geometry::primitives::AsAbstractCurve for $type {
54            fn abstract_curve(&self) -> &$crate::model::geometry::primitives::AbstractCurve {
55                &<$type as $crate::model::geometry::primitives::AsAbstractRing>::abstract_ring(self)
56                    .abstract_curve
57            }
58        }
59    };
60}
61
62#[macro_export]
63macro_rules! impl_abstract_ring_mut_traits {
64    ($type:ty) => {
65        $crate::impl_abstract_curve_mut_traits!($type);
66
67        impl $crate::model::geometry::primitives::AsAbstractCurveMut for $type {
68            fn abstract_curve_mut(
69                &mut self,
70            ) -> &mut $crate::model::geometry::primitives::AbstractCurve {
71                &mut <$type as $crate::model::geometry::primitives::AsAbstractRingMut>::abstract_ring_mut(self)
72                    .abstract_curve
73            }
74        }
75    };
76}
77
78impl_abstract_ring_traits!(AbstractRing);
79impl_abstract_ring_mut_traits!(AbstractRing);