use crate::{Line, Point, Rectangle};
use std::marker::PhantomData;
mod convert;
mod projection;
#[cfg(feature = "rand")]
mod random;
#[cfg(feature = "wolfram-expr")]
mod wolfram;
pub trait Shape2D {
type Value;
type VertexIterator<'a>: Iterator<Item = Point<Self::Value>>
where
Self: 'a;
type LineIterator<'a>: Iterator<Item = Line<Self::Value>>
where
Self: 'a;
fn is_valid(&self) -> bool;
fn normalize(&mut self) -> bool {
self.is_valid()
}
fn boundary(&self) -> Rectangle<Self::Value>;
fn vertices<'a>(&'a self, sample: usize) -> Self::VertexIterator<'a>;
fn edges<'a>(&'a self, sample: usize) -> Self::LineIterator<'a>;
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PlaceHolderNodeIterator<T> {
place_holder: PhantomData<T>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PlaceHolderEdgeIterator<T> {
place_holder: PhantomData<T>,
}
impl<T> Iterator for PlaceHolderNodeIterator<T> {
type Item = Point<T>;
fn next(&mut self) -> Option<Self::Item> {
None
}
}
impl<T> Iterator for PlaceHolderEdgeIterator<T> {
type Item = Line<T>;
fn next(&mut self) -> Option<Self::Item> {
None
}
}