use core::fmt;
use crate::{utils::types::TriIteratorIdx, VertexNode};
use super::{hedge_iterator::HedgeIterator, tri_data_structure::TriDataStructure};
pub struct TriIterator<'a> {
pub tds: &'a TriDataStructure,
pub idx: usize,
}
impl<'a> TriIterator<'a> {
pub const fn new(tds: &'a TriDataStructure, idx: TriIteratorIdx) -> Self {
Self { tds, idx }
}
pub const 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]
)
}
}