generic_arraydeque/
into_iter.rs

1use core::{fmt, iter::FusedIterator};
2
3use super::{ArrayLength, GenericArrayDeque};
4
5/// An owning iterator over the elements of a [`GenericArrayDeque`].
6///
7/// This `struct` is created by the [`into_iter`] method on [`GenericArrayDeque`]
8/// (provided by the [`IntoIterator`] trait). See its documentation for more.
9///
10/// [`GenericArrayDeque`]: crate::GenericArrayDeque
11/// [`into_iter`]: GenericArrayDeque::into_iter
12#[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}