use std::fmt::Debug;
pub trait ElementType : Copy + Debug + Eq {
#[inline]
fn from_usize(usize) -> Option<Self>;
#[inline]
fn to_usize(self) -> usize;
}
impl ElementType for usize {
fn from_usize(n: usize) -> Option<usize> { Some(n) }
fn to_usize(self) -> usize { self }
}
macro_rules! element_type_impl {
($type_:ident) => {
impl ElementType for $type_ {
#[inline]
fn from_usize(u: usize) -> Option<Self> {
let result = u as $type_;
if result as usize == u { Some(result) } else { None }
}
#[inline]
fn to_usize(self) -> usize {
self as usize
}
}
}
}
element_type_impl!(u8);
element_type_impl!(u16);
element_type_impl!(u32);