const_sized_bit_set/
bit_set_shiftable.rs

1use crate::{
2    bit_set_trait::BitSetTrait, BitSet128, BitSet16, BitSet32, BitSet64, BitSet8, SetElement,
3};
4
5pub trait BitSetShiftable: BitSetTrait {
6    /// Equivalent to `trailing_zeros`
7    fn t_zeros(&self) -> u32;
8
9    /// Equivalent to `trailing_ones`
10    fn t_ones(&self) -> u32;
11
12    /// Equivalent to `leading_zeros`
13    fn l_zeros(&self) -> u32;
14
15    /// Equivalent to `leading_ones`
16    fn l_ones(&self) -> u32;
17
18    /// Equivalent to >>=
19    /// Reduce the value of every element in the set by n, removing elements that are no longer in range
20    fn shift_right(&mut self, n: SetElement);
21
22    /// Equivalent to <<=
23    /// Increase the value of every element in the set by n, removing elements that are no longer in range
24    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);