#[derive(Default, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Bits32 {
bits: u32,
}
impl Bits32 {
pub const BIT_WIDTH: u32 = 32;
#[inline]
pub fn new(bits: u32) -> Self {
Bits32 { bits }
}
#[inline]
pub fn get(&self) -> u32 {
self.bits
}
#[inline]
pub fn push<T: Into<u32>>(&mut self, num_bits: u32, value: T) {
assert!(num_bits < Self::BIT_WIDTH);
self.bits <<= num_bits;
let mask = (1 << num_bits) - 1;
let value = value.into() & mask;
self.bits |= value;
}
#[inline]
pub fn push_bool(&mut self, value: bool) {
self.push(1, value)
}
#[inline]
pub fn pop(&mut self, num_bits: u32) -> u32 {
assert!(num_bits < Self::BIT_WIDTH);
let res = self.bits >> (Self::BIT_WIDTH - num_bits);
self.bits <<= num_bits;
res
}
#[inline]
pub fn pop_bool(&mut self) -> bool {
self.pop(1) != 0
}
}