egml_core/model/geometry/primitives/
abstract_ring.rs1use crate::model::geometry::primitives::{AbstractCurve, AsAbstractCurve, AsAbstractCurveMut};
2#[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
17pub trait AsAbstractRing: AsAbstractCurve {
19 fn abstract_ring(&self) -> &AbstractRing;
21}
22
23pub trait AsAbstractRingMut: AsAbstractRing + AsAbstractCurveMut {
25 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);