use slotmap::new_key_type;
new_key_type! {
pub struct VertexId;
pub struct HalfEdgeId;
pub struct FaceId;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct EdgeId(pub(crate) HalfEdgeId);
impl EdgeId {
pub fn halfedge(self) -> HalfEdgeId {
self.0
}
pub fn vertices(&self, mesh: &crate::storage::MeshStorage) -> Option<(VertexId, VertexId)> {
let he = mesh.get_halfedge(self.0)?;
let dst = he.vertex;
let src = mesh.get_halfedge(he.twin?)?.vertex;
Some((src, dst))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ids_are_copy_and_defaultable() {
let v: VertexId = VertexId::default();
let h: HalfEdgeId = HalfEdgeId::default();
let f: FaceId = FaceId::default();
let v2 = v;
let h2 = h;
let f2 = f;
assert_eq!(v, v2);
assert_eq!(h, h2);
assert_eq!(f, f2);
assert!(v <= v2);
}
#[test]
fn ids_have_distinct_types() {
let _v: VertexId = VertexId::default();
let _h: HalfEdgeId = HalfEdgeId::default();
let _f: FaceId = FaceId::default();
}
}