Skip to content

Commit bb4f7b4

Browse files
committed
Added the iter() method to BitVector and implemented the IntoIterator trait for &BitVector.
1 parent fef627b commit bb4f7b4

File tree

1 file changed

+133
-20
lines changed

1 file changed

+133
-20
lines changed

src/bit_vector.rs

Lines changed: 133 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,23 @@ impl<S: BitStorage> BitVector<S> {
7474
}
7575
}
7676

77+
pub fn iter(&self) -> Iter<S> {
78+
Iter {
79+
data: &self.data,
80+
capacity: self.capacity,
81+
data_index_counter: 0,
82+
remainder_counter: 0
83+
}
84+
}
85+
7786
#[inline]
7887
fn get_unchecked(&self, index: usize) -> bool {
7988
let (data_index, remainder) = self.compute_data_index_and_remainder(index);
89+
self.get_unchecked_by_data_index_and_remainder(data_index, remainder)
90+
}
91+
92+
#[inline]
93+
fn get_unchecked_by_data_index_and_remainder(&self, data_index: usize, remainder: S) -> bool {
8094
(self.data[data_index] & (S::one() << remainder)) != S::zero()
8195
}
8296

@@ -135,43 +149,78 @@ impl<S: BitStorage> Index<usize> for BitVector<S> {
135149
}
136150
}
137151

