grit_bitvec/
raw_bitvec_iter.rs1use 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}