1#[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#[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}