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 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
30pub trait AsAbstractCurve: AsAbstractGeometricPrimitive {
32 fn abstract_curve(&self) -> &AbstractCurve;
34}
35
36pub trait AsAbstractCurveMut: AsAbstractCurve + AsAbstractGeometricPrimitiveMut {
38 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);