toolbox_rs/
one_iterator.rs

1// iterate the indices of the ones in the binary representation of a u32 integer
2pub struct OneIterator {
3    value: u32,
4}
5
6impl Iterator for OneIterator {
7    type Item = u32;
8
9    fn next(&mut self) -> Option<Self::Item> {
10        if self.value == 0 {
11            return None;
12        }
13        let first_bit = 31 - self.value.leading_zeros();
14        self.value ^= 1 << first_bit;
15        Some(first_bit)
16    }
17}
18
19impl From<u32> for OneIterator {
20    fn from(value: u32) -> Self {
21        OneIterator { value }
22    }
23}
24
25pub trait OneIter {
26    /// Instantiate a OneIterator for the underlying object
27    fn one_iter(&self) -> OneIterator;
28}
29
30impl OneIter for u32 {
31    fn one_iter(&self) -> OneIterator {
32        OneIterator::from(*self)
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use crate::one_iterator::{OneIter, OneIterator};
39
40    #[test]
41    fn iterate_ones_from() {
42        let count = OneIterator::from(0xFFFFFFFF).count();
43        assert_eq!(32, count);
44        let indices: Vec<u32> = OneIterator::from(0xFFFFFFFF).collect();
45        assert_eq!(
46            indices,
47            vec![
48                31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11,
49                10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
50            ]
51        );
52        let indices: Vec<u32> = OneIterator::from(0x44104085).collect();
53        assert_eq!(indices, vec![30, 26, 20, 14, 7, 2, 0]);
54    }
55
56    #[test]
57    fn iterate_ones_one_iter() {
58        let count = 0xFFFFFFFF.one_iter().count();
59        assert_eq!(32, count);
60        let indices: Vec<u32> = 0xFFFFFFFF.one_iter().collect();
61        assert_eq!(
62            indices,
63            vec![
64                31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11,
65                10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
66            ]
67        );
68        let indices: Vec<u32> = 0x44104085.one_iter().collect();
69        assert_eq!(indices, vec![30, 26, 20, 14, 7, 2, 0]);
70    }
71
72    #[test]
73    fn iterate_zero() {
74        let mut iter = 0.one_iter();
75        assert_eq!(None, iter.next());
76    }
77}