@@ -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) ]
139202mod 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