use word::Word;
pub trait UnsignedWord: Word {}
impl UnsignedWord for u8 {}
impl UnsignedWord for u16 {}
impl UnsignedWord for u32 {}
impl UnsignedWord for u64 {}
impl UnsignedWord for usize {}
pub trait FromWord<T> {
#[inline]
fn from(T) -> Self;
}
macro_rules! impl_from_word_from_to {
($From:ty, $To:ty) => (
impl FromWord<$From> for $To {
#[inline] fn from(x: $From) -> Self {
x as Self
}
}
)
}
macro_rules! impl_from_word_multiple {
($From:ty, $To:ty) => (
impl_from_word_from_to!($From, $To);
);
($From:ty, $To:ty $(, $Rest:ty)+) => (
impl_from_word_multiple!($From, $To);
impl_from_word_multiple!($From, $($Rest),*);
)
}
macro_rules! impl_from_word {
($From:ty) => (
impl_from_word_multiple!($From, i8, i16, i32, i64, isize,
u8, u16, u32, u64, usize);
)
}
impl_from_word!(i8);
impl_from_word!(i16);
impl_from_word!(i32);
impl_from_word!(i64);
impl_from_word!(isize);
impl_from_word!(u8);
impl_from_word!(u16);
impl_from_word!(u32);
impl_from_word!(u64);
impl_from_word!(usize);
impl<T: Word, U: Word> FromWord<T> for U {
#[inline]
default fn from(x: T) -> Self {
ToWord::to(x)
}
}
pub trait ToWord<T> {
#[inline]
fn to(self) -> T;
}
impl<T, U> ToWord<U> for T
where U: FromWord<T>
{
#[inline]
fn to(self) -> U {
U::from(self)
}
}