reactive-signals 0.1.0-alpha.4

reactive-signals is a dx-first scope-based fine-grained reactive system.
Documentation
#[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);
}