vortex_buffer/
trusted_len.rs1pub unsafe trait TrustedLen: Iterator {}
15
16pub struct TrustedLenAdapter<I> {
22 inner: I,
23 len: usize,
24 #[cfg(debug_assertions)]
25 count: usize,
26}
27
28impl<I: Iterator> Iterator for TrustedLenAdapter<I> {
29 type Item = I::Item;
30
31 #[inline]
32 fn next(&mut self) -> Option<Self::Item> {
33 let item = self.inner.next();
34 #[cfg(debug_assertions)]
35 {
36 if item.is_some() {
37 self.count += 1;
38 assert!(
39 self.count <= self.len,
40 "TrustedLenAdapter: iterator yielded more items than promised"
41 );
42 } else {
43 assert_eq!(
44 self.len, self.count,
45 "TrustedLenAdapter: iterator ended early"
46 );
47 }
48 }
49 item
50 }
51
52 #[inline]
53 fn size_hint(&self) -> (usize, Option<usize>) {
54 (self.len, Some(self.len))
55 }
56}
57
58unsafe impl<I: Iterator> TrustedLen for TrustedLenAdapter<I> {}
59
60pub trait TrustedLenExt: Iterator + Sized {
62 unsafe fn trusted_len(self) -> TrustedLenAdapter<Self> {
68 let (lower_bound, upper_bound_opt) = self.size_hint();
69 if let Some(upper_bound) = upper_bound_opt {
70 assert_eq!(
71 lower_bound, upper_bound,
72 "TrustedLenExt: iterator size hints must match if upper bound is given"
73 );
74 }
75
76 TrustedLenAdapter {
77 inner: self,
78 len: lower_bound,
79 #[cfg(debug_assertions)]
80 count: 0,
81 }
82 }
83}
84
85impl<I: Iterator> TrustedLenExt for I {}
86
87macro_rules! impl_for_range {
88 ($($typ:ty),*) => {
89 $(
90 unsafe impl TrustedLen for std::ops::Range<$typ> {}
91 unsafe impl TrustedLen for std::ops::RangeInclusive<$typ> {}
92 unsafe impl TrustedLen for std::iter::StepBy<std::ops::Range<$typ>> {}
95 unsafe impl TrustedLen for std::iter::StepBy<std::ops::RangeInclusive<$typ>> {}
96 )*
97 };
98}
99
100impl_for_range!(u8, u16, u32, u64, i8, i16, i32, i64, usize);
101
102unsafe impl<T> TrustedLen for std::slice::Iter<'_, T> {}
104
105unsafe impl<T> TrustedLen for std::slice::IterMut<'_, T> {}
106
107unsafe impl<B, I, F> TrustedLen for std::iter::Map<I, F>
109where
110 I: TrustedLen,
111 F: FnMut(I::Item) -> B,
112{
113}
114
115unsafe impl<I> TrustedLen for std::iter::Skip<I> where I: TrustedLen {}
116
117unsafe impl<'a, I, T: 'a> TrustedLen for std::iter::Copied<I>
118where
119 I: TrustedLen<Item = &'a T>,
120 T: Copy,
121{
122}
123
124unsafe impl<'a, I, T: 'a> TrustedLen for std::iter::Cloned<I>
125where
126 I: TrustedLen<Item = &'a T>,
127 T: Clone,
128{
129}
130
131unsafe impl<T> TrustedLen for std::vec::IntoIter<T> {}
132
133unsafe impl<T, const N: usize> TrustedLen for std::array::IntoIter<T, N> {}
135
136unsafe impl<T> TrustedLen for crate::Iter<'_, T> {}
138unsafe impl<T: Copy> TrustedLen for crate::BufferIterator<T> {}
139
140unsafe impl<'a, I, T: 'a, E: 'a> TrustedLen for itertools::ProcessResults<'a, I, E> where
142 I: TrustedLen<Item = Result<T, E>>
143{
144}
145
146unsafe impl<I, T> TrustedLen for std::iter::Enumerate<I> where I: TrustedLen<Item = T> {}
148
149unsafe impl<T, U> TrustedLen for std::iter::Zip<T, U>
175where
176 T: TrustedLen,
177 U: TrustedLen,
178{
179}
180
181unsafe impl<T: Clone> TrustedLen for std::iter::RepeatN<T> {}
182
183unsafe impl<'a> TrustedLen for crate::bit::BitIterator<'a> {}
185unsafe impl<'a> TrustedLen for crate::bit::BitChunkIterator<'a> {}
186unsafe impl<'a> TrustedLen for crate::bit::UnalignedBitChunkIterator<'a> {}