Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-arrow/src/buffer/iterator.rs
6939 views
1
use super::Buffer;
2
use crate::trusted_len::TrustedLen;
3
4
/// This crates' equivalent of [`std::vec::IntoIter`] for [`Buffer`].
5
#[derive(Debug, Clone)]
6
pub struct IntoIter<T: Copy> {
7
values: Buffer<T>,
8
index: usize,
9
end: usize,
10
}
11
12
impl<T: Copy> IntoIter<T> {
13
/// Creates a new [`Buffer`]
14
#[inline]
15
pub fn new(values: Buffer<T>) -> Self {
16
let end = values.len();
17
Self {
18
values,
19
index: 0,
20
end,
21
}
22
}
23
}
24
25
impl<T: Copy> Iterator for IntoIter<T> {
26
type Item = T;
27
28
#[inline]
29
fn next(&mut self) -> Option<Self::Item> {
30
if self.index == self.end {
31
return None;
32
}
33
let old = self.index;
34
self.index += 1;
35
Some(*unsafe { self.values.get_unchecked(old) })
36
}
37
38
#[inline]
39
fn size_hint(&self) -> (usize, Option<usize>) {
40
(self.end - self.index, Some(self.end - self.index))
41
}
42
43
#[inline]
44
fn nth(&mut self, n: usize) -> Option<Self::Item> {
45
let new_index = self.index + n;
46
if new_index > self.end {
47
self.index = self.end;
48
None
49
} else {
50
self.index = new_index;
51
self.next()
52
}
53
}
54
}
55
56
impl<T: Copy> DoubleEndedIterator for IntoIter<T> {
57
#[inline]
58
fn next_back(&mut self) -> Option<Self::Item> {
59
if self.index == self.end {
60
None
61
} else {
62
self.end -= 1;
63
Some(*unsafe { self.values.get_unchecked(self.end) })
64
}
65
}
66
}
67
68
unsafe impl<T: Copy> TrustedLen for IntoIter<T> {}
69
70