Skip to main content

egml_core/model/geometry/primitives/
abstract_ring.rs

1use crate::model::geometry::primitives::{AbstractCurve, AsAbstractCurve, AsAbstractCurveMut};
2/// 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)).
3///
4/// A ring is a closed curve used as the boundary of a surface patch.
5/// The only concrete ring type currently implemented is [`LinearRing`].
6#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
7pub struct AbstractRing {
8    pub(crate) abstract_curve: AbstractCurve,
9}
10
11impl AbstractRing {
12    pub fn new(abstract_curve: AbstractCurve) -> Self {
13        Self { abstract_curve }
14    }
15}
16
17/// Object-safe read accessor for [`AbstractRing`] fields.
18pub trait AsAbstractRing: AsAbstractCurve {
19    /// Returns a reference to the embedded [`AbstractRing`] base data.
20    fn abstract_ring(&self) -> &AbstractRing;
21}
22
23/// Mutable companion to [`AsAbstractRing`].
24pub trait AsAbstractRingMut: AsAbstractRing + AsAbstractCurveMut {
25    /// Returns a mutable reference to the embedded [`AbstractRing`] base data.
26    fn abstract_ring_mut(&mut self) -> &mut AbstractRing;
27}
28
29impl AsAbstractRing for AbstractRing {
30    fn abstract_ring(&self) -> &AbstractRing {
31        self
32    }
33}
34
35impl AsAbstractRingMut for AbstractRing {
36    fn abstract_ring_mut(&mut self) -> &mut AbstractRing {
37        self
38    }
39}
40
41#[doc(hidden)]
42#[macro_export]
43macro_rules! impl_abstract_ring_traits {
44    ($type:ty) => {
45        $crate::impl_abstract_curve_traits!($type);
46
47        impl $crate::model::geometry::primitives::AsAbstractCurve for $type {
48            fn abstract_curve(&self) -> &$crate::model::geometry::primitives::AbstractCurve {
49                use $crate::model::geometry::primitives::AsAbstractRing;
50                &self.abstract_ring().abstract_curve
51            }
52        }
53
54        impl $crate::model::geometry::primitives::AsAbstractCurveMut for $type {
55            fn abstract_curve_mut(
56                &mut self,
57            ) -> &mut $crate::model::geometry::primitives::AbstractCurve {
58                use $crate::model::geometry::primitives::AsAbstractRingMut;
59                &mut self.abstract_ring_mut().abstract_curve
60            }
61        }
62    };
63}
64
65impl_abstract_ring_traits!(AbstractRing);