grit_bitvec/
raw_bitvec_iter.rs

1use crate::{
2    ptr,
3    NonNull,
4    alloc,
5    RawBitVec, 
6    BitProto, 
7    MemUtil,
8};
9
10pub struct RawBitVecIter {
11    pub(crate) ptr: NonNull<usize>,
12    pub(crate) true_cap: usize,
13    pub(crate) start: usize,
14    pub(crate) end_excluded: usize,
15}
16
17impl RawBitVecIter {
18    #[inline]
19    pub unsafe fn next(&mut self, proto: BitProto) -> Option<usize> {
20        match self.start == self.end_excluded {
21            true => None,
22            false => Some(self.next_unchecked(proto))
23        }
24    }
25
26    #[inline]
27    pub unsafe fn next_unchecked(&mut self, proto: BitProto) -> usize {
28        let idx_proxy = BitProto::idx_proxy(proto, self.start);
29        let mut block_ptr = self.ptr.as_ptr().add(idx_proxy.real_idx);
30        let mut block_bits = ptr::read(block_ptr);
31        let mut val = (block_bits & idx_proxy.first_mask) >> idx_proxy.first_offset;
32        if idx_proxy.second_mask != 0 {
33            block_ptr = block_ptr.add(1);
34            block_bits = ptr::read(block_ptr);
35            val = val | ((block_bits & idx_proxy.second_mask) << idx_proxy.second_offset);
36        }
37        self.start += 1;
38        val
39    }
40
41    #[inline]
42    pub unsafe fn next_back(&mut self, proto: BitProto) -> Option<usize> {
43        match self.start == self.end_excluded {
44            true => None,
45            false => Some(self.next_back_unchecked(proto))
46        }
47    }
48
49    pub unsafe fn next_back_unchecked(&mut self, proto: BitProto) -> usize {
50        self.end_excluded -= 1;
51        let idx_proxy = BitProto::idx_proxy(proto, self.end_excluded);
52        let mut block_ptr = self.ptr.as_ptr().add(idx_proxy.real_idx);
53        let mut block_bits = ptr::read(block_ptr);
54        let mut val = (block_bits & idx_proxy.first_mask) >> idx_proxy.first_offset;
55        if idx_proxy.second_mask != 0 {
56            block_ptr = block_ptr.add(1);
57            block_bits = ptr::read(block_ptr);
58            val = val | ((block_bits & idx_proxy.second_mask) << idx_proxy.second_offset);
59        }
60        val
61    }
62
63    #[inline(always)]
64    pub fn len(&self) -> usize {
65        self.end_excluded - self.start
66    }
67}
68
69impl Drop for RawBitVecIter  {
70    #[inline(always)]
71    fn drop(&mut self) {
72        if self.true_cap > 0 {
73            unsafe {alloc::dealloc(self.ptr.as_ptr().cast(), MemUtil::usize_array_layout(self.true_cap))};
74        }
75    }
76}
77
78pub struct RawBitVecDrain<'vec> {
79    pub(crate) vec: &'vec mut RawBitVec,
80    pub(crate) start: usize,
81    pub(crate) end_excluded: usize,
82}
83
84impl<'vec> RawBitVecDrain<'vec> {
85    #[inline]
86    pub unsafe fn next(&mut self, proto: BitProto) -> Option<usize> {
87        match self.start == self.end_excluded {
88            true => None,
89            false => Some(self.next_unchecked(proto))
90        }
91    }
92
93    #[inline]
94    pub unsafe fn next_unchecked(&mut self, proto: BitProto) -> usize {
95        let idx_proxy = BitProto::idx_proxy(proto, self.start);
96        let val = self.vec.replace_val_with_idx_proxy(idx_proxy, 0);
97        self.start += 1;
98        val
99    }
100
101    #[inline]
102    pub unsafe fn next_back(&mut self, proto: BitProto) -> Option<usize> {
103        match self.start == self.end_excluded {
104            true => None,
105            false => Some(self.next_back_unchecked(proto))
106        }
107    }
108
109    #[inline]
110    pub unsafe fn next_back_unchecked(&mut self, proto: BitProto) -> usize {
111        self.end_excluded -= 1;
112        let idx_proxy = BitProto::idx_proxy(proto, self.end_excluded);
113        let val = self.vec.replace_val_with_idx_proxy(idx_proxy, 0);
114        val
115    }
116
117    #[inline(always)]
118    pub fn len(&self) -> usize {
119        self.end_excluded - self.start
120    }
121}
122
123impl<'vec> Drop for RawBitVecDrain<'vec>  {
124    #[inline(always)]
125    fn drop(&mut self) {
126        self.vec.len = 0;
127    }
128}