use crate::model::geometry::primitives::{AbstractCurve, AsAbstractCurve, AsAbstractCurveMut};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
pub struct AbstractRing {
pub abstract_curve: AbstractCurve,
}
impl AbstractRing {
pub fn new() -> Self {
Self {
abstract_curve: AbstractCurve::default(),
}
}
pub fn from_abstract_curve(abstract_curve: AbstractCurve) -> Self {
Self { abstract_curve }
}
}
pub trait AsAbstractRing: AsAbstractCurve {
fn abstract_ring(&self) -> &AbstractRing;
}
pub trait AsAbstractRingMut: AsAbstractRing + AsAbstractCurveMut {
fn abstract_ring_mut(&mut self) -> &mut AbstractRing;
}
impl AsAbstractRing for AbstractRing {
fn abstract_ring(&self) -> &AbstractRing {
self
}
}
impl AsAbstractRingMut for AbstractRing {
fn abstract_ring_mut(&mut self) -> &mut AbstractRing {
self
}
}
#[macro_export]
macro_rules! impl_abstract_ring_traits {
($type:ty) => {
$crate::impl_abstract_curve_traits!($type);
impl $crate::model::geometry::primitives::AsAbstractCurve for $type {
fn abstract_curve(&self) -> &$crate::model::geometry::primitives::AbstractCurve {
&<$type as $crate::model::geometry::primitives::AsAbstractRing>::abstract_ring(self)
.abstract_curve
}
}
};
}
#[macro_export]
macro_rules! impl_abstract_ring_mut_traits {
($type:ty) => {
$crate::impl_abstract_curve_mut_traits!($type);
impl $crate::model::geometry::primitives::AsAbstractCurveMut for $type {
fn abstract_curve_mut(
&mut self,
) -> &mut $crate::model::geometry::primitives::AbstractCurve {
&mut <$type as $crate::model::geometry::primitives::AsAbstractRingMut>::abstract_ring_mut(self)
.abstract_curve
}
}
};
}
impl_abstract_ring_traits!(AbstractRing);
impl_abstract_ring_mut_traits!(AbstractRing);