tea_core/vec_core/
trusted.rs1use std::error::Error;
2use std::iter::Scan;
3use std::slice::Iter;
4
5#[cfg(feature = "polars")]
6pub(crate) use tea_deps::polars::export::arrow::trusted_len::TrustedLen as PlTrustedLen;
7#[cfg(feature = "polars")]
8use tea_deps::polars::prelude::PolarsIterator;
9
10pub unsafe trait TrustedLen: Iterator {
21 #[inline]
22 fn len(&self) -> usize {
23 self.size_hint().1.unwrap()
24 }
25
26 #[inline]
27 fn is_empty(&self) -> bool {
28 self.len() == 0
29 }
30}
31
32unsafe impl<T> TrustedLen for Iter<'_, T> {}
33
34unsafe impl<'a, I, T: 'a> TrustedLen for std::iter::Copied<I>
35where
36 I: TrustedLen<Item = &'a T>,
37 T: Copy,
38{
39}
40unsafe impl<'a, I, T: 'a> TrustedLen for std::iter::Cloned<I>
41where
42 I: TrustedLen<Item = &'a T>,
43 T: Clone,
44{
45}
46
47unsafe impl<I> TrustedLen for std::iter::Enumerate<I> where I: TrustedLen {}
48
49unsafe impl<I> TrustedLen for std::iter::Empty<I> {}
50unsafe impl<A, B> TrustedLen for std::iter::Zip<A, B>
51where
52 A: TrustedLen,
53 B: TrustedLen,
54{
55}
56
57unsafe impl<T> TrustedLen for std::slice::ChunksExact<'_, T> {}
58
59unsafe impl<T> TrustedLen for std::slice::Windows<'_, T> {}
60
61unsafe impl<A, B> TrustedLen for std::iter::Chain<A, B>
62where
63 A: TrustedLen,
64 B: TrustedLen<Item = A::Item>,
65{
66}
67
68unsafe impl<T> TrustedLen for std::iter::Once<T> {}
69
70unsafe impl<T> TrustedLen for std::vec::IntoIter<T> {}
71
72unsafe impl<A: Clone> TrustedLen for std::iter::Repeat<A> {}
73unsafe impl<A, F: FnMut() -> A> TrustedLen for std::iter::RepeatWith<F> {}
74unsafe impl<A: TrustedLen> TrustedLen for std::iter::Take<A> {}
75
76#[cfg(feature = "polars")]
77unsafe impl<T> PlTrustedLen for &mut dyn TrustedLen<Item = T> {}
78#[cfg(feature = "polars")]
79unsafe impl<'a, T> PlTrustedLen for Box<dyn TrustedLen<Item = T> + 'a> {}
80#[cfg(feature = "polars")]
81unsafe impl<T> TrustedLen for &mut dyn PlTrustedLen<Item = T> {}
82#[cfg(feature = "polars")]
83unsafe impl<'a, T> TrustedLen for Box<dyn PlTrustedLen<Item = T> + 'a> {}
84#[cfg(feature = "polars")]
85unsafe impl<T> TrustedLen for dyn PolarsIterator<Item = T> {}
86#[cfg(feature = "polars")]
87unsafe impl<'a, T> TrustedLen for Box<dyn PolarsIterator<Item = T> + 'a> {}
88
89unsafe impl<T> TrustedLen for &mut dyn TrustedLen<Item = T> {}
90unsafe impl<T> TrustedLen for Box<dyn TrustedLen<Item = T> + '_> {}
91
92unsafe impl<B, I: TrustedLen, T: FnMut(I::Item) -> B> TrustedLen for std::iter::Map<I, T> {}
93
94unsafe impl<I: TrustedLen + DoubleEndedIterator> TrustedLen for std::iter::Rev<I> {}
95
96unsafe impl<T> TrustedLen for std::ops::Range<T> where std::ops::Range<T>: Iterator {}
97unsafe impl<T> TrustedLen for std::ops::RangeInclusive<T> where std::ops::RangeInclusive<T>: Iterator
98{}
99unsafe impl<A: TrustedLen> TrustedLen for std::iter::StepBy<A> {}
100
101unsafe impl<I, St, F, B> TrustedLen for Scan<I, St, F>
102where
103 F: FnMut(&mut St, I::Item) -> Option<B>,
104 I: TrustedLen + Iterator<Item = B>,
105{
106}
107
108#[cfg(feature = "ndarray")]
109unsafe impl<'a, A, D: tea_deps::ndarray::Dimension> TrustedLen
110 for tea_deps::ndarray::iter::Iter<'a, A, D>
111{
112}
113#[cfg(feature = "ndarray")]
114unsafe impl<'a, A, D: tea_deps::ndarray::Dimension> TrustedLen
115 for tea_deps::ndarray::iter::IterMut<'a, A, D>
116{
117}
118
119#[cfg(feature = "vecdeque")]
123unsafe impl<T> TrustedLen for std::collections::vec_deque::IntoIter<T> {}
124#[cfg(feature = "vecdeque")]
125unsafe impl<'a, T> TrustedLen for std::collections::vec_deque::Iter<'a, T> {}
126
127#[derive(Clone)]
141pub struct TrustIter<I: Iterator> {
142 iter: I,
143 len: usize,
144}
145
146impl<I> TrustIter<I>
147where
148 I: Iterator,
149{
150 #[inline]
151 pub fn new(iter: I, len: usize) -> Self {
152 Self { iter, len }
153 }
154}
155
156impl<I> Iterator for TrustIter<I>
157where
158 I: Iterator,
159{
160 type Item = I::Item;
161
162 #[inline]
163 fn next(&mut self) -> Option<Self::Item> {
164 self.iter.next()
165 }
166
167 fn size_hint(&self) -> (usize, Option<usize>) {
168 (self.len, Some(self.len))
169 }
170}
171
172impl<I> ExactSizeIterator for TrustIter<I> where I: Iterator {}
173
174impl<I> DoubleEndedIterator for TrustIter<I>
175where
176 I: Iterator + DoubleEndedIterator,
177{
178 #[inline]
179 fn next_back(&mut self) -> Option<Self::Item> {
180 self.iter.next_back()
181 }
182}
183
184#[cfg(feature = "polars")]
185unsafe impl<I: Iterator> PlTrustedLen for TrustIter<I> {}
186unsafe impl<I: Iterator> TrustedLen for TrustIter<I> {}
187
188pub trait ToTrustIter: IntoIterator {
193 fn to_trust(self, len: usize) -> TrustIter<Self::IntoIter>;
204}
205
206impl<I: IntoIterator> ToTrustIter for I {
207 fn to_trust(self, len: usize) -> TrustIter<Self::IntoIter> {
208 TrustIter::new(self.into_iter(), len)
209 }
210}
211pub trait CollectTrusted<T> {
217 fn collect_from_trusted<I>(i: I) -> Self
230 where
231 I: IntoIterator<Item = T>,
232 I::IntoIter: TrustedLen;
233
234 fn try_collect_from_trusted<I, E: Error>(iter: I) -> Result<Self, E>
247 where
248 I: IntoIterator<Item = Result<T, E>>,
249 I::IntoIter: TrustedLen,
250 Self: Sized;
251}
252
253impl<T> CollectTrusted<T> for Vec<T> {
254 fn collect_from_trusted<I>(iter: I) -> Self
256 where
257 I: IntoIterator<Item = T>,
258 I::IntoIter: TrustedLen,
259 {
260 let iter = iter.into_iter();
261 let len = iter
262 .size_hint()
263 .1
264 .expect("The iterator must have an upper bound");
265 let mut vec = Vec::<T>::with_capacity(len);
266 let mut ptr = vec.as_mut_ptr();
267 unsafe {
268 for v in iter {
269 std::ptr::write(ptr, v);
270 ptr = ptr.add(1);
271 }
272 vec.set_len(len);
273 }
274 vec
275 }
276
277 fn try_collect_from_trusted<I, E: Error>(iter: I) -> Result<Self, E>
279 where
280 I: IntoIterator<Item = Result<T, E>>,
281 I::IntoIter: TrustedLen,
282 Self: Sized,
283 {
284 let iter = iter.into_iter();
285 let len = iter
286 .size_hint()
287 .1
288 .expect("The iterator must have an upper bound");
289 let mut vec = Vec::<T>::with_capacity(len);
290 let mut ptr = vec.as_mut_ptr();
291 unsafe {
292 for v in iter {
293 let v = v?;
294 std::ptr::write(ptr, v);
295 ptr = ptr.add(1);
296 }
297 vec.set_len(len);
298 }
299 Ok(vec)
300 }
301}
302
303pub trait CollectTrustedToVec: Iterator + TrustedLen + Sized {
308 #[inline(always)]
318 fn collect_trusted_to_vec(self) -> Vec<Self::Item> {
319 CollectTrusted::<Self::Item>::collect_from_trusted(self)
320 }
321}
322
323pub trait TryCollectTrustedToVec<T, E: Error>:
330 Iterator<Item = Result<T, E>> + TrustedLen + Sized
331{
332 #[inline(always)]
345 fn try_collect_trusted_to_vec(self) -> Result<Vec<T>, E> {
346 CollectTrusted::<T>::try_collect_from_trusted(self)
347 }
348}
349
350impl<T: TrustedLen> CollectTrustedToVec for T {}
351impl<I: TrustedLen<Item = Result<T, E>> + Sized, T, E: Error> TryCollectTrustedToVec<T, E> for I {}