pub struct HintSize<I: Iterator> {
pub iterator: I,
pub hint: SizeHint,
}Expand description
An Iterator adaptor that provides a custom Iterator::size_hint implementation.
This is most useful for providing a specific Iterator::size_hint implementation or hiding
an underlying one for testing. In some cases using this adaptor may allow for optimization,
though if an exact length is known it is recommended to use ExactLen instead. Using this
adaptor to wrap an iterator that implements ExactSizeIterator or TrustedLen may also
prevent optimizations.
Note this type is readonly. The field values may be read, but not modified.
§Fused iterator requirement
HintSizes with an bounded size hint (those created by HintSize::new or HintSize::try_new)
are required to wrap a FusedIterator, because after the iterator completes (returns None),
this adaptor could no longer guarantee a correct bound upper value if iteration were to resume.
Consider using an unbounded wrapper (HintSize::hide or HintSize::min) if the iterator is
unfused.
§Safety
HintSize is always safe to use - it will never cause undefined behavior or memory unsafety,
regardless of the hint values provided.
§Validity
Validation during construction ensures that adaptor does not contradict the wrapped iterator’s
guarantees. This is, the adaptor cannot produce a size hint that claims a upper bound less than
the wrapped iterator’s lower bound or a lower bound greater than the wrapped iterator’s upper
bound. If necessary this validation can be bypassed by wrapping in first HintSize::hide and
then in the desired adaptor.
Regardless, it is still the caller’s responsibility to ensure that the size hints accurately represent the number of elements remaining in the iterator. Incorrect size hints may cause incorrect behavior or panics in code that relies on these values.
If constructed with values valid for the wrapped iterator, the returned size hint will always
be valid. However, if the iterator is fused, the bounds of a bounded HintSize are not
guaranteed to converge at zero when iteration completes, and may change if a completed iterator
is polled again.
§Examples
Hiding an iterator’s size hint for testing.
let mut hidden = HintSize::hide(1..5);
assert_eq!(hidden.size_hint(), SizeHint::UNIVERSAL, "Initial size hint is universal");
assert_eq!(hidden.next(), Some(1), "Underlying iterator is not changed");
assert_eq!(hidden.size_hint(), SizeHint::UNIVERSAL, "Size hint remains universal");Providing a specific size hint.
let mut iter = HintSize::new(1..5, 3, 6);
assert_eq!(iter.size_hint(), (3, Some(6)), "should match the provided size hint");
assert_eq!(iter.next(), Some(1), "Underlying iterator is not changed");
assert_eq!(iter.next_back(), Some(4), "Underlying iterator is not changed");
assert_eq!(iter.size_hint(), (1, Some(4)), "should reflect the new state");Fields§
§iterator: IThe underlying iterator.
hint: SizeHintThe current size hint.
Implementations§
Source§impl<I: Iterator> HintSize<I>
impl<I: Iterator> HintSize<I>
Sourcepub fn new<IntoIter>(iterator: IntoIter, lower: usize, upper: usize) -> Selfwhere
IntoIter: IntoIterator<IntoIter = I>,
I: FusedIterator,
pub fn new<IntoIter>(iterator: IntoIter, lower: usize, upper: usize) -> Selfwhere
IntoIter: IntoIterator<IntoIter = I>,
I: FusedIterator,
Wraps iterator in a new HintSize with an initial bounded size hint of
(lower, Some(upper)).
§Panics
Panics if:
iterator’sIterator::size_hintis invalidlower > upperupperis less than the wrapped iterator’s lower boundloweris greater than the wrapped iterator’s upper bound (if present)
§Examples
let mut iter = HintSize::new(1..5, 2, 6);
assert_eq!(iter.size_hint(), (2, Some(6)), "should match the provided size hint");Sourcepub fn try_new<II>(
iterator: II,
lower: usize,
upper: usize,
) -> Result<Self, InvalidSizeHint>where
II: IntoIterator<IntoIter = I>,
I: FusedIterator,
pub fn try_new<II>(
iterator: II,
lower: usize,
upper: usize,
) -> Result<Self, InvalidSizeHint>where
II: IntoIterator<IntoIter = I>,
I: FusedIterator,
Tries to wrap iterator in a new HintSize with an initial bounded size hint of
(lower, Some(upper)).
§Errors
Returns an InvalidSizeHint if:
lower > upperupperis less than the wrapped iterator’s lower boundloweris greater than the wrapped iterator’s upper bound (if present)
§Panics
Panics if iterator’s Iterator::size_hint is invalid
§Examples
let mut iter = HintSize::try_new(1..5, 2, 6)?;
assert_eq!(iter.size_hint(), (2, Some(6)), "Initial size hint");
let err: InvalidSizeHint = HintSize::try_new(1..5, 6, 2).expect_err("lower bound is > upper bound");
let err: InvalidSizeHint = HintSize::try_new(1..5, 6, 10).expect_err("hint lower bound is > iterator's upper bound");
let err: InvalidSizeHint = HintSize::try_new(1..5, 1, 3).expect_err("hint upper bound is < iterator's lower bound");
}Sourcepub fn min(iterator: impl IntoIterator<IntoIter = I>, lower: usize) -> Self
pub fn min(iterator: impl IntoIterator<IntoIter = I>, lower: usize) -> Self
Wraps iterator in a new HintSize with an unbounded size hint based on lower.
§Panics
Panics if:
iterator’sIterator::size_hintis invalidloweris greater than the wrapped iterator’s upper bound (if present).
§Examples
let mut iter = HintSize::min(1..5, 2);
assert_eq!(iter.size_hint(), (2, None), "Initial size hint reflects lower");Sourcepub fn try_min(
iterator: impl IntoIterator<IntoIter = I>,
lower: usize,
) -> Result<Self, InvalidSizeHint>
pub fn try_min( iterator: impl IntoIterator<IntoIter = I>, lower: usize, ) -> Result<Self, InvalidSizeHint>
Tries to wrap iterator in a new HintSize with an unbounded size hint based on lower.
§Errors
Returns an InvalidSizeHint if lower is greater than the wrapped iterator’s upper
bound (if present).
§Panics
Panics if iterator’s Iterator::size_hint is invalid
§Examples
let iter = HintSize::try_min(1..5, 2)?;
assert_eq!(iter.size_hint(), (2, None), "Initial size hint reflects lower");
let err: InvalidSizeHint = HintSize::try_min(1..5, 6).expect_err("lower bound is > wrapped iterator's upper bound");Sourcepub fn hide(iterator: impl IntoIterator<IntoIter = I>) -> Self
pub fn hide(iterator: impl IntoIterator<IntoIter = I>) -> Self
Wraps iterator with a new Iterator::size_hint implementation with a universal size hint.
This implementation, and the size hint it returns, is always correct, and never changes.
§Examples
let mut iter = HintSize::hide(1..5);
assert_eq!(iter.size_hint(), (0, None), "Initial size hint is universal");
assert_eq!(iter.next(), Some(1), "Underlying iterator is not changed");
assert_eq!(iter.size_hint(), (0, None), "Size hint remains universal");Sourcepub fn into_inner(self) -> I
pub fn into_inner(self) -> I
Consumes the adaptor and returns the underlying iterator.
§Examples
use size_hinter::HintSize;
let iter: std::vec::IntoIter<i32> = vec![1, 2, 3].into_iter();
let hint_iter = HintSize::hide(iter);
let inner: std::vec::IntoIter<i32> = hint_iter.into_inner();Trait Implementations§
Source§impl<I: DoubleEndedIterator> DoubleEndedIterator for HintSize<I>
impl<I: DoubleEndedIterator> DoubleEndedIterator for HintSize<I>
Source§fn next_back(&mut self) -> Option<Self::Item>
fn next_back(&mut self) -> Option<Self::Item>
Source§fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by)n elements. Read more1.37.0 · Source§fn nth_back(&mut self, n: usize) -> Option<Self::Item>
fn nth_back(&mut self, n: usize) -> Option<Self::Item>
nth element from the end of the iterator. Read more1.27.0 · Source§fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
Iterator::try_fold(): it takes
elements starting from the back of the iterator. Read moreSource§impl<I: Iterator> Iterator for HintSize<I>
impl<I: Iterator> Iterator for HintSize<I>
Source§fn next(&mut self) -> Option<Self::Item>
fn next(&mut self) -> Option<Self::Item>
Source§fn size_hint(&self) -> (usize, Option<usize>)
fn size_hint(&self) -> (usize, Option<usize>)
Source§fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
iter_next_chunk)N values. Read more1.0.0 · Source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
1.0.0 · Source§fn last(self) -> Option<Self::Item>where
Self: Sized,
fn last(self) -> Option<Self::Item>where
Self: Sized,
Source§fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by)n elements. Read more1.0.0 · Source§fn nth(&mut self, n: usize) -> Option<Self::Item>
fn nth(&mut self, n: usize) -> Option<Self::Item>
nth element of the iterator. Read more1.28.0 · Source§fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
1.0.0 · Source§fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
1.0.0 · Source§fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
Source§fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
iter_intersperse)separator between adjacent
items of the original iterator. Read moreSource§fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
iter_intersperse)separator
between adjacent items of the original iterator. Read more1.0.0 · Source§fn map<B, F>(self, f: F) -> Map<Self, F>
fn map<B, F>(self, f: F) -> Map<Self, F>
1.0.0 · Source§fn filter<P>(self, predicate: P) -> Filter<Self, P>
fn filter<P>(self, predicate: P) -> Filter<Self, P>
1.0.0 · Source§fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
1.0.0 · Source§fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
1.0.0 · Source§fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
1.0.0 · Source§fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
1.57.0 · Source§fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
1.0.0 · Source§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
n elements. Read more1.0.0 · Source§fn take(self, n: usize) -> Take<Self>where
Self: Sized,
fn take(self, n: usize) -> Take<Self>where
Self: Sized,
n elements, or fewer
if the underlying iterator ends sooner. Read more1.0.0 · Source§fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
1.29.0 · Source§fn flatten(self) -> Flatten<Self>
fn flatten(self) -> Flatten<Self>
Source§fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
iter_map_windows)f for each contiguous window of size N over
self and returns an iterator over the outputs of f. Like slice::windows(),
the windows during mapping overlap as well. Read more1.0.0 · Source§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Iterator. Read moreSource§fn try_collect<B>(
&mut self,
) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
fn try_collect<B>( &mut self, ) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
iterator_try_collect)Source§fn collect_into<E>(self, collection: &mut E) -> &mut E
fn collect_into<E>(self, collection: &mut E) -> &mut E
iter_collect_into)1.0.0 · Source§fn partition<B, F>(self, f: F) -> (B, B)
fn partition<B, F>(self, f: F) -> (B, B)
Source§fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
iter_partition_in_place)true precede all those that return false.
Returns the number of true elements found. Read moreSource§fn is_partitioned<P>(self, predicate: P) -> bool
fn is_partitioned<P>(self, predicate: P) -> bool
iter_is_partitioned)true precede all those that return false. Read more1.27.0 · Source§fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
1.27.0 · Source§fn try_for_each<F, R>(&mut self, f: F) -> R
fn try_for_each<F, R>(&mut self, f: F) -> R
1.0.0 · Source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
1.51.0 · Source§fn reduce<F>(self, f: F) -> Option<Self::Item>
fn reduce<F>(self, f: F) -> Option<Self::Item>
Source§fn try_reduce<R>(
&mut self,
f: impl FnMut(Self::Item, Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
fn try_reduce<R>( &mut self, f: impl FnMut(Self::Item, Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
iterator_try_reduce)1.0.0 · Source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1.30.0 · Source§fn find_map<B, F>(&mut self, f: F) -> Option<B>
fn find_map<B, F>(&mut self, f: F) -> Option<B>
Source§fn try_find<R>(
&mut self,
f: impl FnMut(&Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
fn try_find<R>( &mut self, f: impl FnMut(&Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
try_find)1.0.0 · Source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 · Source§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
1.0.0 · Source§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
1.6.0 · Source§fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · Source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
1.6.0 · Source§fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · Source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
1.0.0 · Source§fn rev(self) -> Rev<Self>where
Self: Sized + DoubleEndedIterator,
fn rev(self) -> Rev<Self>where
Self: Sized + DoubleEndedIterator,
1.0.0 · Source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
1.36.0 · Source§fn copied<'a, T>(self) -> Copied<Self>
fn copied<'a, T>(self) -> Copied<Self>
Source§fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
iter_array_chunks)N elements of the iterator at a time. Read more1.11.0 · Source§fn product<P>(self) -> P
fn product<P>(self) -> P
Source§fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
iter_order_by)Iterator with those
of another with respect to the specified comparison function. Read more1.5.0 · Source§fn partial_cmp<I>(self, other: I) -> Option<Ordering>
fn partial_cmp<I>(self, other: I) -> Option<Ordering>
PartialOrd elements of
this Iterator with those of another. The comparison works like short-circuit
evaluation, returning a result without comparing the remaining elements.
As soon as an order can be determined, the evaluation stops and a result is returned. Read moreSource§fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
iter_order_by)Iterator with those
of another with respect to the specified comparison function. Read moreSource§fn eq_by<I, F>(self, other: I, eq: F) -> bool
fn eq_by<I, F>(self, other: I, eq: F) -> bool
iter_order_by)1.5.0 · Source§fn lt<I>(self, other: I) -> bool
fn lt<I>(self, other: I) -> bool
Iterator are lexicographically
less than those of another. Read more1.5.0 · Source§fn le<I>(self, other: I) -> bool
fn le<I>(self, other: I) -> bool
Iterator are lexicographically
less or equal to those of another. Read more1.5.0 · Source§fn gt<I>(self, other: I) -> bool
fn gt<I>(self, other: I) -> bool
Iterator are lexicographically
greater than those of another. Read more1.5.0 · Source§fn ge<I>(self, other: I) -> bool
fn ge<I>(self, other: I) -> bool
Iterator are lexicographically
greater than or equal to those of another. Read more1.82.0 · Source§fn is_sorted(self) -> bool
fn is_sorted(self) -> bool
1.82.0 · Source§fn is_sorted_by<F>(self, compare: F) -> bool
fn is_sorted_by<F>(self, compare: F) -> bool
1.82.0 · Source§fn is_sorted_by_key<F, K>(self, f: F) -> bool
fn is_sorted_by_key<F, K>(self, f: F) -> bool
impl<I: Iterator + FusedIterator> FusedIterator for HintSize<I>
Auto Trait Implementations§
impl<I> Freeze for HintSize<I>where
I: Freeze,
impl<I> RefUnwindSafe for HintSize<I>where
I: RefUnwindSafe,
impl<I> Send for HintSize<I>where
I: Send,
impl<I> Sync for HintSize<I>where
I: Sync,
impl<I> Unpin for HintSize<I>where
I: Unpin,
impl<I> UnsafeUnpin for HintSize<I>where
I: UnsafeUnpin,
impl<I> UnwindSafe for HintSize<I>where
I: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<I> IntoIterator for Iwhere
I: Iterator,
impl<I> IntoIterator for Iwhere
I: Iterator,
Source§impl<T> IntoOption for T
impl<T> IntoOption for T
Source§impl<T> IntoResult for T
impl<T> IntoResult for T
Source§impl<I> SizeHinter for Iwhere
I: Iterator,
impl<I> SizeHinter for Iwhere
I: Iterator,
Source§fn try_hint_size(
self,
lower: usize,
upper: usize,
) -> Result<HintSize<Self>, InvalidSizeHint>where
Self: FusedIterator,
fn try_hint_size(
self,
lower: usize,
upper: usize,
) -> Result<HintSize<Self>, InvalidSizeHint>where
Self: FusedIterator,
FusedIterator in a HintSize that produces a SizeHint based on
lower and upper. Read moreSource§fn try_hint_min(self, lower: usize) -> Result<HintSize<Self>, InvalidSizeHint>
fn try_hint_min(self, lower: usize) -> Result<HintSize<Self>, InvalidSizeHint>
Source§fn try_exact_len(self, len: usize) -> Result<ExactLen<Self>, InvalidSizeHint>where
Self: FusedIterator,
fn try_exact_len(self, len: usize) -> Result<ExactLen<Self>, InvalidSizeHint>where
Self: FusedIterator,
FusedIterator in a ExactLen that provides ExactSizeIterator::len
based on len. Read more