arrow2/bitmap/
iterator.rs1use crate::trusted_len::TrustedLen;
2
3use super::Bitmap;
4
5#[derive(Debug, Clone)]
7pub struct IntoIter {
8 values: Bitmap,
9 index: usize,
10 end: usize,
11}
12
13impl IntoIter {
14 #[inline]
16 pub fn new(values: Bitmap) -> Self {
17 let end = values.len();
18 Self {
19 values,
20 index: 0,
21 end,
22 }
23 }
24}
25
26impl Iterator for IntoIter {
27 type Item = bool;
28
29 #[inline]
30 fn next(&mut self) -> Option<Self::Item> {
31 if self.index == self.end {
32 return None;
33 }
34 let old = self.index;
35 self.index += 1;
36 Some(unsafe { self.values.get_bit_unchecked(old) })
37 }
38
39 #[inline]
40 fn size_hint(&self) -> (usize, Option<usize>) {
41 (self.end - self.index, Some(self.end - self.index))
42 }
43
44 #[inline]
45 fn nth(&mut self, n: usize) -> Option<Self::Item> {
46 let new_index = self.index + n;
47 if new_index > self.end {
48 self.index = self.end;
49 None
50 } else {
51 self.index = new_index;
52 self.next()
53 }
54 }
55}
56
57impl DoubleEndedIterator for IntoIter {
58 #[inline]
59 fn next_back(&mut self) -> Option<Self::Item> {
60 if self.index == self.end {
61 None
62 } else {
63 self.end -= 1;
64 Some(unsafe { self.values.get_bit_unchecked(self.end) })
65 }
66 }
67}
68
69unsafe impl TrustedLen for IntoIter {}