use super::{BackwardEdgeIterator, ForwardEdgeIterator, HalfEdgeImpl, HalfEdgeImplMeshType};
use crate::{
math::IndexType,
mesh::{EdgeBasics, HalfEdge, MeshBasics},
};
impl<T: HalfEdgeImplMeshType> EdgeBasics<T> for HalfEdgeImpl<T> {
#[inline(always)]
fn id(&self) -> T::E {
self.id
}
#[inline(always)]
fn origin<'a>(&'a self, mesh: &'a T::Mesh) -> &'a T::Vertex {
mesh.vertex(self.origin_id)
}
#[inline(always)]
fn target<'a>(&'a self, mesh: &'a T::Mesh) -> &'a T::Vertex {
mesh.vertex(self.next(mesh).origin_id())
}
#[inline(always)]
fn is_boundary(&self, mesh: &T::Mesh) -> bool {
self.is_boundary_self() || self.twin(mesh).is_boundary_self()
}
#[inline(always)]
fn payload(&self) -> &T::EP {
&self.payload
}
#[inline(always)]
fn payload_mut(&mut self) -> &mut T::EP {
&mut self.payload
}
#[inline(always)]
#[allow(refining_impl_trait)]
fn edges_face<'a>(&'a self, mesh: &'a T::Mesh) -> ForwardEdgeIterator<'a, T> {
ForwardEdgeIterator::new(self.clone(), mesh)
}
#[inline(always)]
#[allow(refining_impl_trait)]
fn edges_face_back<'a>(&'a self, mesh: &'a T::Mesh) -> BackwardEdgeIterator<'a, T> {
BackwardEdgeIterator::new(self.clone(), mesh)
}
#[inline(always)]
fn face_ids<'a>(&'a self, mesh: &'a T::Mesh) -> impl Iterator<Item = T::F> {
let mut res = Vec::new();
let id = self.face_id();
if id != IndexType::max() {
res.push(id);
}
let twin = self.twin(mesh);
let id = twin.face_id();
if id != IndexType::max() {
res.push(id);
}
res.into_iter()
}
}