#[repr(transparent)]
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
pub struct ParamIdx(pub u32);
impl ParamIdx {
#[inline]
pub fn from_usize(i: usize) -> Self {
debug_assert!(i <= u32::MAX as usize, "ParamIdx overflow");
Self(i as u32)
}
#[inline]
pub fn index(self) -> usize {
self.0 as usize
}
}
impl From<ParamIdx> for usize {
#[inline]
fn from(idx: ParamIdx) -> Self {
idx.0 as usize
}
}
impl std::fmt::Display for ParamIdx {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_usize_roundtrip() {
for i in [0usize, 1, 7, 64, 1024] {
let p = ParamIdx::from_usize(i);
assert_eq!(p.index(), i);
assert_eq!(usize::from(p), i);
}
}
#[test]
fn ord_matches_inner() {
assert!(ParamIdx(0) < ParamIdx(1));
assert!(ParamIdx(7) < ParamIdx(8));
}
#[test]
fn repr_transparent_means_size_eq_u32() {
assert_eq!(std::mem::size_of::<ParamIdx>(), std::mem::size_of::<u32>());
}
#[test]
fn display_format() {
assert_eq!(format!("{}", ParamIdx(42)), "42");
}
}