#[ cfg (doc) ]
use super::*;
pub trait BitVecEncoding <Item> {
const BITS: u32;
const MASK: usize = (1 << Self::BITS) - 1;
fn encode (item: Item) -> usize;
fn decode (bits: usize) -> Item;
#[ inline ]
#[ must_use ]
fn get_bit_shift (bit_idx: u32) -> u32 {
usize::BITS - bit_idx - Self::BITS
}
#[ inline ]
#[ must_use ]
fn item_to_word (item_enc: usize, bit_idx: u32) -> usize {
item_enc << Self::get_bit_shift (bit_idx)
}
#[ inline ]
#[ must_use ]
fn word_to_item (word_val: usize, bit_idx: u32) -> usize {
word_val >> Self::get_bit_shift (bit_idx)
}
}
#[ derive (Clone, Debug, Eq, PartialEq) ]
pub struct BitVecEncodingDefault;
impl <Item> BitVecEncoding <Item> for BitVecEncodingDefault where Item: BitVecNative {
const BITS: u32 = Item::BITS;
const MASK: usize = (1 << Item::BITS) - 1;
#[ inline ]
fn encode (item: Item) -> usize { Item::encode (item) }
#[ inline ]
fn decode (bits: usize) -> Item { Item::decode (bits) }
}
pub trait BitVecNative {
const BITS: u32;
fn encode (self) -> usize;
fn decode (encoded: usize) -> Self;
}
impl BitVecNative for bool {
const BITS: u32 = 1;
#[ inline ]
fn encode (self) -> usize {
usize::from (self)
}
#[ inline ]
fn decode (encoded: usize) -> Self {
encoded != 0
}
}