152+
impl<'a, S: BitStorage + 'a> IntoIterator for &'a BitVector<S> {
153+
type Item = bool;
154+
type IntoIter = Iter<'a, S>;
155+
156+
fn into_iter(self) -> Iter<'a, S> {
157+
self.iter()
158+
}
159+
}
160+
161+
pub struct Iter<'a, S: BitStorage + 'a> {
162+
data: &'a Vec<S>,
163+
capacity: usize,
164+
data_index_counter: usize,
165+
remainder_counter: usize
166+
}
167+
168+
impl<'a, S: BitStorage + 'a> Iterator for Iter<'a, S> {
169+
type Item = bool;
170+
171+
fn next(&mut self) -> Option<bool> {
172+
let remainder: S = num::cast(self.remainder_counter).unwrap();
173+
let next = self.get_unchecked_by_data_index_and_remainder(self.data_index_counter, remainder);
174+
175+
if self.calculate_index() == self.capacity {
176+
return None;
177+
}
178+
179+
self.remainder_counter += 1;
180+
if self.remainder_counter == S::storage_size() {
181+
self.remainder_counter = 0;
182+
self.data_index_counter += 1;
183+
}
184+
185+
Some(next)
186+
}
187+
}
188+
189+
impl<'a, S: BitStorage + 'a> Iter<'a, S> {
190+
#[inline]
191+
fn get_unchecked_by_data_index_and_remainder(&self, data_index: usize, remainder: S) -> bool {
192+
(self.data[data_index] & (S::one() << remainder)) != S::zero()
193+
}
194+
195+
#[inline]
196+
fn calculate_index(&self) -> usize {
197+
(self.data_index_counter * S::storage_size()) + self.remainder_counter
198+
}
199+
}
200+
138201
#[cfg(test)]
139202
mod tests {
140203
use super::BitVector;
141204

142205
#[test]
143206
fn test_with_capacity() {
144-
//TODO rewrite range checks to use iter
145-
146207
let vec_32_32_false = BitVector::<u32>::with_capacity(32, false);
147-
for i in 0..32 {
148-
assert_eq!(vec_32_32_false[i], false);
149-
}
208+
assert!(vec_32_32_false.iter().all(|x| !x));
150209

151210
let vec_32_1024_false = BitVector::<u32>::with_capacity(1024, false);
152-
for i in 0..1024 {
153-
assert_eq!(vec_32_1024_false[i], false);
154-
}
211+
assert!(vec_32_1024_false.iter().all(|x| !x));
155212

156213
let vec_32_1000_false = BitVector::<u32>::with_capacity(1000, false);
157-
for i in 0..1000 {
158-
assert_eq!(vec_32_1000_false[i], false);
159-
}
214+
assert!(vec_32_1000_false.iter().all(|x| !x));
160215

161216
let vec_32_32_true = BitVector::<u32>::with_capacity(32, true);
162-
for i in 0..32 {
163-
assert_eq!(vec_32_32_true[i], true);
164-
}
217+
assert!(vec_32_32_true.iter().all(|x| x));
165218

166219
let vec_32_1024_true = BitVector::<u32>::with_capacity(1024, true);
167-
for i in 0..1024 {
168-
assert_eq!(vec_32_1024_true[i], true);
169-
}
220+
assert!(vec_32_1024_true.iter().all(|x| x));
170221

171222
let vec_32_1000_true = BitVector::<u32>::with_capacity(1000, true);
172-
for i in 0..1000 {
173-
assert_eq!(vec_32_1000_true[i], true);
174-
}
223+
assert!(vec_32_1000_true.iter().all(|x| x));
175224
}
176225

177226
#[test]
@@ -447,4 +496,68 @@ mod tests {
447496
let mut vec = BitVector::<u8>::with_capacity(16, false);
448497
vec.split_at_mut(4);
449498
}
499+
500+
#[test]
501+
fn test_iter() {
502+
let mut vec_8_4 = BitVector::<u8>::with_capacity(4, false);
503+
vec_8_4.set(0, true);
504+
vec_8_4.set(3, true);
505+
506+
let vec_8_4_iter_vec: Vec<_> = vec_8_4.iter().collect();
507+
assert_eq!(vec_8_4_iter_vec, [true, false, false, true]);
508+
509+
let mut vec_8_8 = BitVector::<u8>::with_capacity(8, false);
510+
vec_8_8.set(0, true);
511+
vec_8_8.set(3, true);
512+
vec_8_8.set(4, true);
513+
vec_8_8.set(6, true);
514+
515+
let vec_8_8_iter_vec: Vec<_> = vec_8_8.iter().collect();
516+
assert_eq!(vec_8_8_iter_vec, [true, false, false, true, true, false, true, false]);
517+
518+
let mut vec_8_16 = BitVector::<u8>::with_capacity(16, false);
519+
vec_8_16.set(0, true);
520+
vec_8_16.set(3, true);
521+
vec_8_16.set(4, true);
522+
vec_8_16.set(6, true);
523+
vec_8_16.set(9, true);
524+
vec_8_16.set(10, true);
525+
vec_8_16.set(11, true);
526+
vec_8_16.set(13, true);
527+
528+
let vec_8_16_iter_vec: Vec<_> = vec_8_16.iter().collect();
529+
assert_eq!(vec_8_16_iter_vec, [true, false, false, true, true, false, true, false, false, true, true, true, false, true, false, false]);
530+
}
531+
532+
#[test]
533+
fn test_into_iter_on_reference() {
534+
let mut vec_8_4 = BitVector::<u8>::with_capacity(4, false);
535+
vec_8_4.set(0, true);
536+
vec_8_4.set(3, true);
537+
538+
let vec_8_4_iter_vec: Vec<_> = (&vec_8_4).into_iter().collect();
539+
assert_eq!(vec_8_4_iter_vec, [true, false, false, true]);
540+
541+
let mut vec_8_8 = BitVector::<u8>::with_capacity(8, false);
542+
vec_8_8.set(0, true);
543+
vec_8_8.set(3, true);
544+
vec_8_8.set(4, true);
545+
vec_8_8.set(6, true);
546+
547+
let vec_8_8_iter_vec: Vec<_> = (&vec_8_8).into_iter().collect();
548+
assert_eq!(vec_8_8_iter_vec, [true, false, false, true, true, false, true, false]);
549+
550+
let mut vec_8_16 = BitVector::<u8>::with_capacity(16, false);
551+
vec_8_16.set(0, true);
552+
vec_8_16.set(3, true);
553+
vec_8_16.set(4, true);
554+
vec_8_16.set(6, true);
555+
vec_8_16.set(9, true);
556+
vec_8_16.set(10, true);
557+
vec_8_16.set(11, true);
558+
vec_8_16.set(13, true);
559+
560+
let vec_8_16_iter_vec: Vec<_> = (&vec_8_16).into_iter().collect();
561+
assert_eq!(vec_8_16_iter_vec, [true, false, false, true, true, false, true, false, false, true, true, true, false, true, false, false]);
562+
}
450563
}

0 commit comments

Comments
 (0)