1#[derive(Debug)]
3pub struct BitIteratorBE<Slice: AsRef<[u64]>> {
4 s: Slice,
5 n: usize,
6}
7
8impl<Slice: AsRef<[u64]>> BitIteratorBE<Slice> {
9 pub fn new(s: Slice) -> Self {
10 let n = s.as_ref().len() * 64;
11 Self { s, n }
12 }
13
14 pub fn without_leading_zeros(s: Slice) -> impl Iterator<Item = bool> {
17 Self::new(s).skip_while(|b| !b)
18 }
19}
20
21impl<Slice: AsRef<[u64]>> Iterator for BitIteratorBE<Slice> {
22 type Item = bool;
23
24 fn next(&mut self) -> Option<bool> {
25 if self.n == 0 {
26 None
27 } else {
28 self.n -= 1;
29 let part = self.n / 64;
30 let bit = self.n - (64 * part);
31
32 Some(self.s.as_ref()[part] & (1 << bit) > 0)
33 }
34 }
35}
36
37#[derive(Debug)]
39pub struct BitIteratorLE<Slice: AsRef<[u64]>> {
40 s: Slice,
41 n: usize,
42 max_len: usize,
43}
44
45impl<Slice: AsRef<[u64]>> BitIteratorLE<Slice> {
46 pub fn new(s: Slice) -> Self {
47 let n = 0;
48 let max_len = s.as_ref().len() * 64;
49 Self { s, n, max_len }
50 }
51
52 pub fn without_trailing_zeros(s: Slice) -> impl Iterator<Item = bool> {
55 let mut first_trailing_zero = 0;
56 for (i, limb) in s.as_ref().iter().enumerate().rev() {
57 first_trailing_zero = i * 64 + (64 - limb.leading_zeros()) as usize;
58 if *limb != 0 {
59 break;
60 }
61 }
62 let mut iter = Self::new(s);
63 iter.max_len = first_trailing_zero;
64 iter
65 }
66}
67
68impl<Slice: AsRef<[u64]>> Iterator for BitIteratorLE<Slice> {
69 type Item = bool;
70
71 fn next(&mut self) -> Option<bool> {
72 if self.n == self.max_len {
73 None
74 } else {
75 let part = self.n / 64;
76 let bit = self.n - (64 * part);
77 self.n += 1;
78
79 Some(self.s.as_ref()[part] & (1 << bit) > 0)
80 }
81 }
82}
83
84#[cfg(test)]
85mod tests {
86 use super::*;
87 use ark_std::{vec, vec::Vec};
88
89 #[test]
90 fn test_bit_iterator_be() {
91 let data = [0b1010u64];
93 let mut iter = BitIteratorBE::new(&data);
94
95 for _ in 0..60 {
98 assert_eq!(iter.next(), Some(false));
99 }
100 assert_eq!(iter.next(), Some(true)); assert_eq!(iter.next(), Some(false)); assert_eq!(iter.next(), Some(true)); assert_eq!(iter.next(), Some(false)); assert_eq!(iter.next(), None); let data = [0b0000_0000_0000_0000_0000_0000_0000_1010u64];
108 let iter: Vec<bool> = BitIteratorBE::without_leading_zeros(&data).collect();
109 assert_eq!(iter, vec![true, false, true, false]); let data = [0u64];
113 let iter: Vec<bool> = BitIteratorBE::without_leading_zeros(&data).collect();
114 assert!(iter.is_empty()); }
116
117 #[test]
118 fn test_bit_iterator_le() {
119 let data = [0b1010u64];
121 let mut iter = BitIteratorLE::new(&data);
122
123 assert_eq!(iter.next(), Some(false)); assert_eq!(iter.next(), Some(true)); assert_eq!(iter.next(), Some(false)); assert_eq!(iter.next(), Some(true)); for _ in 4..64 {
129 assert_eq!(iter.next(), Some(false)); }
131 assert_eq!(iter.next(), None); let data = [0b0000_0000_0000_0000_0000_0000_0000_1010u64];
135 let iter: Vec<bool> = BitIteratorLE::without_trailing_zeros(&data).collect();
136 assert_eq!(iter, vec![false, true, false, true]); let data = [0u64];
140 let iter: Vec<bool> = BitIteratorLE::without_trailing_zeros(&data).collect();
141 assert!(iter.is_empty()); }
143
144 #[test]
145 fn test_bit_iterator_be_multiple_integers() {
146 let data = [0b1010u64, 0b1111u64];
148 let mut iter = BitIteratorBE::new(&data);
149
150 for _ in 0..60 {
152 assert_eq!(iter.next(), Some(false));
153 }
154 assert_eq!(iter.next(), Some(true));
155 assert_eq!(iter.next(), Some(true));
156 assert_eq!(iter.next(), Some(true));
157 assert_eq!(iter.next(), Some(true));
158
159 for _ in 0..60 {
161 assert_eq!(iter.next(), Some(false));
162 }
163 assert_eq!(iter.next(), Some(true));
164 assert_eq!(iter.next(), Some(false));
165 assert_eq!(iter.next(), Some(true));
166 assert_eq!(iter.next(), Some(false));
167 assert_eq!(iter.next(), None); }
169
170 #[test]
171 fn test_bit_iterator_le_multiple_integers() {
172 let data = [0b1010u64, 0b1111u64];
174 let mut iter = BitIteratorLE::new(&data);
175
176 assert_eq!(iter.next(), Some(false));
178 assert_eq!(iter.next(), Some(true));
179 assert_eq!(iter.next(), Some(false));
180 assert_eq!(iter.next(), Some(true));
181 for _ in 4..64 {
182 assert_eq!(iter.next(), Some(false));
183 }
184
185 assert_eq!(iter.next(), Some(true));
187 assert_eq!(iter.next(), Some(true));
188 assert_eq!(iter.next(), Some(true));
189 assert_eq!(iter.next(), Some(true));
190 for _ in 4..64 {
191 assert_eq!(iter.next(), Some(false));
192 }
193 assert_eq!(iter.next(), None); }
195}