toolbox_rs/
one_iterator.rs1pub 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 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}