generic_arraydeque/
iter_mut.rs

1use core::{fmt, iter::FusedIterator, mem, slice};
2
3/// A mutable iterator over the elements of a [`GenericArrayDeque`](crate::GenericArrayDeque).
4///
5/// This `struct` is created by the [`iter_mut`] method on [`super::GenericArrayDeque`]. See its
6/// documentation for more.
7///
8/// [`iter_mut`]: super::GenericArrayDeque::iter_mut
9pub struct IterMut<'a, T> {
10  i1: slice::IterMut<'a, T>,
11  i2: slice::IterMut<'a, T>,
12}
13
14impl<'a, T> IterMut<'a, T> {
15  pub(super) fn new(i1: slice::IterMut<'a, T>, i2: slice::IterMut<'a, T>) -> Self {
16    Self { i1, i2 }
17  }
18
19  /// Views the underlying data as a pair of subslices of the original data.
20  ///
21  /// The slices contain, in order, the contents of the deque not yet yielded
22  /// by the iterator.
23  ///
24  /// To avoid creating `&mut` references that alias, this is forced to
25  /// consume the iterator.
26  ///
27  /// # Examples
28  ///
29  /// ```
30  /// use generic_arraydeque::{GenericArrayDeque, typenum::U6};
31  ///
32  /// let mut deque = GenericArrayDeque::<u32, U6>::new();
33  /// for value in 0..5 {
34  ///     assert!(deque.push_back(value).is_none());
35  /// }
36  ///
37  /// let mut iter = deque.iter_mut();
38  /// iter.next();
39  ///
40  /// let (left, right) = iter.into_slices();
41  /// if let Some(first) = left.first_mut() {
42  ///     *first = 42;
43  /// }
44  /// assert!(right.is_empty());
45  /// drop((left, right));
46  /// assert_eq!(deque.get(1), Some(&42));
47  /// ```
48  pub fn into_slices(self) -> (&'a mut [T], &'a mut [T]) {
49    (self.i1.into_slice(), self.i2.into_slice())
50  }
51
52  /// Views the underlying data as a pair of subslices of the original data.
53  ///
54  /// The slices contain, in order, the contents of the deque not yet yielded
55  /// by the iterator.
56  ///
57  /// To avoid creating `&mut [T]` references that alias, the returned slices
58  /// borrow their lifetimes from the iterator the method is applied on.
59  ///
60  /// # Examples
61  ///
62  /// ```
63  /// use generic_arraydeque::{GenericArrayDeque, typenum::U4};
64  ///
65  /// let mut deque = GenericArrayDeque::<u32, U4>::new();
66  /// for value in 0..3 {
67  ///     assert!(deque.push_back(value).is_none());
68  /// }
69  ///
70  /// let mut iter = deque.iter_mut();
71  /// iter.next();
72  ///
73  /// assert_eq!(iter.as_slices(), (&[1, 2][..], &[][..]));
74  /// ```
75  pub fn as_slices(&self) -> (&[T], &[T]) {
76    (self.i1.as_slice(), self.i2.as_slice())
77  }
78}
79
80impl<T: fmt::Debug> fmt::Debug for IterMut<'_, T> {
81  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
82    f.debug_tuple("IterMut")
83      .field(&self.i1.as_slice())
84      .field(&self.i2.as_slice())
85      .finish()
86  }
87}
88
89#[rustversion::since(1.70)]
90impl<T> Default for IterMut<'_, T> {
91  /// Creates an empty iterator.
92  ///
93  /// ```
94  /// use generic_arraydeque::IterMut;
95  ///
96  /// let iter: IterMut<'_, u8> = Default::default();
97  /// assert_eq!(iter.len(), 0);
98  /// ```
99  fn default() -> Self {
100    IterMut {
101      i1: Default::default(),
102      i2: Default::default(),
103    }
104  }
105}
106
107impl<'a, T> Iterator for IterMut<'a, T> {
108  type Item = &'a mut T;
109
110  #[inline]
111  fn next(&mut self) -> Option<&'a mut T> {
112    match self.i1.next() {
113      Some(val) => Some(val),
114      None => {
115        // most of the time, the iterator will either always
116        // call next(), or always call next_back(). By swapping
117        // the iterators once the first one is empty, we ensure
118        // that the first branch is taken as often as possible,
119        // without sacrificing correctness, as i1 is empty anyways
120        mem::swap(&mut self.i1, &mut self.i2);
121        self.i1.next()
122      }
123    }
124  }
125
126  #[inline]
127  fn size_hint(&self) -> (usize, Option<usize>) {
128    let len = self.len();
129    (len, Some(len))
130  }
131
132  fn fold<Acc, F>(self, accum: Acc, mut f: F) -> Acc
133  where
134    F: FnMut(Acc, Self::Item) -> Acc,
135  {
136    let accum = self.i1.fold(accum, &mut f);
137    self.i2.fold(accum, &mut f)
138  }
139
140  #[inline]
141  fn last(mut self) -> Option<&'a mut T> {
142    self.next_back()
143  }
144}
145
146impl<'a, T> DoubleEndedIterator for IterMut<'a, T> {
147  #[inline]
148  fn next_back(&mut self) -> Option<&'a mut T> {
149    match self.i2.next_back() {
150      Some(val) => Some(val),
151      None => {
152        // most of the time, the iterator will either always
153        // call next(), or always call next_back(). By swapping
154        // the iterators once the first one is empty, we ensure
155        // that the first branch is taken as often as possible,
156        // without sacrificing correctness, as i2 is empty anyways
157        mem::swap(&mut self.i1, &mut self.i2);
158        self.i2.next_back()
159      }
160    }
161  }
162
163  fn rfold<Acc, F>(self, accum: Acc, mut f: F) -> Acc
164  where
165    F: FnMut(Acc, Self::Item) -> Acc,
166  {
167    let accum = self.i2.rfold(accum, &mut f);
168    self.i1.rfold(accum, &mut f)
169  }
170}
171
172impl<T> ExactSizeIterator for IterMut<'_, T> {
173  fn len(&self) -> usize {
174    self.i1.len() + self.i2.len()
175  }
176}
177
178impl<T> FusedIterator for IterMut<'_, T> {}
179
180#[cfg(test)]
181mod tests {
182  use crate::{typenum::U5, GenericArrayDeque};
183
184  #[test]
185  fn into_slices_allows_mutation() {
186    let mut deque = GenericArrayDeque::<_, U5>::new();
187    for value in 0..5 {
188      assert!(deque.push_back(value).is_none());
189    }
190    assert_eq!(deque.pop_front(), Some(0));
191    assert!(deque.push_back(5).is_none());
192
193    let mut iter = deque.iter_mut();
194    assert_eq!(iter.next().map(|v| *v), Some(1));
195
196    let (front, back) = iter.into_slices();
197    front[0] = 10;
198    if let Some(last) = back.first_mut() {
199      *last = 50;
200    }
201    // drop((front, back));
202
203    assert_eq!(deque[0], 1);
204    assert_eq!(deque[1], 10);
205    assert_eq!(deque[4], 50);
206  }
207
208  #[test]
209  fn as_slices_reflect_remaining_segments() {
210    let mut deque = GenericArrayDeque::<_, U5>::new();
211    for value in 0..5 {
212      assert!(deque.push_back(value).is_none());
213    }
214    assert_eq!(deque.pop_front(), Some(0));
215    assert!(deque.push_back(5).is_none());
216
217    let mut iter = deque.iter_mut();
218    iter.next();
219    let (front, back) = iter.as_slices();
220    assert_eq!(front, &[2, 3, 4]);
221    assert_eq!(back, &[5]);
222  }
223
224  #[test]
225  fn fold_and_rfold_visit_all_items() {
226    let mut deque = GenericArrayDeque::<_, U5>::new();
227    for value in 0..5 {
228      assert!(deque.push_back(value).is_none());
229    }
230    {
231      let sum = deque.iter_mut().fold(0, |acc, item| acc + *item);
232      assert_eq!(sum, 10);
233    }
234    {
235      let sum = deque.iter_mut().rfold(0, |acc, item| acc + *item);
236      assert_eq!(sum, 10);
237    }
238  }
239
240  #[test]
241  fn size_hint_tracks_progress() {
242    let mut deque = GenericArrayDeque::<_, U5>::new();
243    for value in 0..5 {
244      assert!(deque.push_back(value).is_none());
245    }
246    let mut iter = deque.iter_mut();
247    assert_eq!(iter.size_hint(), (5, Some(5)));
248    iter.next();
249    assert_eq!(iter.size_hint(), (4, Some(4)));
250    iter.next_back();
251    assert_eq!(iter.size_hint(), (3, Some(3)));
252  }
253
254  #[test]
255  fn last_allows_mutating_tail() {
256    let mut deque = GenericArrayDeque::<_, U5>::new();
257    for value in 0..5 {
258      assert!(deque.push_back(value).is_none());
259    }
260    if let Some(last) = deque.iter_mut().last() {
261      *last = 99;
262    }
263    assert_eq!(deque[4], 99);
264  }
265
266  #[rustversion::since(1.70)]
267  #[test]
268  fn default_is_empty() {
269    use super::IterMut;
270
271    let iter: IterMut<'static, u8> = Default::default();
272    assert_eq!(iter.len(), 0);
273    assert_eq!(iter.size_hint(), (0, Some(0)));
274  }
275}