use super::{HalfEdgeId, SpacePlate};
pub(super) struct FaceWalk<'a> {
pub(super) plate: &'a SpacePlate,
pub(super) start: Option<HalfEdgeId>,
pub(super) cur: Option<HalfEdgeId>,
}
impl Iterator for FaceWalk<'_> {
type Item = HalfEdgeId;
fn next(&mut self) -> Option<HalfEdgeId> {
let start = self.start?;
let cur = match self.cur {
None => start,
Some(c) => {
let n = self.plate.half_edges[c.0 as usize].next;
if n == start {
return None;
}
n
}
};
self.cur = Some(cur);
Some(cur)
}
}
pub(super) struct VertexFan<'a> {
pub(super) plate: &'a SpacePlate,
pub(super) start: Option<HalfEdgeId>,
pub(super) cur: Option<HalfEdgeId>,
}
impl Iterator for VertexFan<'_> {
type Item = HalfEdgeId;
fn next(&mut self) -> Option<HalfEdgeId> {
let start = self.start?;
loop {
let cur = match self.cur {
None => start,
Some(c) => {
let twin = self.plate.half_edges[c.0 as usize].twin;
let n = self.plate.half_edges[twin.0 as usize].next;
if n == start {
return None;
}
n
}
};
self.cur = Some(cur);
if self.plate.half_edges[cur.0 as usize].alive {
return Some(cur);
}
if cur == start {
return None;
}
}
}
}