Skip to content

Commit b2769a8

Browse files
committed
Added the iter() method to BitSliceMut and implemented the IntoIterator trait for &BitSliceMut.
1 parent 90303d8 commit b2769a8

File tree

1 file changed

+156
-0
lines changed

1 file changed

+156
-0
lines changed

src/bit_slice_mut.rs

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
161230
mod 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

Comments
 (0)