backdrop_arc/
iterator_as_exact_size_iterator.rs

1/// Wrap an iterator and implement `ExactSizeIterator`
2/// assuming the underlying iterator reports lower bound equal to upper bound.
3///
4/// It does not check the size is reported correctly (except in debug mode).
5pub(crate) struct IteratorAsExactSizeIterator<I> {
6    iter: I,
7}
8
9impl<I: Iterator> IteratorAsExactSizeIterator<I> {
10    #[inline]
11    pub(crate) fn new(iter: I) -> Self {
12        let (lower, upper) = iter.size_hint();
13        debug_assert_eq!(
14            Some(lower),
15            upper,
16            "IteratorAsExactSizeIterator requires size hint lower == upper"
17        );
18        IteratorAsExactSizeIterator { iter }
19    }
20}
21
22impl<I: Iterator> Iterator for IteratorAsExactSizeIterator<I> {
23    type Item = I::Item;
24
25    #[inline]
26    fn next(&mut self) -> Option<Self::Item> {
27        self.iter.next()
28    }
29
30    #[inline]
31    fn size_hint(&self) -> (usize, Option<usize>) {
32        self.iter.size_hint()
33    }
34}
35
36impl<I: Iterator> ExactSizeIterator for IteratorAsExactSizeIterator<I> {
37    #[inline]
38    fn len(&self) -> usize {
39        let (lower, upper) = self.iter.size_hint();
40        debug_assert_eq!(
41            Some(lower),
42            upper,
43            "IteratorAsExactSizeIterator requires size hint lower == upper"
44        );
45        lower
46    }
47}