#[derive(Debug)]
pub(super) struct Masks {
pub index_update: Vec<u8>,
pub index_iterate: Vec<u8>,
pub data_iterate: Vec<u8>,
pub data_update: Vec<u8>,
pub map_parent_right: Vec<u8>,
pub map_parent_left: Vec<u8>,
pub next_data_0_bit: Vec<i16>,
pub next_index_0_bit: Vec<i16>,
pub total_1_bits: Vec<u8>,
}
impl Masks {
pub fn new() -> Self {
let index_update = vec![
0b00_11_11_11, 0b11_00_11_11, 0b11_11_00_11, 0b11_11_11_00, ];
let index_iterate = vec![
0b00_00_00_00, 0b11_00_00_00, 0b11_11_00_00, 0b11_11_11_00, ];
let data_iterate = vec![
0b00_00_00_00, 0b10_00_00_00, 0b11_00_00_00, 0b11_10_00_00, 0b11_11_00_00, 0b11_11_10_00, 0b11_11_11_00, 0b11_11_11_10, 0b11_11_11_11, ];
let data_update = vec![
0b01_11_11_11, 0b10_11_11_11, 0b11_01_11_11, 0b11_10_11_11, 0b11_11_01_11, 0b11_11_10_11, 0b11_11_11_01, 0b11_11_11_10, ];
let mut map_parent_right = vec![0; 256];
let mut map_parent_left = vec![0; 256];
for i in 0..256 {
let a = (i & (15 << 4)) >> 4;
let b = i & 15;
let left = if a == 15 {
3
} else if a == 0 {
0
} else {
1
};
let right = if b == 15 {
3
} else if b == 0 {
0
} else {
1
};
map_parent_right[i] = left | right;
map_parent_left[i] = map_parent_right[i] << 4;
}
let total_1_bits: Vec<_> = (0..256).map(|n| (n as u8).count_ones() as u8).collect();
let mut next_data_0_bit: Vec<_> = (0..256)
.map(|n| (!n as u8).leading_zeros() as i16)
.collect();
next_data_0_bit[255] = -1;
let mut next_index_0_bit: Vec<_> = next_data_0_bit.iter().map(|n| n / 2).collect();
next_index_0_bit[255] = -1;
Self {
index_update,
index_iterate,
data_iterate,
data_update,
map_parent_right,
map_parent_left,
next_data_0_bit,
next_index_0_bit,
total_1_bits,
}
}
}