#[derive(Debug)]
pub struct FlagVec(pub(super) Vec<u32>);
const BITS: usize = u32::BITS as usize;
impl FlagVec {
#[inline]
pub fn with_size(size: usize) -> Self {
Self(vec![0; size / BITS + 1])
}
#[inline]
pub(crate) fn set(&mut self, index: usize) {
let slot = index / BITS;
let idx = index % BITS;
self.0[slot] |= OR_MASK[idx];
}
#[inline]
pub fn get(&self, index: usize) -> bool {
let slot = index / BITS;
let idx = index % BITS;
(self.0[slot] & AND_MASK[idx]) != 0
}
}
const OR_MASK: [u32; 32] = [
0b1000_0000_0000_0000_0000_0000_0000_0000,
0b0100_0000_0000_0000_0000_0000_0000_0000,
0b0010_0000_0000_0000_0000_0000_0000_0000,
0b0001_0000_0000_0000_0000_0000_0000_0000,
0b0000_1000_0000_0000_0000_0000_0000_0000,
0b0000_0100_0000_0000_0000_0000_0000_0000,
0b0000_0010_0000_0000_0000_0000_0000_0000,
0b0000_0001_0000_0000_0000_0000_0000_0000,
0b0000_0000_1000_0000_0000_0000_0000_0000,
0b0000_0000_0100_0000_0000_0000_0000_0000,
0b0000_0000_0010_0000_0000_0000_0000_0000,
0b0000_0000_0001_0000_0000_0000_0000_0000,
0b0000_0000_0000_1000_0000_0000_0000_0000,
0b0000_0000_0000_0100_0000_0000_0000_0000,
0b0000_0000_0000_0010_0000_0000_0000_0000,
0b0000_0000_0000_0001_0000_0000_0000_0000,
0b0000_0000_0000_0000_1000_0000_0000_0000,
0b0000_0000_0000_0000_0100_0000_0000_0000,
0b0000_0000_0000_0000_0010_0000_0000_0000,
0b0000_0000_0000_0000_0001_0000_0000_0000,
0b0000_0000_0000_0000_0000_1000_0000_0000,
0b0000_0000_0000_0000_0000_0100_0000_0000,
0b0000_0000_0000_0000_0000_0010_0000_0000,
0b0000_0000_0000_0000_0000_0001_0000_0000,
0b0000_0000_0000_0000_0000_0000_1000_0000,
0b0000_0000_0000_0000_0000_0000_0100_0000,
0b0000_0000_0000_0000_0000_0000_0010_0000,
0b0000_0000_0000_0000_0000_0000_0001_0000,
0b0000_0000_0000_0000_0000_0000_0000_1000,
0b0000_0000_0000_0000_0000_0000_0000_0100,
0b0000_0000_0000_0000_0000_0000_0000_0010,
0b0000_0000_0000_0000_0000_0000_0000_0001,
];
const AND_MASK: [u32; 32] = [
0b0111_1111_1111_1111_1111_1111_1111_1111,
0b1011_1111_1111_1111_1111_1111_1111_1111,
0b1101_1111_1111_1111_1111_1111_1111_1111,
0b1110_1111_1111_1111_1111_1111_1111_1111,
0b1111_0111_1111_1111_1111_1111_1111_1111,
0b1111_1011_1111_1111_1111_1111_1111_1111,
0b1111_1101_1111_1111_1111_1111_1111_1111,
0b1111_1110_1111_1111_1111_1111_1111_1111,
0b1111_1111_0111_1111_1111_1111_1111_1111,
0b1111_1111_1011_1111_1111_1111_1111_1111,
0b1111_1111_1101_1111_1111_1111_1111_1111,
0b1111_1111_1110_1111_1111_1111_1111_1111,
0b1111_1111_1111_0111_1111_1111_1111_1111,
0b1111_1111_1111_1011_1111_1111_1111_1111,
0b1111_1111_1111_1101_1111_1111_1111_1111,
0b1111_1111_1111_1110_1111_1111_1111_1111,
0b1111_1111_1111_1111_0111_1111_1111_1111,
0b1111_1111_1111_1111_1011_1111_1111_1111,
0b1111_1111_1111_1111_1101_1111_1111_1111,
0b1111_1111_1111_1111_1110_1111_1111_1111,
0b1111_1111_1111_1111_1111_0111_1111_1111,
0b1111_1111_1111_1111_1111_1011_1111_1111,
0b1111_1111_1111_1111_1111_1101_1111_1111,
0b1111_1111_1111_1111_1111_1110_1111_1111,
0b1111_1111_1111_1111_1111_1111_0111_1111,
0b1111_1111_1111_1111_1111_1111_1011_1111,
0b1111_1111_1111_1111_1111_1111_1101_1111,
0b1111_1111_1111_1111_1111_1111_1110_1111,
0b1111_1111_1111_1111_1111_1111_1111_0111,
0b1111_1111_1111_1111_1111_1111_1111_1011,
0b1111_1111_1111_1111_1111_1111_1111_1101,
0b1111_1111_1111_1111_1111_1111_1111_1110,
];
#[test]
fn test_flagvec() {
let mut v = FlagVec::with_size(62);
v.set(0);
assert_eq!(v.0[0], 0b1000_0000_0000_0000_0000_0000_0000_0000);
v.set(31);
assert_eq!(v.0[0], 0b1000_0000_0000_0000_0000_0000_0000_0001);
v.set(32);
assert_eq!(v.0[0], 0b1000_0000_0000_0000_0000_0000_0000_0001);
assert_eq!(v.0[1], 0b1000_0000_0000_0000_0000_0000_0000_0000);
v.set(38);
assert_eq!(v.0[1], 0b1000_0010_0000_0000_0000_0000_0000_0000);
v.set(62);
assert_eq!(v.0[1], 0b1000_0010_0000_0000_0000_0000_0000_0010);
}