Skip to main content

lender/traits/
exact_size.rs

1use crate::*;
2
3/// The [`Lender`] version of [`core::iter::ExactSizeIterator`].
4pub trait ExactSizeLender: Lender {
5    /// Returns the exact remaining length of the lender.
6    ///
7    /// See [`ExactSizeIterator::len`].
8    #[inline(always)]
9    fn len(&self) -> usize {
10        let (lower, upper) = self.size_hint();
11        assert_eq!(upper, Some(lower));
12        lower
13    }
14
15    /// Returns `true` if the lender has no more elements.
16    #[inline(always)]
17    fn is_empty(&self) -> bool {
18        self.len() == 0
19    }
20}
21
22impl<I: ExactSizeLender> ExactSizeLender for &mut I {
23    #[inline(always)]
24    fn len(&self) -> usize {
25        (**self).len()
26    }
27
28    #[inline(always)]
29    fn is_empty(&self) -> bool {
30        (**self).is_empty()
31    }
32}
33
34/// The [`FallibleLender`] version of [`core::iter::ExactSizeIterator`].
35pub trait ExactSizeFallibleLender: FallibleLender {
36    /// Returns the exact remaining length of the lender.
37    ///
38    /// See [`ExactSizeLender::len`].
39    #[inline(always)]
40    fn len(&self) -> usize {
41        let (lower, upper) = self.size_hint();
42        assert_eq!(upper, Some(lower));
43        lower
44    }
45
46    /// Returns `true` if the lender has no more elements.
47    #[inline(always)]
48    fn is_empty(&self) -> bool {
49        self.len() == 0
50    }
51}
52
53impl<I: ExactSizeFallibleLender> ExactSizeFallibleLender for &mut I {
54    #[inline(always)]
55    fn len(&self) -> usize {
56        (**self).len()
57    }
58
59    #[inline(always)]
60    fn is_empty(&self) -> bool {
61        (**self).is_empty()
62    }
63}