Skip to main content

egml_core/model/geometry/primitives/
abstract_curve.rs

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