generic_arraydeque/
iter_mut.rs1use core::{fmt, iter::FusedIterator, mem, slice};
2
3pub 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 pub fn into_slices(self) -> (&'a mut [T], &'a mut [T]) {
49 (self.i1.into_slice(), self.i2.into_slice())
50 }
51
52 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 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 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 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 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}