egml_core/model/geometry/primitives/
abstract_ring.rs1use crate::model::geometry::primitives::{AbstractCurve, AsAbstractCurve, AsAbstractCurveMut};
2
3#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
8pub struct AbstractRing {
9 pub abstract_curve: AbstractCurve,
10}
11
12impl AbstractRing {
13 pub fn new() -> Self {
14 Self {
15 abstract_curve: AbstractCurve::default(),
16 }
17 }
18
19 pub fn from_abstract_curve(abstract_curve: AbstractCurve) -> Self {
20 Self { abstract_curve }
21 }
22}
23
24pub trait AsAbstractRing: AsAbstractCurve {
26 fn abstract_ring(&self) -> &AbstractRing;
28}
29
30pub trait AsAbstractRingMut: AsAbstractRing + AsAbstractCurveMut {
32 fn abstract_ring_mut(&mut self) -> &mut AbstractRing;
34}
35
36impl AsAbstractRing for AbstractRing {
37 fn abstract_ring(&self) -> &AbstractRing {
38 self
39 }
40}
41
42impl AsAbstractRingMut for AbstractRing {
43 fn abstract_ring_mut(&mut self) -> &mut AbstractRing {
44 self
45 }
46}
47
48#[macro_export]
49macro_rules! impl_abstract_ring_traits {
50 ($type:ty) => {
51 $crate::impl_abstract_curve_traits!($type);
52
53 impl $crate::model::geometry::primitives::AsAbstractCurve for $type {
54 fn abstract_curve(&self) -> &$crate::model::geometry::primitives::AbstractCurve {
55 &<$type as $crate::model::geometry::primitives::AsAbstractRing>::abstract_ring(self)
56 .abstract_curve
57 }
58 }
59 };
60}
61
62#[macro_export]
63macro_rules! impl_abstract_ring_mut_traits {
64 ($type:ty) => {
65 $crate::impl_abstract_curve_mut_traits!($type);
66
67 impl $crate::model::geometry::primitives::AsAbstractCurveMut for $type {
68 fn abstract_curve_mut(
69 &mut self,
70 ) -> &mut $crate::model::geometry::primitives::AbstractCurve {
71 &mut <$type as $crate::model::geometry::primitives::AsAbstractRingMut>::abstract_ring_mut(self)
72 .abstract_curve
73 }
74 }
75 };
76}
77
78impl_abstract_ring_traits!(AbstractRing);
79impl_abstract_ring_mut_traits!(AbstractRing);