tonlib_core/cell/
level_mask.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
2pub struct LevelMask {
3    mask: u32,
4}
5
6impl LevelMask {
7    pub fn new(new_mask: u32) -> Self {
8        Self { mask: new_mask }
9    }
10
11    pub fn mask(&self) -> u32 {
12        self.mask
13    }
14
15    pub fn level(&self) -> u8 {
16        32 - self.mask.leading_zeros() as u8
17    }
18
19    pub fn hash_index(&self) -> usize {
20        self.mask.count_ones() as usize
21    }
22
23    pub fn hash_count(&self) -> usize {
24        self.hash_index() + 1
25    }
26
27    pub fn apply(&self, level: u8) -> Self {
28        LevelMask {
29            mask: self.mask & ((1u32 << level) - 1),
30        }
31    }
32
33    pub fn apply_or(&self, other: Self) -> Self {
34        LevelMask {
35            mask: self.mask | other.mask,
36        }
37    }
38
39    pub fn shift_right(&self) -> Self {
40        LevelMask {
41            mask: self.mask >> 1,
42        }
43    }
44
45    pub fn is_significant(&self, level: u8) -> bool {
46        level == 0 || !(self.mask >> (level - 1)).is_multiple_of(2)
47    }
48}