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
89impl<T> Default for IterMut<'_, T> {
90 fn default() -> Self {
99 IterMut {
100 i1: Default::default(),
101 i2: Default::default(),
102 }
103 }
104}
105
106impl<'a, T> Iterator for IterMut<'a, T> {
107 type Item = &'a mut T;
108
109 #[inline]
110 fn next(&mut self) -> Option<&'a mut T> {
111 match self.i1.next() {
112 Some(val) => Some(val),
113 None => {
114 mem::swap(&mut self.i1, &mut self.i2);
120 self.i1.next()
121 }
122 }
123 }
124
125 #[inline]
126 fn size_hint(&self) -> (usize, Option<usize>) {
127 let len = self.len();
128 (len, Some(len))
129 }
130
131 fn fold<Acc, F>(self, accum: Acc, mut f: F) -> Acc
132 where
133 F: FnMut(Acc, Self::Item) -> Acc,
134 {
135 let accum = self.i1.fold(accum, &mut f);
136 self.i2.fold(accum, &mut f)
137 }
138
139 #[inline]
140 fn last(mut self) -> Option<&'a mut T> {
141 self.next_back()
142 }
143}
144
145impl<'a, T> DoubleEndedIterator for IterMut<'a, T> {
146 #[inline]
147 fn next_back(&mut self) -> Option<&'a mut T> {
148 match self.i2.next_back() {
149 Some(val) => Some(val),
150 None => {
151 mem::swap(&mut self.i1, &mut self.i2);
157 self.i2.next_back()
158 }
159 }
160 }
161
162 fn rfold<Acc, F>(self, accum: Acc, mut f: F) -> Acc
163 where
164 F: FnMut(Acc, Self::Item) -> Acc,
165 {
166 let accum = self.i2.rfold(accum, &mut f);
167 self.i1.rfold(accum, &mut f)
168 }
169}
170
171impl<T> ExactSizeIterator for IterMut<'_, T> {
172 fn len(&self) -> usize {
173 self.i1.len() + self.i2.len()
174 }
175}
176
177impl<T> FusedIterator for IterMut<'_, T> {}
178
179#[cfg(test)]
180mod tests {
181 use crate::{ArrayDeque, typenum::U5};
182
183 #[test]
184 fn into_slices_allows_mutation() {
185 let mut deque = ArrayDeque::<_, U5>::new();
186 for value in 0..5 {
187 assert!(deque.push_back(value).is_none());
188 }
189 assert_eq!(deque.pop_front(), Some(0));
190 assert!(deque.push_back(5).is_none());
191
192 let mut iter = deque.iter_mut();
193 assert_eq!(iter.next().map(|v| *v), Some(1));
194
195 let (front, back) = iter.into_slices();
196 front[0] = 10;
197 if let Some(last) = back.first_mut() {
198 *last = 50;
199 }
200 assert_eq!(deque[0], 1);
203 assert_eq!(deque[1], 10);
204 assert_eq!(deque[4], 50);
205 }
206
207 #[test]
208 fn as_slices_reflect_remaining_segments() {
209 let mut deque = ArrayDeque::<_, U5>::new();
210 for value in 0..5 {
211 assert!(deque.push_back(value).is_none());
212 }
213 assert_eq!(deque.pop_front(), Some(0));
214 assert!(deque.push_back(5).is_none());
215
216 let mut iter = deque.iter_mut();
217 iter.next();
218 let (front, back) = iter.as_slices();
219 assert_eq!(front, &[2, 3, 4]);
220 assert_eq!(back, &[5]);
221 }
222
223 #[test]
224 fn fold_and_rfold_visit_all_items() {
225 let mut deque = ArrayDeque::<_, U5>::new();
226 for value in 0..5 {
227 assert!(deque.push_back(value).is_none());
228 }
229 {
230 let sum = deque.iter_mut().fold(0, |acc, item| acc + *item);
231 assert_eq!(sum, 10);
232 }
233 {
234 let sum = deque.iter_mut().rfold(0, |acc, item| acc + *item);
235 assert_eq!(sum, 10);
236 }
237 }
238
239 #[test]
240 fn size_hint_tracks_progress() {
241 let mut deque = ArrayDeque::<_, U5>::new();
242 for value in 0..5 {
243 assert!(deque.push_back(value).is_none());
244 }
245 let mut iter = deque.iter_mut();
246 assert_eq!(iter.size_hint(), (5, Some(5)));
247 iter.next();
248 assert_eq!(iter.size_hint(), (4, Some(4)));
249 iter.next_back();
250 assert_eq!(iter.size_hint(), (3, Some(3)));
251 }
252
253 #[test]
254 fn last_allows_mutating_tail() {
255 let mut deque = ArrayDeque::<_, U5>::new();
256 for value in 0..5 {
257 assert!(deque.push_back(value).is_none());
258 }
259 if let Some(last) = deque.iter_mut().last() {
260 *last = 99;
261 }
262 assert_eq!(deque[4], 99);
263 }
264
265 #[test]
266 fn default_is_empty() {
267 use super::IterMut;
268
269 let iter: IterMut<'static, u8> = Default::default();
270 assert_eq!(iter.len(), 0);
271 assert_eq!(iter.size_hint(), (0, Some(0)));
272 }
273}