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}