#[derive(Copy, Clone, Default, Debug, Eq, PartialEq, Ord, PartialOrd)]
pub struct Word(u64);
#[derive(Copy, Clone, Default, Debug, Eq, PartialEq, Ord, PartialOrd)]
pub struct HalfWord(u32);
impl HalfWord {
pub const fn new(value: u32) -> Self {
Self(value)
}
pub const fn to_u32(&self) -> u32 { self.0 }
pub const fn to_u64(&self) -> u64 { self.0 as u64 }
}
impl Word {
pub const fn new(value: u64) -> Self {
Self(value)
}
pub const fn from_usize(value: usize) -> Self {
Self(value as u64)
}
pub const fn from_be_bytes(value: [u8; 8]) -> Self {
Self::new(u64::from_be_bytes(value))
}
pub const fn merge(top: HalfWord, bottom: HalfWord) -> Self {
Self(top.to_u64() << 32 | bottom.to_u64())
}
pub const fn to_u64(&self) -> u64 { self.0 }
pub const fn to_be_bytes(&self) -> [u8; 8] { self.0.to_be_bytes() }
pub const fn split(&self) -> [HalfWord; 2] {
let top = (self.0 >> 32) as u32;
let bottom = self.0 as u32;
[HalfWord(top), HalfWord(bottom)]
}
#[inline]
pub const fn pair(&self) -> (HalfWord, HalfWord) {
let [a, b] = self.split();
(a, b)
}
pub const fn top(&self) -> HalfWord {
let [top, _] = self.split();
top
}
pub const fn bottom(&self) -> HalfWord {
let [_, bottom] = self.split();
bottom
}
}
impl HalfWord {
pub const fn with(self, other: HalfWord) -> Word {
Word::merge(self, other)
}
}