use smallvec::SmallVec;
use vslab::{new_type_id, Slab};
use crate::face::FaceKey;
new_type_id!(HalfEdgeKey);
pub(crate) type EdgeMap = Slab<HalfEdgeKey, HalfEdge>;
pub(crate) type EdgeIndexSmallVec = SmallVec<[HalfEdgeKey; 32]>;
#[derive(Debug)]
pub struct HalfEdge {
pub origin: usize,
pub destination: usize,
twin: Option<HalfEdgeKey>,
owner_face: Option<FaceKey>,
prev: Option<HalfEdgeKey>,
next: Option<HalfEdgeKey>,
pub(crate) visited: bool,
}
impl HalfEdge {
#[inline]
pub(crate) fn new(origin: usize, destination: usize) -> Self {
Self {
origin,
destination,
twin: None,
owner_face: None,
prev: None,
next: None,
visited: false,
}
}
#[inline]
pub(crate) fn twin(&self) -> HalfEdgeKey {
self.twin.expect("twin must be set")
}
#[inline]
pub(crate) fn set_twin(&mut self, twin: HalfEdgeKey) {
self.twin = Some(twin);
}
#[inline]
pub(crate) fn owner_face(&self) -> FaceKey {
self.owner_face.expect("owner_face must be set")
}
#[inline]
pub(crate) fn set_owner_face(&mut self, owner_face: FaceKey) {
self.owner_face = Some(owner_face);
}
#[inline]
pub(crate) fn prev(&self) -> HalfEdgeKey {
self.prev.expect("prev must be set")
}
#[inline]
pub(crate) fn set_prev(&mut self, prev: HalfEdgeKey) {
self.prev = Some(prev);
}
#[inline]
pub(crate) fn next(&self) -> HalfEdgeKey {
self.next.expect("next must be set")
}
#[inline]
pub(crate) fn set_next(&mut self, next: HalfEdgeKey) {
self.next = Some(next);
}
}