use std::num::NonZero;
#[derive(Copy, Clone, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct NodeId(NonZero<u32>);
impl NodeId {
pub fn as_u32(self) -> u32 {
self.0.get() - 1
}
pub fn as_usize(self) -> usize {
self.as_u32() as usize
}
pub fn from_u32(value: u32) -> NodeId {
assert!(value <= i32::MAX as u32);
NodeId(unsafe {
NonZero::new_unchecked(value + 1)
})
}
}
impl std::fmt::Display for NodeId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.as_u32().fmt(f)
}
}
impl std::fmt::Debug for NodeId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "NodeId({})", self.as_u32())
}
}