use rkyv::Archive;
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
Archive,
rkyv::Serialize,
rkyv::Deserialize,
)]
#[rkyv(derive(Hash, Eq, PartialEq, PartialOrd, Ord))]
pub struct RuleId(usize);
impl RuleId {
pub const NONE: Self = Self(usize::MAX);
pub const fn new(raw: usize) -> Self {
assert!(
raw != usize::MAX,
"RuleId::new(usize::MAX) is reserved for RuleId::NONE"
);
Self(raw)
}
pub const fn raw(self) -> usize {
self.0
}
pub const fn is_valid(self) -> bool {
self.0 != usize::MAX
}
pub const fn is_none(self) -> bool {
self.0 == usize::MAX
}
}
impl From<RuleId> for usize {
fn from(value: RuleId) -> Self {
value.0
}
}
impl std::fmt::Display for RuleId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.is_none() {
write!(f, "RuleId::NONE")
} else {
write!(f, "RuleId({})", self.0)
}
}
}