@@ -81,9 +81,24 @@ impl<'a, S: BitStorage + 'a> BitSliceMut<'a, S> {
8181 }
8282 }
8383
84+ pub fn iter ( & self ) -> Iter < S > {
85+ Iter {
86+ pointer : self . pointer ,
87+ capacity : self . capacity ,
88+ data_index_counter : 0 ,
89+ remainder_counter : 0 ,
90+ phantom : PhantomData
91+ }
92+ }
93+
8494 #[ inline]
8595 fn get_unchecked ( & self , index : usize ) -> bool {
8696 let ( data_index, remainder) = self . compute_data_index_and_remainder ( index) ;
97+ self . get_unchecked_by_data_index_and_remainder ( data_index, remainder)
98+ }
99+
100+ #[ inline]
101+ fn get_unchecked_by_data_index_and_remainder ( & self , data_index : usize , remainder : S ) -> bool {
87102 let element = unsafe { * self . pointer . offset ( data_index as isize ) } ;
88103 ( element & ( S :: one ( ) << remainder) ) != S :: zero ( )
89104 }
@@ -157,6 +172,60 @@ impl<'a, S: BitStorage + 'a> Index<usize> for BitSliceMut<'a, S> {
157172 }
158173}
159174
175+ pub struct Iter < ' a , S : BitStorage + ' a > {
176+ pointer : * mut S ,
177+ capacity : usize ,
178+ data_index_counter : usize ,
179+ remainder_counter : usize ,
180+ phantom : PhantomData < & ' a S >
181+ }
182+
183+ unsafe impl < ' a , S : BitStorage + ' a > Send for Iter < ' a , S > { }
184+ unsafe impl < ' a , S : BitStorage + ' a > Sync for Iter < ' a , S > { }
185+
186+ impl < ' a , S : BitStorage + ' a > IntoIterator for & ' a BitSliceMut < ' a , S > {
187+ type Item = bool ;
188+ type IntoIter = Iter < ' a , S > ;
189+
190+ fn into_iter ( self ) -> Iter < ' a , S > {
191+ self . iter ( )
192+ }
193+ }
194+
195+ impl < ' a , S : BitStorage + ' a > Iterator for Iter < ' a , S > {
196+ type Item = bool ;
197+
198+ fn next ( & mut self ) -> Option < bool > {
199+ let remainder: S = num:: cast ( self . remainder_counter ) . unwrap ( ) ;
200+ let next = self . get_unchecked_by_data_index_and_remainder ( self . data_index_counter , remainder) ;
201+
202+ if self . calculate_index ( ) == self . capacity {
203+ return None ;
204+ }
205+
206+ self . remainder_counter += 1 ;
207+ if self . remainder_counter == S :: storage_size ( ) {
208+ self . remainder_counter = 0 ;
209+ self . data_index_counter += 1 ;
210+ }
211+
212+ Some ( next)
213+ }
214+ }
215+
216+ impl < ' a , S : BitStorage + ' a > Iter < ' a , S > {
217+ #[ inline]
218+ fn get_unchecked_by_data_index_and_remainder ( & self , data_index : usize , remainder : S ) -> bool {
219+ let element = unsafe { * self . pointer . offset ( data_index as isize ) } ;
220+ ( element & ( S :: one ( ) << remainder) ) != S :: zero ( )
221+ }
222+
223+ #[ inline]
224+ fn calculate_index ( & self ) -> usize {
225+ ( self . data_index_counter * S :: storage_size ( ) ) + self . remainder_counter
226+ }
227+ }
228+
160229#[ cfg( test) ]
161230mod tests {
162231 use super :: super :: { BitSliceMut , BitVector } ;
@@ -523,4 +592,91 @@ mod tests {
523592 let mut slice = create_bitslice_mut_u8_16_from_bitvector_u8_32 ( & mut vec_8_32) ;
524593 slice. split_at_mut ( 4 ) ;
525594 }
595+
596+ #[ test]
597+ fn test_iter ( ) {
598+ let mut vec_8_4 = BitVector :: < u8 > :: with_capacity ( 4 , false ) ;
599+ vec_8_4. set ( 0 , true ) ;
600+ vec_8_4. set ( 3 , true ) ;
601+
602+ let ( _, slice_8_4) = vec_8_4. split_at_mut ( 0 ) ;
603+ let slice_8_4_iter_vec: Vec < _ > = slice_8_4. iter ( ) . collect ( ) ;
604+ assert_eq ! ( slice_8_4_iter_vec, [ true , false , false , true ] ) ;
605+
606+ let mut vec_8_8 = BitVector :: < u8 > :: with_capacity ( 8 , false ) ;
607+ vec_8_8. set ( 0 , true ) ;
608+ vec_8_8. set ( 3 , true ) ;
609+ vec_8_8. set ( 4 , true ) ;
610+ vec_8_8. set ( 6 , true ) ;
611+
612+ let ( _, slice_8_8) = vec_8_8. split_at_mut ( 0 ) ;
613+ let slice_8_8_iter_vec: Vec < _ > = slice_8_8. iter ( ) . collect ( ) ;
614+ assert_eq ! ( slice_8_8_iter_vec, [ true , false , false , true , true , false , true , false ] ) ;
615+
616+ let mut vec_8_16 = BitVector :: < u8 > :: with_capacity ( 16 , false ) ;
617+ vec_8_16. set ( 0 , true ) ;
618+ vec_8_16. set ( 3 , true ) ;
619+ vec_8_16. set ( 4 , true ) ;
620+ vec_8_16. set ( 6 , true ) ;
621+ vec_8_16. set ( 9 , true ) ;
622+ vec_8_16. set ( 10 , true ) ;
623+ vec_8_16. set ( 11 , true ) ;
624+ vec_8_16. set ( 13 , true ) ;
625+
626+ {
627+ let ( _, slice_8_16) = vec_8_16. split_at_mut ( 0 ) ;
628+ let slice_8_16_iter_vec: Vec < _ > = slice_8_16. iter ( ) . collect ( ) ;
629+ assert_eq ! ( slice_8_16_iter_vec, [ true , false , false , true , true , false , true , false , false , true , true , true , false , true , false , false ] ) ;
630+ }
631+
632+ let vec_8_16_iter_vec: Vec < _ > = vec_8_16. iter ( ) . collect ( ) ;
633+ let ( left, right) = vec_8_16. split_at_mut ( 8 ) ;
634+ let left_plus_right_iter_vec: Vec < _ > = left. iter ( ) . chain ( right. iter ( ) ) . collect ( ) ;
635+
636+ assert_eq ! ( vec_8_16_iter_vec, left_plus_right_iter_vec) ;
637+ }
638+
639+ #[ test]
640+ fn test_into_iter_on_reference ( ) {
641+ let mut vec_8_4 = BitVector :: < u8 > :: with_capacity ( 4 , false ) ;
642+ vec_8_4. set ( 0 , true ) ;
643+ vec_8_4. set ( 3 , true ) ;
644+
645+ let ( _, slice_8_4) = vec_8_4. split_at_mut ( 0 ) ;
646+ let slice_8_4_iter_vec: Vec < _ > = ( & slice_8_4) . into_iter ( ) . collect ( ) ;
647+ assert_eq ! ( slice_8_4_iter_vec, [ true , false , false , true ] ) ;
648+
649+ let mut vec_8_8 = BitVector :: < u8 > :: with_capacity ( 8 , false ) ;
650+ vec_8_8. set ( 0 , true ) ;
651+ vec_8_8. set ( 3 , true ) ;
652+ vec_8_8. set ( 4 , true ) ;
653+ vec_8_8. set ( 6 , true ) ;
654+
655+ let ( _, slice_8_8) = vec_8_8. split_at_mut ( 0 ) ;
656+ let slice_8_8_iter_vec: Vec < _ > = ( & slice_8_8) . into_iter ( ) . collect ( ) ;
657+ assert_eq ! ( slice_8_8_iter_vec, [ true , false , false , true , true , false , true , false ] ) ;
658+
659+ let mut vec_8_16 = BitVector :: < u8 > :: with_capacity ( 16 , false ) ;
660+ vec_8_16. set ( 0 , true ) ;
661+ vec_8_16. set ( 3 , true ) ;
662+ vec_8_16. set ( 4 , true ) ;
663+ vec_8_16. set ( 6 , true ) ;
664+ vec_8_16. set ( 9 , true ) ;
665+ vec_8_16. set ( 10 , true ) ;
666+ vec_8_16. set ( 11 , true ) ;
667+ vec_8_16. set ( 13 , true ) ;
668+
669+ {
670+ let ( _, slice_8_16) = vec_8_16. split_at_mut ( 0 ) ;
671+ let slice_8_16_iter_vec: Vec < _ > = ( & slice_8_16) . into_iter ( ) . collect ( ) ;
672+ assert_eq ! ( slice_8_16_iter_vec, [ true , false , false , true , true , false , true , false , false , true , true , true , false , true , false , false ] ) ;
673+ }
674+
675+ let vec_8_16_iter_vec: Vec < _ > = vec_8_16. iter ( ) . collect ( ) ;
676+ let ( left, right) = vec_8_16. split_at_mut ( 8 ) ;
677+ let left_iter = ( & left) . into_iter ( ) ;
678+ let left_plus_right_iter_vec: Vec < _ > = left_iter. chain ( & right) . collect ( ) ;
679+
680+ assert_eq ! ( vec_8_16_iter_vec, left_plus_right_iter_vec) ;
681+ }
526682}
0 commit comments