1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
use crate::trusted_len::{FromIteratorReversed, PushUnchecked, TrustedLen};
use arrow::bitmap::Bitmap;
use std::ops::BitAnd;
pub struct TrustMyLength<I: Iterator<Item = J>, J> {
iter: I,
len: usize,
}
impl<I, J> TrustMyLength<I, J>
where
I: Iterator<Item = J>,
{
#[inline]
pub fn new(iter: I, len: usize) -> Self {
Self { iter, len }
}
}
impl<I, J> Iterator for TrustMyLength<I, J>
where
I: Iterator<Item = J>,
{
type Item = J;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
fn size_hint(&self) -> (usize, Option<usize>) {
(self.len, Some(self.len))
}
}
impl<I, J> ExactSizeIterator for TrustMyLength<I, J> where I: Iterator<Item = J> {}
impl<I, J> DoubleEndedIterator for TrustMyLength<I, J>
where
I: Iterator<Item = J> + DoubleEndedIterator,
{
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
self.iter.next_back()
}
}
pub fn combine_validities(opt_l: Option<&Bitmap>, opt_r: Option<&Bitmap>) -> Option<Bitmap> {
match (opt_l, opt_r) {
(Some(l), Some(r)) => Some(l.bitand(r)),
(None, Some(r)) => Some(r.clone()),
(Some(l), None) => (Some(l.clone())),
(None, None) => None,
}
}
unsafe impl<I, J> arrow::trusted_len::TrustedLen for TrustMyLength<I, J> where I: Iterator<Item = J> {}
pub trait CustomIterTools: Iterator {
fn fold_first_<F>(mut self, f: F) -> Option<Self::Item>
where
Self: Sized,
F: FnMut(Self::Item, Self::Item) -> Self::Item,
{
let first = self.next()?;
Some(self.fold(first, f))
}
fn trust_my_length(self, length: usize) -> TrustMyLength<Self, Self::Item>
where
Self: Sized,
{
TrustMyLength::new(self, length)
}
fn collect_trusted<T: FromTrustedLenIterator<Self::Item>>(self) -> T
where
Self: Sized + TrustedLen,
{
FromTrustedLenIterator::from_iter_trusted_length(self)
}
fn collect_reversed<T: FromIteratorReversed<Self::Item>>(self) -> T
where
Self: Sized + TrustedLen,
{
FromIteratorReversed::from_trusted_len_iter_rev(self)
}
}
pub trait CustomIterToolsSized: Iterator + Sized {}
impl<T: ?Sized> CustomIterTools for T where T: Iterator {}
pub trait FromTrustedLenIterator<A>: Sized {
fn from_iter_trusted_length<T: IntoIterator<Item = A>>(iter: T) -> Self
where
T::IntoIter: TrustedLen;
}
impl<T> FromTrustedLenIterator<T> for Vec<T> {
fn from_iter_trusted_length<I: IntoIterator<Item = T>>(iter: I) -> Self
where
I::IntoIter: TrustedLen,
{
let iter = iter.into_iter();
let len = iter.size_hint().0;
let mut v = Vec::with_capacity(len);
v.extend_trusted_len(iter);
v
}
}