use core::mem;
#[cfg(target_pointer_width = "64")]
pub type Chunk = u64;
#[cfg(not(target_pointer_width = "64"))]
pub type Chunk = u32;
const SLOT_NUM_BITS: usize = mem::size_of::<Chunk>() * 8;
pub const INDEX_OFFSET: usize = SLOT_NUM_BITS;
#[inline]
pub fn lsb(chunk: Chunk) -> Option<u8> {
if chunk == 0 {
None
} else {
Some(chunk.trailing_zeros() as u8)
}
}
#[inline]
pub fn msb(chunk: Chunk) -> Option<u8> {
if chunk == 0 {
None
} else {
let bits = SLOT_NUM_BITS - 1;
Some((bits as u8) ^ chunk.leading_zeros() as u8)
}
}
#[inline]
pub fn pop_lsb(chunk: &mut Chunk) -> Option<u8> {
let lsb = lsb(*chunk)?;
*chunk ^= 1 << lsb;
Some(lsb)
}
#[inline]
pub fn pop_msb(chunk: &mut Chunk) -> Option<u8> {
let msb = msb(*chunk)?;
*chunk ^= 1 << msb;
Some(msb)
}