generic_arraydeque/
into_iter.rs1use core::{fmt, iter::FusedIterator};
2
3use super::{ArrayLength, GenericArrayDeque};
4
5#[derive(Clone)]
13pub struct IntoIter<T, N>
14where
15 N: ArrayLength,
16{
17 inner: GenericArrayDeque<T, N>,
18}
19
20impl<T, N: ArrayLength> IntoIter<T, N> {
21 pub(super) fn new(inner: GenericArrayDeque<T, N>) -> Self {
22 IntoIter { inner }
23 }
24}
25
26impl<T: fmt::Debug, N: ArrayLength> fmt::Debug for IntoIter<T, N> {
27 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28 f.debug_tuple("IntoIter").field(&self.inner).finish()
29 }
30}
31
32impl<T, N: ArrayLength> Iterator for IntoIter<T, N> {
33 type Item = T;
34
35 #[inline]
36 fn next(&mut self) -> Option<T> {
37 self.inner.pop_front()
38 }
39
40 #[inline]
41 fn size_hint(&self) -> (usize, Option<usize>) {
42 let len = self.inner.len();
43 (len, Some(len))
44 }
45
46 #[inline]
47 fn count(self) -> usize {
48 self.inner.len
49 }
50
51 #[inline]
52 fn last(mut self) -> Option<Self::Item> {
53 self.inner.pop_back()
54 }
55}
56
57impl<T, N: ArrayLength> DoubleEndedIterator for IntoIter<T, N> {
58 #[inline]
59 fn next_back(&mut self) -> Option<T> {
60 self.inner.pop_back()
61 }
62}
63
64impl<T, N: ArrayLength> ExactSizeIterator for IntoIter<T, N> {
65 #[inline]
66 fn len(&self) -> usize {
67 self.inner.len()
68 }
69}
70
71impl<T, N: ArrayLength> FusedIterator for IntoIter<T, N> {}
72
73#[cfg(test)]
74mod tests {
75 use super::IntoIter;
76 use crate::{
77 typenum::{U4, U8},
78 GenericArrayDeque,
79 };
80
81 #[test]
82 fn iterator_behaves_like_queue() {
83 let mut deque = GenericArrayDeque::<_, U8>::new();
84 for value in 0..5 {
85 assert!(deque.push_back(value).is_none());
86 }
87
88 let mut iter = IntoIter::new(deque.clone());
89 assert_eq!(iter.size_hint(), (5, Some(5)));
90 assert_eq!(iter.next(), Some(0));
91 assert_eq!(iter.next_back(), Some(4));
92 assert_eq!(iter.len(), 3);
93 assert_eq!(iter.last(), Some(3));
94
95 let count = deque.into_iter().count();
96 assert_eq!(count, 5);
97 }
98
99 #[allow(clippy::unnecessary_fold)]
100 #[test]
101 fn fold_and_last_cover_all_items() {
102 let mut deque = GenericArrayDeque::<_, U4>::new();
103 for value in 0..4 {
104 assert!(deque.push_back(value).is_none());
105 }
106 let sum = IntoIter::new(deque.clone()).fold(0, |acc, value| acc + value);
107 assert_eq!(sum, 6);
108
109 let last = IntoIter::new(deque).last();
110 assert_eq!(last, Some(3));
111 }
112
113 #[test]
114 fn size_hint_shrinks_as_items_consumed() {
115 let mut deque = GenericArrayDeque::<_, U4>::new();
116 for value in 0..4 {
117 assert!(deque.push_back(value).is_none());
118 }
119 let mut iter = IntoIter::new(deque);
120 assert_eq!(iter.size_hint(), (4, Some(4)));
121 iter.next();
122 assert_eq!(iter.size_hint(), (3, Some(3)));
123 iter.next_back();
124 assert_eq!(iter.size_hint(), (2, Some(2)));
125 }
126}