vec_entries/lib.rs
1//! Entry API for iterating over and removing elements from a `Vec`.
2//!
3//! ## Description
4//!
5//! Sometimes you want to do efficently remove and modify elements of a `Vec` in a slightly more
6//! complex way than [`Vec::dedup_by`], [`Vec::retain`], or [`Vec::drain`] enable. This crate aims
7//! to target a similar, but more expansive functionality.
8//!
9//! ## Usage
10//!
11//! Just import the extension trait and call the new method. The [`EntriesExt::entries`] enables
12//! iterating across elements, mutating, removing, and re-inserting as needed. Like
13//! [`Vec::dedup_by`] this is done by passing in a function which take an [`Entries`] object and
14//! returns anything.
15//!
16//! ```
17//! use vec_entries::EntriesExt;
18//!
19//! let mut v = vec![1, 2, 3];
20//! let c = v.entries(.., |e| {
21//! let a = e.remove().unwrap(); // Remove the `1`
22//! let b = e.remove_back().unwrap(); // Remove the `3`
23//! e.try_insert_outside(0); // Insert a `0` where we removed the `1`
24//! a + b
25//! });
26//! assert_eq!(c, 4);
27//! assert_eq!(v, [0, 2]);
28//! ```
29#![no_std]
30
31extern crate alloc;
32
33use core::{
34 iter::FusedIterator,
35 ops::{Bound, Deref, DerefMut, RangeBounds},
36 ptr::{self, drop_in_place},
37};
38
39use alloc::vec::Vec;
40
41/// A view into the elements of a [`Vec`]
42pub struct Entries<'a, T> {
43 read_head: usize,
44 write_head: usize,
45 read_tail: usize,
46 write_tail: usize,
47 vec: &'a mut Vec<T>,
48}
49
50impl<'a, T> Drop for Entries<'a, T> {
51 fn drop(&mut self) {
52 self.cleanup();
53 }
54}
55
56pub struct Entry<'a, 'b, T> {
57 entries: &'b mut Entries<'a, T>,
58 front: bool,
59}
60
61impl<'a, 'b, T> Entry<'a, 'b, T> {
62 fn shift_front(self) -> &'a mut T {
63 debug_assert!(self.front);
64
65 let e = self.entries;
66 let read_ptr = unsafe { e.vec.as_mut_ptr().add(e.read_head) };
67 let write_ptr = unsafe { e.vec.as_mut_ptr().add(e.write_head) };
68
69 if e.read_head != e.write_head {
70 unsafe {
71 ptr::copy_nonoverlapping(read_ptr, write_ptr, 1);
72 }
73 }
74
75 e.read_head += 1;
76 e.write_head += 1;
77
78 unsafe { &mut *write_ptr }
79 }
80
81 fn shift_back(self) -> &'a mut T {
82 debug_assert!(!self.front);
83
84 let e = self.entries;
85
86 e.read_tail -= 1;
87 e.write_tail -= 1;
88
89 let read_ptr = unsafe { e.vec.as_mut_ptr().add(e.read_tail) };
90 let write_ptr = unsafe { e.vec.as_mut_ptr().add(e.write_tail) };
91
92 if e.read_tail != e.write_tail {
93 unsafe {
94 ptr::copy_nonoverlapping(read_ptr, write_ptr, 1);
95 }
96 }
97
98 unsafe { &mut *write_ptr }
99 }
100
101 fn remove_front(self) -> T {
102 debug_assert!(self.front);
103
104 let e = self.entries;
105
106 let v = unsafe { ptr::read(e.vec.as_mut_ptr().add(e.read_head)) };
107 e.read_head += 1;
108
109 v
110 }
111
112 fn remove_back(mut self) -> T {
113 debug_assert!(!self.front);
114
115 let e = &mut self.entries;
116
117 e.read_tail -= 1;
118 let v = unsafe { ptr::read(e.vec.as_mut_ptr().add(e.read_tail)) };
119
120 v
121 }
122
123 /// Shift the the view inward by one, returning a mutable reference to the now
124 /// excluded element.
125 #[inline]
126 pub fn shift(self) -> &'a mut T {
127 if self.front {
128 self.shift_front()
129 } else {
130 self.shift_back()
131 }
132 }
133
134 /// Remove the element from the underlying `Vec`, returning the now removed item.
135 #[inline]
136 pub fn remove(self) -> T {
137 if self.front {
138 self.remove_front()
139 } else {
140 self.remove_back()
141 }
142 }
143}
144
145impl<'a, 'b, T> Deref for Entry<'a, 'b, T> {
146 type Target = T;
147 fn deref(&self) -> &Self::Target {
148 let entries = &self.entries;
149 unsafe {
150 if self.front {
151 entries.vec.get_unchecked(entries.read_head)
152 } else {
153 entries.vec.get_unchecked(entries.read_tail - 1)
154 }
155 }
156 }
157}
158
159impl<'a, 'b, T> DerefMut for Entry<'a, 'b, T> {
160 fn deref_mut(&mut self) -> &mut Self::Target {
161 let entries = &mut self.entries;
162 unsafe {
163 if self.front {
164 entries.vec.get_unchecked_mut(entries.read_head)
165 } else {
166 entries.vec.get_unchecked_mut(entries.read_tail - 1)
167 }
168 }
169 }
170}
171
172impl<'a, T> Entries<'a, T> {
173 fn start(start: Bound<usize>) -> usize {
174 match start {
175 Bound::Unbounded => 0,
176 Bound::Included(v) => v,
177 Bound::Excluded(v) => v + 1,
178 }
179 }
180
181 fn end(vec: &Vec<T>, end: Bound<usize>) -> usize {
182 match end {
183 Bound::Unbounded => vec.len(),
184 Bound::Included(v) => v + 1,
185 Bound::Excluded(v) => v,
186 }
187 }
188
189 fn new(vec: &'a mut Vec<T>, start: Bound<usize>, end: Bound<usize>) -> Self {
190 let start = Self::start(start);
191 let end = Self::end(vec, end);
192 Self {
193 read_head: start,
194 write_head: start,
195 read_tail: end,
196 write_tail: end,
197 vec,
198 }
199 }
200
201 fn cleanup(&mut self) {
202 let count_head = self.read_tail - self.read_head;
203 let count_tail = self.vec.len() - self.write_tail;
204
205 unsafe {
206 let src = self.vec.as_ptr().add(self.read_head);
207 let dst = self.vec.as_mut_ptr().add(self.write_head);
208 ptr::copy(src, dst, count_head);
209 let dst = dst.add(count_head);
210
211 let src = self.vec.as_ptr().add(self.write_tail);
212 ptr::copy(src, dst, count_tail);
213 let dst = dst.add(count_tail);
214
215 let len = dst.offset_from(self.vec.as_ptr()) as usize;
216 self.vec.set_len(len);
217 }
218 }
219
220 /// Get the remaining elements of the view as a mutable slice.
221 ///
222 /// # Examples
223 ///
224 /// ```
225 /// use vec_entries::EntriesExt;
226 ///
227 /// let mut v = vec![0, 1, 2];
228 /// v.entries(.., |e| {
229 /// assert_eq!(e.remaining(), [0, 1, 2]);
230 /// e.shift();
231 /// assert_eq!(e.remaining(), [1, 2]);
232 /// e.shift();
233 /// assert_eq!(e.remaining(), [2]);
234 /// });
235 /// ```
236 pub fn remaining(&mut self) -> &mut [T] {
237 unsafe { self.vec.get_unchecked_mut(self.read_head..self.read_tail) }
238 }
239
240 /// Get the number of elements still present in the view.
241 ///
242 /// # Examples
243 ///
244 /// ```
245 /// use vec_entries::EntriesExt;
246 ///
247 /// let mut v = vec![0, 1, 2];
248 /// v.entries(.., |e| {
249 /// assert_eq!(e.remaining_len(), 3);
250 /// e.shift();
251 /// assert_eq!(e.remaining_len(), 2);
252 /// e.shift();
253 /// assert_eq!(e.remaining_len(), 1);
254 /// });
255 /// ```
256 pub const fn remaining_len(&self) -> usize {
257 self.read_tail - self.read_head
258 }
259
260 /// Get the length of portion of the underlying `Vec` before the view.
261 ///
262 /// # Examples
263 ///
264 /// ```
265 /// use vec_entries::EntriesExt;
266 ///
267 /// let mut v = vec![0, 1, 2];
268 /// v.entries(.., |e| {
269 /// assert_eq!(e.len_before(), 0);
270 /// e.shift();
271 /// assert_eq!(e.len_before(), 1);
272 /// e.shift();
273 /// assert_eq!(e.len_before(), 2);
274 /// });
275 /// ```
276 pub const fn len_before(&self) -> usize {
277 self.write_head
278 }
279
280 /// Get the length of portion of the underlying `Vec` after the view.
281 ///
282 /// # Examples
283 ///
284 /// ```
285 /// use vec_entries::EntriesExt;
286 ///
287 /// let mut v = vec![0, 1, 2];
288 /// v.entries(.., |e| {
289 /// assert_eq!(e.len_after(), 0);
290 /// e.shift_back();
291 /// assert_eq!(e.len_after(), 1);
292 /// e.shift_back();
293 /// assert_eq!(e.len_after(), 2);
294 /// });
295 /// ```
296 pub fn len_after(&self) -> usize {
297 self.vec.len() - self.write_tail
298 }
299
300 /// Remove and drop all remaining elements in the view.
301 ///
302 /// # Examples
303 ///
304 /// ```
305 /// use vec_entries::EntriesExt;
306 ///
307 /// let mut v = vec![0, 1, 2, 3, 4];
308 /// v.entries(.., |e| {
309 /// e.shift(); // shift `0` out of view
310 /// e.shift_back(); // shift `4` out of view
311 /// e.clear(); // Drop 1, 2, and 3
312 /// });
313 /// assert_eq!(v, [0, 4]);
314 /// ```
315 pub fn clear(&mut self) {
316 while self.read_head != self.read_tail {
317 unsafe { drop_in_place(self.vec.as_mut_ptr().add(self.read_head)) }
318 self.read_head += 1;
319 }
320 }
321
322 /// Get an entry for the element at the head of the view.
323 ///
324 /// Returns `None` if the view is empty.
325 ///
326 /// # Examples
327 ///
328 /// ```
329 /// use vec_entries::EntriesExt;
330 ///
331 /// let mut v = vec![0, 1, 2];
332 /// v.entries(.., |e| {
333 /// let f = e.front().unwrap();
334 /// assert_eq!(*f, 0);
335 /// f.shift();
336 ///
337 /// let f = e.front().unwrap();
338 /// assert_eq!(*f, 1);
339 /// f.shift();
340 ///
341 /// let f = e.front().unwrap();
342 /// assert_eq!(*f, 2);
343 /// f.shift();
344 ///
345 /// assert!(e.front().is_none());
346 /// });
347 /// ```
348 #[inline]
349 pub fn front<'b>(&'b mut self) -> Option<Entry<'a, 'b, T>> {
350 if self.read_head == self.read_tail {
351 None
352 } else {
353 Some(Entry {
354 entries: self,
355 front: true,
356 })
357 }
358 }
359
360 /// Get an entry for the element at the tail of the view.
361 ///
362 /// Returns `None` if the view is empty.
363 ///
364 /// # Examples
365 ///
366 /// ```
367 /// use vec_entries::EntriesExt;
368 ///
369 /// let mut v = vec![0, 1, 2];
370 /// v.entries(.., |e| {
371 /// let b = e.back().unwrap();
372 /// assert_eq!(*b, 2);
373 /// b.shift();
374 ///
375 /// let b = e.back().unwrap();
376 /// assert_eq!(*b, 1);
377 /// b.shift();
378 ///
379 /// let b = e.back().unwrap();
380 /// assert_eq!(*b, 0);
381 /// b.shift();
382 ///
383 /// assert!(e.back().is_none());
384 /// });
385 /// ```
386 #[inline]
387 pub fn back<'b>(&'b mut self) -> Option<Entry<'a, 'b, T>> {
388 if self.read_head == self.read_tail {
389 None
390 } else {
391 Some(Entry {
392 entries: self,
393 front: false,
394 })
395 }
396 }
397
398 /// Shift the head of the view inward by one, returning a mutable reference to the now
399 /// excluded item.
400 ///
401 /// Returns `None` if the view is empty.
402 ///
403 /// # Examples
404 ///
405 /// ```
406 /// use vec_entries::EntriesExt;
407 ///
408 /// let mut v = vec![0, 1, 2];
409 /// v.entries(.., |e| {
410 /// assert_eq!(e.shift(), Some(&mut 0));
411 /// assert_eq!(e.shift(), Some(&mut 1));
412 /// assert_eq!(e.shift(), Some(&mut 2));
413 /// assert_eq!(e.shift(), None);
414 /// });
415 /// ```
416 #[inline]
417 pub fn shift(&mut self) -> Option<&'a mut T> {
418 self.front().map(Entry::shift_front)
419 }
420
421 /// Shift the tail of the view inward by one, returning a mutable reference to the now
422 /// excluded item.
423 ///
424 /// # Examples
425 ///
426 /// ```
427 /// use vec_entries::EntriesExt;
428 ///
429 /// let mut v = vec![0, 1, 2];
430 /// v.entries(.., |e| {
431 /// assert_eq!(e.shift_back(), Some(&mut 2));
432 /// assert_eq!(e.shift_back(), Some(&mut 1));
433 /// assert_eq!(e.shift_back(), Some(&mut 0));
434 /// assert_eq!(e.shift_back(), None);
435 /// });
436 /// ```
437 #[inline]
438 pub fn shift_back(&mut self) -> Option<&'a mut T> {
439 self.back().map(Entry::shift_back)
440 }
441
442 /// Remove the item at the head of the view from the underlying `Vec`, returning the now
443 /// removed item.
444 ///
445 /// Returns `None` if the view is empty.
446 ///
447 /// # Examples
448 ///
449 /// ```
450 /// use vec_entries::EntriesExt;
451 ///
452 /// let mut v = vec![0, 1, 2];
453 /// v.entries(.., |e| {
454 /// e.shift();
455 /// assert_eq!(e.remove(), Some(1));
456 /// });
457 /// assert_eq!(v, [0, 2]);
458 /// ```
459 #[inline]
460 pub fn remove(&mut self) -> Option<T> {
461 self.front().map(Entry::remove_front)
462 }
463
464 /// Remove the item at the tail of the view from the underlying `Vec`, returning the now
465 /// removed item.
466 ///
467 /// Returns `None` if the view is empty.
468 ///
469 /// # Examples
470 ///
471 /// ```
472 /// use vec_entries::EntriesExt;
473 ///
474 /// let mut v = vec![0, 1, 2];
475 /// v.entries(.., |e| {
476 /// assert_eq!(e.remove_back(), Some(2));
477 /// });
478 /// assert_eq!(v, [0, 1]);
479 /// ```
480 pub fn remove_back(&mut self) -> Option<T> {
481 self.back().map(Entry::remove_back)
482 }
483
484 /// Try to insert an item into the underlying `Vec`, just before the head of the view.
485 /// The view is then shifted include the added item.
486 ///
487 /// Returns `Err` if the there is no empty space for the insert to occur.
488 ///
489 /// # Examples
490 ///
491 /// ```
492 /// use vec_entries::EntriesExt;
493 ///
494 /// let mut v = vec![0, 1, 2];
495 /// v.entries(.., |e| {
496 /// // Can't insert if you didn't remove
497 /// assert_eq!(e.try_insert_inside(5), Err(5));
498 ///
499 /// assert_eq!(e.remove(), Some(0));
500 /// assert_eq!(e.remaining(), [1, 2]);
501 /// assert_eq!(e.try_insert_inside(5), Ok(&mut 5));
502 /// assert_eq!(e.remaining(), [5, 1, 2]);
503 /// });
504 /// assert_eq!(v, [5, 1, 2]);
505 /// ```
506 pub fn try_insert_inside(&mut self, v: T) -> Result<&mut T, T> {
507 if self.read_head == self.write_head {
508 return Err(v);
509 }
510
511 self.read_head -= 1;
512 let v = unsafe {
513 let write_ptr = self.vec.as_mut_ptr().add(self.read_head);
514 ptr::write(write_ptr, v);
515 self.vec.get_unchecked_mut(self.read_head)
516 };
517
518 Ok(v)
519 }
520
521 /// Try to insert an item into the underlying `Vec`, just after the tail of the view.
522 /// The view is then shifted include the added item.
523 ///
524 /// Returns `Err` if the there is no empty space for the insert to occur.
525 ///
526 /// # Examples
527 ///
528 /// ```
529 /// use vec_entries::EntriesExt;
530 ///
531 /// let mut v = vec![0, 1, 2];
532 /// v.entries(.., |e| {
533 /// // Can't insert if you didn't remove
534 /// assert_eq!(e.try_insert_inside_back(5), Err(5));
535 ///
536 /// assert_eq!(e.remove_back(), Some(2));
537 /// assert_eq!(e.remaining(), [0, 1]);
538 /// assert_eq!(e.try_insert_inside_back(5), Ok(&mut 5));
539 /// assert_eq!(e.remaining(), [0, 1, 5]);
540 /// });
541 /// assert_eq!(v, [0, 1, 5]);
542 /// ```
543 pub fn try_insert_inside_back(&mut self, v: T) -> Result<&mut T, T> {
544 if self.read_tail == self.write_tail {
545 return Err(v);
546 }
547
548 let v = unsafe {
549 let write_ptr = self.vec.as_mut_ptr().add(self.read_tail);
550 ptr::write(write_ptr, v);
551 self.vec.get_unchecked_mut(self.read_tail)
552 };
553 self.read_tail += 1;
554
555 Ok(v)
556 }
557
558 /// Try to insert an item into the underlying `Vec`, just before the head of the view.
559 ///
560 /// Returns `Err` if the there is no empty space for the insert to occur.
561 ///
562 /// # Examples
563 ///
564 /// ```
565 /// use vec_entries::EntriesExt;
566 ///
567 /// let mut v = vec![0, 1, 2];
568 /// v.entries(.., |e| {
569 /// // Can't insert if you didn't remove
570 /// assert_eq!(e.try_insert_outside(5), Err(5));
571 ///
572 /// assert_eq!(e.remove(), Some(0));
573 /// assert_eq!(e.remaining(), [1, 2]);
574 /// assert_eq!(e.try_insert_outside(5), Ok(&mut 5));
575 /// assert_eq!(e.remaining(), [1, 2]);
576 /// });
577 /// assert_eq!(v, [5, 1, 2]);
578 /// ```
579 pub fn try_insert_outside(&mut self, v: T) -> Result<&'a mut T, T> {
580 if self.read_head == self.write_head {
581 return Err(v);
582 }
583
584 let v = unsafe {
585 let write_ptr = self.vec.as_mut_ptr().add(self.write_head);
586 ptr::write(write_ptr, v);
587 &mut *write_ptr
588 };
589 self.write_head += 1;
590
591 Ok(v)
592 }
593
594 /// Try to insert an item into the underlying `Vec`, just after the tail of the view.
595 ///
596 /// Returns `Err` if the there is no empty space for the insert to occur.
597 ///
598 /// # Examples
599 ///
600 /// ```
601 /// use vec_entries::EntriesExt;
602 ///
603 /// let mut v = vec![0, 1, 2];
604 /// v.entries(.., |e| {
605 /// // Can't insert if you didn't remove
606 /// assert_eq!(e.try_insert_outside_back(5), Err(5));
607 ///
608 /// assert_eq!(e.remove_back(), Some(2));
609 /// assert_eq!(e.remaining(), [0, 1]);
610 /// assert_eq!(e.try_insert_outside_back(5), Ok(&mut 5));
611 /// assert_eq!(e.remaining(), [0, 1]);
612 /// });
613 /// assert_eq!(v, [0, 1, 5]);
614 /// ```
615 pub fn try_insert_outside_back(&mut self, v: T) -> Result<&'a mut T, T> {
616 if self.read_tail == self.write_tail {
617 return Err(v);
618 }
619
620 self.write_tail -= 1;
621 let v = unsafe {
622 let write_ptr = self.vec.as_mut_ptr().add(self.write_tail);
623 ptr::write(write_ptr, v);
624 &mut *write_ptr
625 };
626
627 Ok(v)
628 }
629
630 /// Get an iterator which gives mutable references to entries.
631 pub fn shift_iter<'b>(&'b mut self) -> ShiftIter<'a, 'b, T> {
632 ShiftIter { entries: self }
633 }
634
635 /// Get an iterator which removes entries.
636 pub fn remove_iter<'b>(&'b mut self) -> RemoveIter<'a, 'b, T> {
637 RemoveIter { entries: self }
638 }
639}
640
641/// An iterator which utilizes [`Entries::shift`] and [`Entries::shift_back`] to traverse entries.
642pub struct ShiftIter<'a, 'b, T> {
643 entries: &'b mut Entries<'a, T>,
644}
645
646impl<'a, 'b, T> Iterator for ShiftIter<'a, 'b, T> {
647 type Item = &'a mut T;
648 fn next(&mut self) -> Option<Self::Item> {
649 self.entries.shift()
650 }
651 fn size_hint(&self) -> (usize, Option<usize>) {
652 (self.len(), Some(self.len()))
653 }
654}
655
656impl<'a, 'b, T> DoubleEndedIterator for ShiftIter<'a, 'b, T> {
657 fn next_back(&mut self) -> Option<Self::Item> {
658 self.entries.shift_back()
659 }
660}
661
662impl<'a, 'b, T> ExactSizeIterator for ShiftIter<'a, 'b, T> {
663 fn len(&self) -> usize {
664 self.entries.read_tail - self.entries.read_head
665 }
666}
667
668impl<'a, 'b, T> FusedIterator for ShiftIter<'a, 'b, T> {}
669
670/// An iterator which utilizes [`Entries::remove`] and [`Entries::remove_back`] to traverse
671/// entries.
672pub struct RemoveIter<'a, 'b, T> {
673 entries: &'b mut Entries<'a, T>,
674}
675
676impl<'a, 'b, T> Iterator for RemoveIter<'a, 'b, T> {
677 type Item = T;
678 fn next(&mut self) -> Option<Self::Item> {
679 self.entries.remove()
680 }
681 fn size_hint(&self) -> (usize, Option<usize>) {
682 (self.len(), Some(self.len()))
683 }
684}
685
686impl<'a, 'b, T> DoubleEndedIterator for RemoveIter<'a, 'b, T> {
687 fn next_back(&mut self) -> Option<Self::Item> {
688 self.entries.remove_back()
689 }
690}
691
692impl<'a, 'b, T> ExactSizeIterator for RemoveIter<'a, 'b, T> {
693 fn len(&self) -> usize {
694 self.entries.read_tail - self.entries.read_head
695 }
696}
697
698impl<'a, 'b, T> FusedIterator for RemoveIter<'a, 'b, T> {}
699
700// An extension trait to add an `entries` method.
701pub trait EntriesExt {
702 /// The element type of the underlying container.
703 type T;
704
705 /// The entries type
706 type Entries<'a, T: 'a>;
707
708 /// Inspect the entries of a container within a specific `range`.
709 fn entries<'a, R, F, Ret>(&'a mut self, range: R, f: F) -> Ret
710 where
711 R: RangeBounds<usize>,
712 F: FnOnce(&mut Self::Entries<'a, Self::T>) -> Ret;
713}
714
715impl<T> EntriesExt for Vec<T> {
716 type T = T;
717 type Entries<'a, V: 'a> = Entries<'a, V>;
718
719 fn entries<'a, R, F, Ret>(&'a mut self, range: R, f: F) -> Ret
720 where
721 R: RangeBounds<usize>,
722 F: FnOnce(&mut Self::Entries<'a, Self::T>) -> Ret,
723 {
724 f(&mut Entries::new(
725 self,
726 range.start_bound().cloned(),
727 range.end_bound().cloned(),
728 ))
729 }
730}
731
732#[cfg(test)]
733mod tests {
734 use alloc::vec;
735
736 use super::*;
737
738 #[test]
739 fn nothing() {
740 let mut foo = vec![1, 2, 3, 4];
741 foo.entries(.., |e| {
742 assert_eq!(e.remaining(), [1, 2, 3, 4]);
743 });
744 assert_eq!(foo, [1, 2, 3, 4]);
745 }
746
747 #[test]
748 fn skip() {
749 let mut foo = vec![1, 2, 3, 4];
750 foo.entries(.., |e| {
751 assert_eq!(e.remaining(), [1, 2, 3, 4]);
752 assert_eq!(e.shift(), Some(&mut 1));
753 assert_eq!(e.remaining(), [2, 3, 4]);
754 });
755 assert_eq!(foo, [1, 2, 3, 4]);
756 }
757
758 #[test]
759 fn skip_back() {
760 let mut foo = vec![1, 2, 3, 4];
761 foo.entries(.., |e| {
762 assert_eq!(e.remaining(), [1, 2, 3, 4]);
763 assert_eq!(e.shift_back(), Some(&mut 4));
764 assert_eq!(e.remaining(), [1, 2, 3]);
765 });
766 assert_eq!(foo, [1, 2, 3, 4]);
767 }
768
769 #[test]
770 fn remove() {
771 let mut foo = vec![1, 2, 3, 4];
772 foo.entries(.., |e| {
773 assert_eq!(e.remaining(), [1, 2, 3, 4]);
774 assert_eq!(e.remove(), Some(1));
775 assert_eq!(e.remaining(), [2, 3, 4]);
776 });
777 assert_eq!(foo, [2, 3, 4]);
778 }
779
780 #[test]
781 fn remove_back() {
782 let mut foo = vec![1, 2, 3, 4];
783 foo.entries(.., |e| {
784 assert_eq!(e.remaining(), [1, 2, 3, 4]);
785 assert_eq!(e.remove_back(), Some(4));
786 assert_eq!(e.remaining(), [1, 2, 3]);
787 });
788 assert_eq!(foo, [1, 2, 3]);
789 }
790
791 #[test]
792 fn skip_remove() {
793 let mut foo = vec![1, 2, 3, 4];
794 foo.entries(.., |e| {
795 assert_eq!(e.remaining(), [1, 2, 3, 4]);
796 assert_eq!(e.shift(), Some(&mut 1));
797 assert_eq!(e.remove(), Some(2));
798 });
799 assert_eq!(foo, [1, 3, 4]);
800 }
801
802 #[test]
803 fn skip_back_remove() {
804 let mut foo = vec![1, 2, 3, 4];
805 foo.entries(.., |e| {
806 assert_eq!(e.remaining(), [1, 2, 3, 4]);
807 assert_eq!(e.shift_back(), Some(&mut 4));
808 assert_eq!(e.remove(), Some(1));
809 });
810 assert_eq!(foo, [2, 3, 4]);
811 }
812
813 #[test]
814 fn skip_remove_back() {
815 let mut foo = vec![1, 2, 3, 4];
816 foo.entries(.., |e| {
817 assert_eq!(e.remaining(), [1, 2, 3, 4]);
818 assert_eq!(e.shift(), Some(&mut 1));
819 assert_eq!(e.remove_back(), Some(4));
820 });
821 assert_eq!(foo, [1, 2, 3]);
822 }
823
824 #[test]
825 fn skip_back_remove_back() {
826 let mut foo = vec![1, 2, 3, 4];
827 foo.entries(.., |e| {
828 assert_eq!(e.remaining(), [1, 2, 3, 4]);
829 assert_eq!(e.shift_back(), Some(&mut 4));
830 assert_eq!(e.remove_back(), Some(3));
831 });
832 assert_eq!(foo, [1, 2, 4]);
833 }
834
835 #[test]
836 fn skip_iter() {
837 let mut foo = vec![1, 2, 3, 4];
838 foo.entries(.., |e| {
839 assert_eq!(e.remaining(), [1, 2, 3, 4]);
840 assert_eq!(e.shift_iter().next(), Some(&mut 1));
841 assert_eq!(e.remaining(), [2, 3, 4]);
842 });
843 assert_eq!(foo, [1, 2, 3, 4]);
844 }
845}