brute_bits/
lib.rs

1/// generates `Vec<bool>`
2///
3/// ```ignore
4/// for bs in BruteBitsBuilder::new(3) {
5///    // bs iterate from [false, false, false] to [true, true, true]
6/// }
7/// ```
8#[derive(Debug, Copy, Clone)]
9pub struct BruteBitsBuilder {
10    size: usize,
11}
12
13impl BruteBitsBuilder {
14    pub fn new(n: usize) -> Self {
15        Self { size: n }
16    }
17}
18
19impl IntoIterator for BruteBitsBuilder {
20    type Item = Vec<bool>;
21    type IntoIter = BruteBits;
22    fn into_iter(self) -> Self::IntoIter {
23        BruteBits {
24            size: self.size,
25            current: 0,
26        }
27    }
28}
29
30/// light iterator
31#[derive(Copy, Clone, Debug)]
32pub struct BruteBits {
33    size: usize,
34    current: usize,
35}
36
37impl Iterator for BruteBits {
38    type Item = Vec<bool>;
39    fn next(&mut self) -> Option<Self::Item> {
40        if self.current == (1 << self.size) {
41            None
42        } else {
43            let mut res = vec![false; self.size];
44            for i in 0..self.size {
45                if (1 << i) & self.current != 0 {
46                    res[i] = true;
47                }
48            }
49            self.current += 1;
50            Some(res)
51        }
52    }
53}
54
55#[cfg(test)]
56mod test {
57    use super::BruteBitsBuilder;
58
59    #[test]
60    fn bs_iter() {
61        let mut bs = BruteBitsBuilder::new(3).into_iter();
62
63        assert_eq!(Some(vec![false, false, false]), dbg!(bs.next()));
64        assert_eq!(Some(vec![true, false, false]), dbg!(bs.next()));
65        assert_eq!(Some(vec![false, true, false]), dbg!(bs.next()));
66        assert_eq!(Some(vec![true, true, false]), dbg!(bs.next()));
67        assert_eq!(Some(vec![false, false, true]), dbg!(bs.next()));
68        assert_eq!(Some(vec![true, false, true]), dbg!(bs.next()));
69        assert_eq!(Some(vec![false, true, true]), dbg!(bs.next()));
70        assert_eq!(Some(vec![true, true, true]), dbg!(bs.next()));
71        assert_eq!(None, bs.next());
72    }
73}