use crate::model::geometry::{AbstractGeometry, AsAbstractGeometry, AsAbstractGeometryMut};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
pub struct AbstractGeometricPrimitive {
pub abstract_geometry: AbstractGeometry,
}
impl AbstractGeometricPrimitive {
pub fn new() -> Self {
Self {
abstract_geometry: AbstractGeometry::default(),
}
}
pub fn from_abstract_geometry(abstract_geometry: AbstractGeometry) -> Self {
Self { abstract_geometry }
}
}
pub trait AsAbstractGeometricPrimitive: AsAbstractGeometry {
fn abstract_geometric_primitive(&self) -> &AbstractGeometricPrimitive;
}
pub trait AsAbstractGeometricPrimitiveMut:
AsAbstractGeometricPrimitive + AsAbstractGeometryMut
{
fn abstract_geometric_primitive_mut(&mut self) -> &mut AbstractGeometricPrimitive;
}
impl AsAbstractGeometricPrimitive for AbstractGeometricPrimitive {
fn abstract_geometric_primitive(&self) -> &AbstractGeometricPrimitive {
self
}
}
impl AsAbstractGeometricPrimitiveMut for AbstractGeometricPrimitive {
fn abstract_geometric_primitive_mut(&mut self) -> &mut AbstractGeometricPrimitive {
self
}
}
#[macro_export]
macro_rules! impl_abstract_geometric_primitive_traits {
($type:ty) => {
$crate::impl_abstract_geometry_traits!($type);
impl $crate::model::geometry::AsAbstractGeometry for $type {
fn abstract_geometry(&self) -> &$crate::model::geometry::AbstractGeometry {
&<$type as $crate::model::geometry::primitives::AsAbstractGeometricPrimitive>::abstract_geometric_primitive(self)
.abstract_geometry
}
}
};
}
#[macro_export]
macro_rules! impl_abstract_geometric_primitive_mut_traits {
($type:ty) => {
$crate::impl_abstract_geometry_mut_traits!($type);
impl $crate::model::geometry::AsAbstractGeometryMut for $type {
fn abstract_geometry_mut(&mut self) -> &mut $crate::model::geometry::AbstractGeometry {
&mut <$type as $crate::model::geometry::primitives::AsAbstractGeometricPrimitiveMut>::abstract_geometric_primitive_mut(self)
.abstract_geometry
}
}
};
}
impl_abstract_geometric_primitive_traits!(AbstractGeometricPrimitive);
impl_abstract_geometric_primitive_mut_traits!(AbstractGeometricPrimitive);