egml_core/model/geometry/primitives/
abstract_curve.rs1use crate::model::geometry::primitives::{
2 AbstractGeometricPrimitive, AsAbstractGeometricPrimitive, AsAbstractGeometricPrimitiveMut,
3};
4#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
10pub struct AbstractCurve {
11 pub(crate) abstract_geometric_primitive: AbstractGeometricPrimitive,
12}
13
14impl AbstractCurve {
15 pub fn new(abstract_geometric_primitive: AbstractGeometricPrimitive) -> Self {
16 Self {
17 abstract_geometric_primitive,
18 }
19 }
20}
21
22pub trait AsAbstractCurve: AsAbstractGeometricPrimitive {
24 fn abstract_curve(&self) -> &AbstractCurve;
26}
27
28pub trait AsAbstractCurveMut: AsAbstractCurve + AsAbstractGeometricPrimitiveMut {
30 fn abstract_curve_mut(&mut self) -> &mut AbstractCurve;
32}
33
34impl AsAbstractCurve for AbstractCurve {
35 fn abstract_curve(&self) -> &AbstractCurve {
36 self
37 }
38}
39
40impl AsAbstractCurveMut for AbstractCurve {
41 fn abstract_curve_mut(&mut self) -> &mut AbstractCurve {
42 self
43 }
44}
45
46#[doc(hidden)]
47#[macro_export]
48macro_rules! impl_abstract_curve_traits {
49 ($type:ty) => {
50 $crate::impl_abstract_geometric_primitive_traits!($type);
51
52 impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitive for $type {
53 fn abstract_geometric_primitive(
54 &self,
55 ) -> &$crate::model::geometry::primitives::AbstractGeometricPrimitive {
56 use $crate::model::geometry::primitives::AsAbstractCurve;
57 &self.abstract_curve().abstract_geometric_primitive
58 }
59 }
60
61 impl $crate::model::geometry::primitives::AsAbstractGeometricPrimitiveMut for $type {
62 fn abstract_geometric_primitive_mut(
63 &mut self,
64 ) -> &mut $crate::model::geometry::primitives::AbstractGeometricPrimitive {
65 use $crate::model::geometry::primitives::AsAbstractCurveMut;
66 &mut self.abstract_curve_mut().abstract_geometric_primitive
67 }
68 }
69 };
70}
71
72impl_abstract_curve_traits!(AbstractCurve);