use super::{CellIndex, Diagram, EdgeIndex, VertexIndex};
use smallvec::SmallVec;
use std::iter::Map;
use std::ops::Range;
impl Diagram {
pub fn decoupled_edges_iter(&self) -> Map<Range<u32>, fn(u32) -> EdgeIndex> {
(0..(self.edges_.len() as u32)).map(EdgeIndex)
}
pub fn decoupled_cells_iter(&self) -> Map<Range<u32>, fn(u32) -> CellIndex> {
(0..(self.cells_.len() as u32)).map(CellIndex)
}
pub fn decoupled_vertices_iter(&self) -> Map<Range<u32>, fn(u32) -> VertexIndex> {
(0..(self.vertices_.len() as u32)).map(VertexIndex)
}
#[inline(always)]
pub fn cell_edge_iterator(&self, cell_id: CellIndex) -> EdgeNextIterator<'_> {
EdgeNextIterator::<'_>::new(self, self.cell_get_incident_edge_(cell_id))
}
#[inline]
pub fn edge_rot_next_iterator(&self, edge_id: EdgeIndex) -> EdgeRotNextIterator<'_> {
EdgeRotNextIterator::new(self, edge_id)
}
#[inline]
pub fn edge_rot_next_edges(&self, edge_id: EdgeIndex) -> SmallVec<[EdgeIndex; 6]> {
self.edge_rot_next_iterator(edge_id).collect()
}
#[inline]
pub fn edge_rot_prev_iterator(&self, edge_id: EdgeIndex) -> EdgeRotPrevIterator<'_> {
EdgeRotPrevIterator::new(self, Some(edge_id))
}
}
pub struct EdgeNextIterator<'s> {
diagram_: &'s Diagram,
start_edge_: EdgeIndex,
next_edge_: Option<EdgeIndex>,
}
impl<'s> EdgeNextIterator<'s> {
pub(crate) fn new(diagram: &'s Diagram, starting_edge: Option<EdgeIndex>) -> Self {
if let Some(starting_edge) = starting_edge {
Self {
diagram_: diagram,
start_edge_: starting_edge,
next_edge_: Some(starting_edge),
}
} else {
Self {
diagram_: diagram,
start_edge_: EdgeIndex(0),
next_edge_: None,
}
}
}
}
impl Iterator for EdgeNextIterator<'_> {
type Item = EdgeIndex;
#[inline(always)]
fn next(&mut self) -> Option<EdgeIndex> {
let rv = self.next_edge_?;
self.next_edge_ = self
.diagram_
.edge_get_next_(rv)
.filter(|&nne| nne != self.start_edge_);
Some(rv)
}
}
pub struct EdgeRotNextIterator<'s> {
diagram_: &'s Diagram,
start_edge: EdgeIndex,
next_edge: Option<EdgeIndex>,
}
impl<'s> EdgeRotNextIterator<'s> {
pub(crate) fn new(diagram: &'s Diagram, starting_edge: EdgeIndex) -> Self {
Self {
diagram_: diagram,
start_edge: starting_edge,
next_edge: Some(starting_edge),
}
}
}
impl Iterator for EdgeRotNextIterator<'_> {
type Item = EdgeIndex;
#[inline(always)]
fn next(&mut self) -> Option<EdgeIndex> {
let rv = self.next_edge?;
self.next_edge = self
.diagram_
.edge_rot_next(rv)
.filter(|&nne| nne != self.start_edge);
Some(rv)
}
}
pub struct EdgeRotPrevIterator<'s> {
diagram_: &'s Diagram,
start_edge: EdgeIndex,
next_edge: Option<EdgeIndex>,
}
impl<'s> EdgeRotPrevIterator<'s> {
pub(crate) fn new(diagram: &'s Diagram, starting_edge: Option<EdgeIndex>) -> Self {
if let Some(starting_edge) = starting_edge {
Self {
diagram_: diagram,
start_edge: starting_edge,
next_edge: Some(starting_edge),
}
} else {
Self {
diagram_: diagram,
start_edge: EdgeIndex(0),
next_edge: None,
}
}
}
}
impl Iterator for EdgeRotPrevIterator<'_> {
type Item = EdgeIndex;
#[inline(always)]
fn next(&mut self) -> Option<EdgeIndex> {
let rv = self.next_edge?;
self.next_edge = self
.diagram_
.edge_rot_prev(rv)
.filter(|&nne| nne != self.start_edge);
Some(rv)
}
}