Skip to main content

lender/adapters/
copied.rs

1use core::iter::FusedIterator;
2
3use crate::{DoubleEndedLender, ExactSizeLender, FusedLender, Lender, Lending};
4
5/// An iterator that copies the elements of an underlying lender.
6///
7/// This `struct` is created by the [`copied()`](crate::Lender::copied) method
8/// on [`Lender`].
9#[derive(Clone, Debug)]
10#[must_use = "iterators are lazy and do nothing unless consumed"]
11pub struct Copied<L> {
12    pub(crate) lender: L,
13}
14
15impl<L> Copied<L> {
16    #[inline(always)]
17    pub(crate) fn new(lender: L) -> Copied<L> {
18        Copied { lender }
19    }
20
21    /// Returns the inner lender.
22    #[inline(always)]
23    pub fn into_inner(self) -> L {
24        self.lender
25    }
26}
27
28impl<T, L> Iterator for Copied<L>
29where
30    L: Lender,
31    T: Copy,
32    L: for<'all> Lending<'all, Lend = &'all T>,
33{
34    type Item = T;
35    #[inline]
36    fn next(&mut self) -> Option<Self::Item> {
37        self.lender.next().copied()
38    }
39
40    #[inline(always)]
41    fn size_hint(&self) -> (usize, Option<usize>) {
42        self.lender.size_hint()
43    }
44
45    #[inline]
46    fn fold<B, F>(self, init: B, mut f: F) -> B
47    where
48        F: FnMut(B, Self::Item) -> B,
49    {
50        self.lender.fold(init, |acc, x| f(acc, *x))
51    }
52
53    #[inline(always)]
54    fn count(self) -> usize {
55        self.lender.count()
56    }
57
58    #[inline]
59    fn nth(&mut self, n: usize) -> Option<Self::Item> {
60        self.lender.nth(n).copied()
61    }
62}
63
64impl<T, L> DoubleEndedIterator for Copied<L>
65where
66    L: DoubleEndedLender,
67    T: Copy,
68    L: for<'all> Lending<'all, Lend = &'all T>,
69{
70    #[inline]
71    fn next_back(&mut self) -> Option<Self::Item> {
72        self.lender.next_back().copied()
73    }
74
75    #[inline]
76    fn rfold<B, F>(self, init: B, mut f: F) -> B
77    where
78        F: FnMut(B, Self::Item) -> B,
79    {
80        self.lender.rfold(init, |acc, x| f(acc, *x))
81    }
82}
83
84impl<T, L> ExactSizeIterator for Copied<L>
85where
86    L: ExactSizeLender,
87    T: Copy,
88    L: for<'all> Lending<'all, Lend = &'all T>,
89{
90    #[inline(always)]
91    fn len(&self) -> usize {
92        self.lender.len()
93    }
94}
95
96impl<T, L> FusedIterator for Copied<L>
97where
98    L: FusedLender,
99    T: Copy,
100    L: for<'all> Lending<'all, Lend = &'all T>,
101{
102}
103
104impl<L> Default for Copied<L>
105where
106    L: Default,
107{
108    #[inline(always)]
109    fn default() -> Self {
110        Self::new(L::default())
111    }
112}