gat_lending_iterator/adapters/
copied.rs

1use std::ops::Deref;
2
3use crate::LendingIterator;
4
5/// A lending iterator that copies the elements of an underlying lending iterator.
6///
7/// This `struct` is created by the [`copied`] method on [`LendingIterator`]. See
8/// its documentation for more.
9///
10/// [`LendingIterator`]: crate::LendingIterator
11/// [`copied`]: crate::LendingIterator::copied
12#[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}