#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Reserved<const BITS: u32, const ONES: bool>(u8);
pub type ReservedOnes<const BITS: u32> = Reserved<BITS, true>;
pub type ReservedZero<const BITS: u32> = Reserved<BITS, false>;
impl<const BITS: u32, const ONES: bool> Reserved<BITS, ONES> {
pub const MASK: u8 = {
assert!(BITS >= 1 && BITS <= 8, "Reserved is 1..=8 bits wide");
(0xFFu16 >> (8 - BITS)) as u8
};
pub const FILL: Self = Self(if ONES { Self::MASK } else { 0 });
#[must_use]
pub const fn from_bits(value: u8) -> Self {
Self(value & Self::MASK)
}
#[must_use]
pub const fn get(self) -> u8 {
self.0
}
}
impl<const BITS: u32, const ONES: bool> Default for Reserved<BITS, ONES> {
fn default() -> Self {
Self::FILL
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn defaults_are_the_spec_fill_and_values_are_masked() {
assert_eq!(ReservedOnes::<3>::default().get(), 0b111);
assert_eq!(ReservedOnes::<8>::default().get(), 0xFF);
assert_eq!(ReservedZero::<4>::default().get(), 0);
assert_eq!(ReservedOnes::<2>::from_bits(0xF5).get(), 0b01);
assert_eq!(ReservedZero::<1>::from_bits(0x03).get(), 1);
}
}