gat_lending_iterator/traits/to_lending_iterator.rs
1use crate::{IntoLending, LendRefs, LendRefsMut, Windows, WindowsMut};
2
3/// An extension trait for iterators that allows turning them into lending iterators (over windows of elements).
4pub trait ToLendingIterator: IntoIterator {
5 /// Turns this iterator into a lending iterator over windows of elements (&\[Item\]).
6 ///
7 /// `Windows` is backed by a buffer that grows to at most size * 2.
8 /// This was chosen as a compromise between memory usage and time complexity:
9 /// if the buffer was limited to size `size`, we would need to shift all the elements
10 /// on every iteration.
11 fn windows(self, size: usize) -> Windows<Self::IntoIter>
12 where
13 Self: Sized,
14 {
15 Windows::new(self.into_iter(), size)
16 }
17
18 /// Turns this iterator into a lending iterator over mutable windows of elements (&mut \[Item\]).
19 ///
20 /// `WindowsMut` is backed by a buffer that grows to at most size * 2.
21 /// This was chosen as a compromise between memory usage and time complexity:
22 /// if the buffer was limited to size `size`, we would need to shift all the elements
23 /// on every iteration.
24 fn windows_mut(self, size: usize) -> WindowsMut<Self::IntoIter>
25 where
26 Self: Sized,
27 {
28 WindowsMut::new(self.into_iter(), size)
29 }
30
31 /// Turns this iterator into a lending iterator trivially.
32 fn into_lending(self) -> IntoLending<Self::IntoIter>
33 where
34 Self: Sized,
35 {
36 IntoLending::new(self.into_iter())
37 }
38
39 /// Turns this iterator into a lending iterator that lends references
40 /// to the iterator's items.
41 fn lend_refs(self) -> LendRefs<Self::IntoIter>
42 where
43 Self: Sized,
44 {
45 LendRefs::new(self.into_iter())
46 }
47
48 /// Turns this iterator into a lending iterator that lends mutable references
49 /// to the iterator's items.
50 fn lend_refs_mut(self) -> LendRefsMut<Self::IntoIter>
51 where
52 Self: Sized,
53 {
54 LendRefsMut::new(self.into_iter())
55 }
56}
57
58impl<I: IntoIterator> ToLendingIterator for I {}