use core::fmt;
use crate::utils::types::TriIteratorIdx;
use super::{
hedge_iterator::HedgeIterator, node::VertexNode, tri_data_structure::TriDataStructure,
};
pub struct TriIterator<'a> {
pub tds: &'a TriDataStructure,
pub idx: usize,
}
impl<'a> TriIterator<'a> {
pub fn new(tds: &'a TriDataStructure, idx: TriIteratorIdx) -> Self {
Self { tds, idx }
}
pub fn idx(&self) -> TriIteratorIdx {
self.idx
}
pub fn hedges(&self) -> [HedgeIterator<'a>; 3] {
[
HedgeIterator::new(self.tds, self.idx * 3),
HedgeIterator::new(self.tds, self.idx * 3 + 1),
HedgeIterator::new(self.tds, self.idx * 3 + 2),
]
}
pub fn is_casual(&self) -> bool {
!self.is_conceptual()
}
pub fn is_conceptual(&self) -> bool {
self.hedges()
.iter()
.any(|hedge| hedge.starting_node().is_conceptual())
}
pub fn is_deleted(&self) -> bool {
self.hedges()
.iter()
.any(|hedge| hedge.starting_node().is_deleted())
}
pub fn nodes(&self) -> [VertexNode; 3] {
[
self.tds.hedge_starting_nodes[self.idx() * 3],
self.tds.hedge_starting_nodes[self.idx() * 3 + 1],
self.tds.hedge_starting_nodes[self.idx() * 3 + 2],
]
}
}
impl fmt::Display for TriIterator<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"Triangle {}: {} -> {} -> {}",
self.idx(),
self.nodes()[0],
self.nodes()[1],
self.nodes()[2]
)
}
}