gat_lending_iterator/adapters/
copied.rs1use std::ops::Deref;
2
3use crate::LendingIterator;
4
5#[derive(Clone, Debug)]
13#[must_use = "iterators are lazy and do nothing unless consumed"]
14pub struct Copied<I> {
15 iter: I,
16}
17
18impl<I> Copied<I> {
19 pub(crate) fn new(iter: I) -> Copied<I> {
20 Copied { iter }
21 }
22}
23
24impl<I> LendingIterator for Copied<I>
25where
26 I: LendingIterator,
27 for<'a> I::Item<'a>: Deref,
28 for<'a> <I::Item<'a> as Deref>::Target: Copy,
29{
30 type Item<'a>
31 = <I::Item<'a> as Deref>::Target
32 where
33 Self: 'a;
34
35 fn next(&mut self) -> Option<Self::Item<'_>> {
36 self.iter.next().map(|item| *item)
37 }
38
39 #[inline]
40 fn size_hint(&self) -> (usize, Option<usize>) {
41 self.iter.size_hint()
42 }
43
44 #[inline]
45 fn nth(&mut self, n: usize) -> Option<Self::Item<'_>> {
46 self.iter.nth(n).map(|item| *item)
47 }
48
49 #[inline]
50 fn count(self) -> usize {
51 self.iter.count()
52 }
53}
54
55pub struct IntoIter<I> {
56 iter: I,
57}
58
59impl<I, T> Iterator for IntoIter<I>
60where
61 I: LendingIterator,
62 for<'a> I::Item<'a>: Deref<Target = T>,
63 T: Copy,
64{
65 type Item = T;
66
67 fn next(&mut self) -> Option<Self::Item> {
68 self.iter.next().map(|item| *item)
69 }
70}
71
72impl<I, T> IntoIterator for Copied<I>
73where
74 I: LendingIterator,
75 for<'a> I::Item<'a>: Deref<Target = T>,
76 T: Copy,
77{
78 type Item = T;
79 type IntoIter = IntoIter<I>;
80
81 fn into_iter(self) -> Self::IntoIter {
82 IntoIter { iter: self.iter }
83 }
84}
85
86#[cfg(test)]
87mod tests {
88 use crate::{LendingIterator, ToLendingIterator};
89
90 #[test]
91 fn copied_basic() {
92 let data = vec![1, 2, 3];
93 let result: Vec<_> = data.lend_refs().copied().into_iter().collect();
94 assert_eq!(result, vec![1, 2, 3]);
95 }
96}