lender/adapters/
copied.rs1use core::iter::FusedIterator;
2
3use crate::{DoubleEndedLender, ExactSizeLender, FusedLender, Lender, Lending};
4
5#[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 #[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}