const_sized_bit_set/
bit_set_shiftable.rs1use crate::{
2 bit_set_trait::BitSetTrait, BitSet128, BitSet16, BitSet32, BitSet64, BitSet8, SetElement,
3};
4
5pub trait BitSetShiftable: BitSetTrait {
6 fn t_zeros(&self) -> u32;
8
9 fn t_ones(&self) -> u32;
11
12 fn l_zeros(&self) -> u32;
14
15 fn l_ones(&self) -> u32;
17
18 fn shift_right(&mut self, n: SetElement);
21
22 fn shift_left(&mut self, n: SetElement);
25}
26
27macro_rules! impl_bit_set_shiftable {
28 ($name:ident) => {
29 impl BitSetShiftable for $name {
30 fn t_zeros(&self) -> u32 {
31 self.inner().trailing_zeros()
32 }
33
34 fn t_ones(&self) -> u32 {
35 self.inner().trailing_ones()
36 }
37
38 fn l_zeros(&self) -> u32 {
39 self.inner().leading_zeros()
40 }
41
42 fn l_ones(&self) -> u32 {
43 self.inner().leading_ones()
44 }
45
46 fn shift_right(&mut self, n: SetElement) {
47 *self = Self::from_inner(self.inner() >> n)
48 }
49
50 fn shift_left(&mut self, n: SetElement) {
51 *self = Self::from_inner(self.inner() << n)
52 }
53 }
54 };
55}
56
57impl_bit_set_shiftable!(BitSet8);
58impl_bit_set_shiftable!(BitSet16);
59impl_bit_set_shiftable!(BitSet32);
60impl_bit_set_shiftable!(BitSet64);
61impl_bit_set_shiftable!(BitSet128);