heapless/
deque.rs

1//! A fixed capacity double-ended queue.
2//!
3//! # Examples
4//!
5//! ```
6//! use heapless::Deque;
7//!
8//! // A deque with a fixed capacity of 8 elements allocated on the stack
9//! let mut deque = Deque::<_, 8>::new();
10//!
11//! // You can use it as a good old FIFO queue.
12//! deque.push_back(1);
13//! deque.push_back(2);
14//! assert_eq!(deque.len(), 2);
15//!
16//! assert_eq!(deque.pop_front(), Some(1));
17//! assert_eq!(deque.pop_front(), Some(2));
18//! assert_eq!(deque.len(), 0);
19//!
20//! // Deque is double-ended, you can push and pop from the front and back.
21//! deque.push_back(1);
22//! deque.push_front(2);
23//! deque.push_back(3);
24//! deque.push_front(4);
25//! assert_eq!(deque.pop_front(), Some(4));
26//! assert_eq!(deque.pop_front(), Some(2));
27//! assert_eq!(deque.pop_front(), Some(1));
28//! assert_eq!(deque.pop_front(), Some(3));
29//!
30//! // You can iterate it, yielding all the elements front-to-back.
31//! for x in &deque {
32//!     println!("{}", x);
33//! }
34//! ```
35
36use crate::{
37    vec::{OwnedVecStorage, VecStorage, VecStorageInner, ViewVecStorage},
38    CapacityError,
39};
40use core::{
41    cmp::Ordering,
42    fmt,
43    iter::FusedIterator,
44    marker::PhantomData,
45    mem::{ManuallyDrop, MaybeUninit},
46    ptr, slice,
47};
48
49#[cfg(feature = "zeroize")]
50use zeroize::Zeroize;
51
52/// Base struct for [`Deque`] and [`DequeView`], generic over the [`VecStorage`].
53///
54/// In most cases you should use [`Deque`] or [`DequeView`] directly. Only use this
55/// struct if you want to write code that's generic over both.
56#[cfg_attr(feature = "zeroize", derive(Zeroize))]
57pub struct DequeInner<T, S: VecStorage<T> + ?Sized> {
58    // This phantomdata is required because otherwise rustc thinks that `T` is not used
59    phantom: PhantomData<T>,
60    /// Front index. Always 0..=(N-1)
61    front: usize,
62    /// Back index. Always 0..=(N-1).
63    back: usize,
64
65    /// Used to distinguish "empty" and "full" cases when `front == back`.
66    /// May only be `true` if `front == back`, always `false` otherwise.
67    full: bool,
68    buffer: S,
69}
70
71/// A fixed capacity double-ended queue.
72///
73/// # Examples
74///
75/// ```
76/// use heapless::Deque;
77///
78/// // A deque with a fixed capacity of 8 elements allocated on the stack
79/// let mut deque = Deque::<_, 8>::new();
80///
81/// // You can use it as a good old FIFO queue.
82/// deque.push_back(1);
83/// deque.push_back(2);
84/// assert_eq!(deque.len(), 2);
85///
86/// assert_eq!(deque.pop_front(), Some(1));
87/// assert_eq!(deque.pop_front(), Some(2));
88/// assert_eq!(deque.len(), 0);
89///
90/// // Deque is double-ended, you can push and pop from the front and back.
91/// deque.push_back(1);
92/// deque.push_front(2);
93/// deque.push_back(3);
94/// deque.push_front(4);
95/// assert_eq!(deque.pop_front(), Some(4));
96/// assert_eq!(deque.pop_front(), Some(2));
97/// assert_eq!(deque.pop_front(), Some(1));
98/// assert_eq!(deque.pop_front(), Some(3));
99///
100/// // You can iterate it, yielding all the elements front-to-back.
101/// for x in &deque {
102///     println!("{}", x);
103/// }
104/// ```
105pub type Deque<T, const N: usize> = DequeInner<T, OwnedVecStorage<T, N>>;
106
107/// A double-ended queue with dynamic capacity.
108///
109/// # Examples
110///
111/// ```
112/// use heapless::deque::{Deque, DequeView};
113///
114/// // A deque with a fixed capacity of 8 elements allocated on the stack
115/// let mut deque_buf = Deque::<_, 8>::new();
116///
117/// // A DequeView can be obtained through unsized coercion of a `Deque`
118/// let deque: &mut DequeView<_> = &mut deque_buf;
119///
120/// // You can use it as a good old FIFO queue.
121/// deque.push_back(1);
122/// deque.push_back(2);
123/// assert_eq!(deque.storage_len(), 2);
124///
125/// assert_eq!(deque.pop_front(), Some(1));
126/// assert_eq!(deque.pop_front(), Some(2));
127/// assert_eq!(deque.storage_len(), 0);
128///
129/// // DequeView is double-ended, you can push and pop from the front and back.
130/// deque.push_back(1);
131/// deque.push_front(2);
132/// deque.push_back(3);
133/// deque.push_front(4);
134/// assert_eq!(deque.pop_front(), Some(4));
135/// assert_eq!(deque.pop_front(), Some(2));
136/// assert_eq!(deque.pop_front(), Some(1));
137/// assert_eq!(deque.pop_front(), Some(3));
138///
139/// // You can iterate it, yielding all the elements front-to-back.
140/// for x in deque {
141///     println!("{}", x);
142/// }
143/// ```
144pub type DequeView<T> = DequeInner<T, ViewVecStorage<T>>;
145
146impl<T, const N: usize> Deque<T, N> {
147    const INIT: MaybeUninit<T> = MaybeUninit::uninit();
148
149    /// Constructs a new, empty deque with a fixed capacity of `N`
150    ///
151    /// # Examples
152    ///
153    /// ```
154    /// use heapless::Deque;
155    ///
156    /// // allocate the deque on the stack
157    /// let mut x: Deque<u8, 16> = Deque::new();
158    ///
159    /// // allocate the deque in a static variable
160    /// static mut X: Deque<u8, 16> = Deque::new();
161    /// ```
162    pub const fn new() -> Self {
163        const {
164            assert!(N > 0);
165        }
166
167        Self {
168            phantom: PhantomData,
169            buffer: VecStorageInner {
170                buffer: [Self::INIT; N],
171            },
172            front: 0,
173            back: 0,
174            full: false,
175        }
176    }
177
178    /// Returns the maximum number of elements the deque can hold.
179    ///
180    /// This method is not available on a `DequeView`, use
181    /// [`storage_capacity`](DequeInner::storage_capacity) instead.
182    pub const fn capacity(&self) -> usize {
183        N
184    }
185
186    /// Returns the number of elements currently in the deque.
187    ///
188    /// This method is not available on a `DequeView`, use [`storage_len`](DequeInner::storage_len)
189    /// instead.
190    pub const fn len(&self) -> usize {
191        if self.full {
192            N
193        } else if self.back < self.front {
194            self.back + N - self.front
195        } else {
196            self.back - self.front
197        }
198    }
199}
200
201impl<T, S: VecStorage<T> + ?Sized> DequeInner<T, S> {
202    /// Get a reference to the `Deque`, erasing the `N` const-generic.
203    pub fn as_view(&self) -> &DequeView<T> {
204        S::as_deque_view(self)
205    }
206
207    /// Get a mutable reference to the `Deque`, erasing the `N` const-generic.
208    pub fn as_mut_view(&mut self) -> &mut DequeView<T> {
209        S::as_deque_view_mut(self)
210    }
211
212    /// Returns the maximum number of elements the deque can hold.
213    pub fn storage_capacity(&self) -> usize {
214        self.buffer.borrow().len()
215    }
216
217    fn increment(&self, i: usize) -> usize {
218        if i + 1 == self.storage_capacity() {
219            0
220        } else {
221            i + 1
222        }
223    }
224
225    fn decrement(&self, i: usize) -> usize {
226        if i == 0 {
227            self.storage_capacity() - 1
228        } else {
229            i - 1
230        }
231    }
232
233    /// Returns the number of elements currently in the deque.
234    pub fn storage_len(&self) -> usize {
235        if self.full {
236            self.storage_capacity()
237        } else if self.back < self.front {
238            self.back + self.storage_capacity() - self.front
239        } else {
240            self.back - self.front
241        }
242    }
243
244    /// Clears the deque, removing all values.
245    pub fn clear(&mut self) {
246        // safety: we're immediately setting a consistent empty state.
247        unsafe { self.drop_contents() }
248        self.front = 0;
249        self.back = 0;
250        self.full = false;
251    }
252
253    /// Drop all items in the `Deque`, leaving the state `back/front/full` unmodified.
254    ///
255    /// safety: leaves the `Deque` in an inconsistent state, so can cause duplicate drops.
256    unsafe fn drop_contents(&mut self) {
257        // We drop each element used in the deque by turning into a &mut[T]
258        let (a, b) = self.as_mut_slices();
259        ptr::drop_in_place(a);
260        ptr::drop_in_place(b);
261    }
262
263    /// Returns whether the deque is empty.
264    pub fn is_empty(&self) -> bool {
265        self.front == self.back && !self.full
266    }
267
268    /// Returns whether the deque is full (i.e. if `len() == capacity()`.
269    pub fn is_full(&self) -> bool {
270        self.full
271    }
272
273    /// Returns a pair of slices which contain, in order, the contents of the `Deque`.
274    pub fn as_slices(&self) -> (&[T], &[T]) {
275        // NOTE(unsafe) avoid bound checks in the slicing operation
276        unsafe {
277            if self.is_empty() {
278                (&[], &[])
279            } else if self.back <= self.front {
280                (
281                    slice::from_raw_parts(
282                        self.buffer.borrow().as_ptr().add(self.front).cast::<T>(),
283                        self.storage_capacity() - self.front,
284                    ),
285                    slice::from_raw_parts(self.buffer.borrow().as_ptr().cast::<T>(), self.back),
286                )
287            } else {
288                (
289                    slice::from_raw_parts(
290                        self.buffer.borrow().as_ptr().add(self.front).cast::<T>(),
291                        self.back - self.front,
292                    ),
293                    &[],
294                )
295            }
296        }
297    }
298
299    /// Returns a pair of mutable slices which contain, in order, the contents of the `Deque`.
300    pub fn as_mut_slices(&mut self) -> (&mut [T], &mut [T]) {
301        let ptr = self.buffer.borrow_mut().as_mut_ptr();
302
303        // NOTE(unsafe) avoid bound checks in the slicing operation
304        unsafe {
305            if self.is_empty() {
306                (&mut [], &mut [])
307            } else if self.back <= self.front {
308                (
309                    slice::from_raw_parts_mut(
310                        ptr.add(self.front).cast::<T>(),
311                        self.storage_capacity() - self.front,
312                    ),
313                    slice::from_raw_parts_mut(ptr.cast::<T>(), self.back),
314                )
315            } else {
316                (
317                    slice::from_raw_parts_mut(
318                        ptr.add(self.front).cast::<T>(),
319                        self.back - self.front,
320                    ),
321                    &mut [],
322                )
323            }
324        }
325    }
326
327    #[inline]
328    fn is_contiguous(&self) -> bool {
329        self.front <= self.storage_capacity() - self.storage_len()
330    }
331
332    /// Rearranges the internal storage of the [`Deque`] to make it into a contiguous slice,
333    /// which is returned.
334    ///
335    /// This does **not** change the order of the elements in the deque.
336    /// The returned slice can then be used to perform contiguous slice operations on the deque.
337    ///
338    /// After calling this method, subsequent [`as_slices`] and [`as_mut_slices`] calls will return
339    /// a single contiguous slice.
340    ///
341    /// [`as_slices`]: Deque::as_slices
342    /// [`as_mut_slices`]: Deque::as_mut_slices
343    ///
344    /// # Examples
345    /// Sorting a deque:
346    /// ```
347    /// use heapless::Deque;
348    ///
349    /// let mut buf = Deque::<_, 4>::new();
350    /// buf.push_back(2).unwrap();
351    /// buf.push_back(1).unwrap();
352    /// buf.push_back(3).unwrap();
353    ///
354    /// // Sort the deque
355    /// buf.make_contiguous().sort();
356    /// assert_eq!(buf.as_slices(), (&[1, 2, 3][..], &[][..]));
357    ///
358    /// // Sort the deque in reverse
359    /// buf.make_contiguous().sort_by(|a, b| b.cmp(a));
360    /// assert_eq!(buf.as_slices(), (&[3, 2, 1][..], &[][..]));
361    /// ```
362    pub fn make_contiguous(&mut self) -> &mut [T] {
363        if self.is_contiguous() {
364            return unsafe {
365                slice::from_raw_parts_mut(
366                    self.buffer.borrow_mut().as_mut_ptr().add(self.front).cast(),
367                    self.storage_len(),
368                )
369            };
370        }
371
372        let buffer_ptr: *mut T = self.buffer.borrow_mut().as_mut_ptr().cast();
373
374        let len = self.storage_len();
375
376        let free = self.storage_capacity() - len;
377        let front_len = self.storage_capacity() - self.front;
378        let back = len - front_len;
379        let back_len = back;
380
381        if free >= front_len {
382            // there is enough free space to copy the head in one go,
383            // this means that we first shift the tail backwards, and then
384            // copy the head to the correct position.
385            //
386            // from: DEFGH....ABC
387            // to:   ABCDEFGH....
388            unsafe {
389                ptr::copy(buffer_ptr, buffer_ptr.add(front_len), back_len);
390                // ...DEFGH.ABC
391                ptr::copy_nonoverlapping(buffer_ptr.add(self.front), buffer_ptr, front_len);
392                // ABCDEFGH....
393            }
394
395            self.front = 0;
396            self.back = len;
397        } else if free >= back_len {
398            // there is enough free space to copy the tail in one go,
399            // this means that we first shift the head forwards, and then
400            // copy the tail to the correct position.
401            //
402            // from: FGH....ABCDE
403            // to:   ...ABCDEFGH.
404            unsafe {
405                ptr::copy(
406                    buffer_ptr.add(self.front),
407                    buffer_ptr.add(self.back),
408                    front_len,
409                );
410                // FGHABCDE....
411                ptr::copy_nonoverlapping(
412                    buffer_ptr,
413                    buffer_ptr.add(self.back + front_len),
414                    back_len,
415                );
416                // ...ABCDEFGH.
417            }
418
419            self.front = back;
420            self.back = 0;
421        } else {
422            // `free` is smaller than both `head_len` and `tail_len`.
423            // the general algorithm for this first moves the slices
424            // right next to each other and then uses `slice::rotate`
425            // to rotate them into place:
426            //
427            // initially:   HIJK..ABCDEFG
428            // step 1:      ..HIJKABCDEFG
429            // step 2:      ..ABCDEFGHIJK
430            //
431            // or:
432            //
433            // initially:   FGHIJK..ABCDE
434            // step 1:      FGHIJKABCDE..
435            // step 2:      ABCDEFGHIJK..
436
437            // pick the shorter of the 2 slices to reduce the amount
438            // of memory that needs to be moved around.
439            if front_len > back_len {
440                // tail is shorter, so:
441                //  1. copy tail forwards
442                //  2. rotate used part of the buffer
443                //  3. update head to point to the new beginning (which is just `free`)
444                unsafe {
445                    // if there is no free space in the buffer, then the slices are already
446                    // right next to each other and we don't need to move any memory.
447                    if free != 0 {
448                        // because we only move the tail forward as much as there's free space
449                        // behind it, we don't overwrite any elements of the head slice, and
450                        // the slices end up right next to each other.
451                        ptr::copy(buffer_ptr, buffer_ptr.add(free), back_len);
452                    }
453
454                    // We just copied the tail right next to the head slice,
455                    // so all of the elements in the range are initialized
456                    let slice: &mut [T] = slice::from_raw_parts_mut(
457                        buffer_ptr.add(free),
458                        self.storage_capacity() - free,
459                    );
460
461                    // because the deque wasn't contiguous, we know that `tail_len < self.len ==
462                    // slice.len()`, so this will never panic.
463                    slice.rotate_left(back_len);
464
465                    // the used part of the buffer now is `free..self.capacity()`, so set
466                    // `head` to the beginning of that range.
467                    self.front = free;
468                    self.back = 0;
469                }
470            } else {
471                // head is shorter so:
472                //  1. copy head backwards
473                //  2. rotate used part of the buffer
474                //  3. update head to point to the new beginning (which is the beginning of the
475                //     buffer)
476
477                unsafe {
478                    // if there is no free space in the buffer, then the slices are already
479                    // right next to each other and we don't need to move any memory.
480                    if free != 0 {
481                        // copy the head slice to lie right behind the tail slice.
482                        ptr::copy(
483                            buffer_ptr.add(self.front),
484                            buffer_ptr.add(back_len),
485                            front_len,
486                        );
487                    }
488
489                    // because we copied the head slice so that both slices lie right
490                    // next to each other, all the elements in the range are initialized.
491                    let slice: &mut [T] = slice::from_raw_parts_mut(buffer_ptr, len);
492
493                    // because the deque wasn't contiguous, we know that `head_len < self.len ==
494                    // slice.len()` so this will never panic.
495                    slice.rotate_right(front_len);
496
497                    // the used part of the buffer now is `0..self.len`, so set
498                    // `head` to the beginning of that range.
499                    self.front = 0;
500                    self.back = len;
501                }
502            }
503        }
504
505        unsafe { slice::from_raw_parts_mut(buffer_ptr.add(self.front), len) }
506    }
507
508    /// Provides a reference to the front element, or None if the `Deque` is empty.
509    pub fn front(&self) -> Option<&T> {
510        if self.is_empty() {
511            None
512        } else {
513            Some(unsafe { &*self.buffer.borrow().get_unchecked(self.front).as_ptr() })
514        }
515    }
516
517    /// Provides a mutable reference to the front element, or None if the `Deque` is empty.
518    pub fn front_mut(&mut self) -> Option<&mut T> {
519        if self.is_empty() {
520            None
521        } else {
522            Some(unsafe {
523                &mut *self
524                    .buffer
525                    .borrow_mut()
526                    .get_unchecked_mut(self.front)
527                    .as_mut_ptr()
528            })
529        }
530    }
531
532    /// Provides a reference to the back element, or None if the `Deque` is empty.
533    pub fn back(&self) -> Option<&T> {
534        if self.is_empty() {
535            None
536        } else {
537            let index = self.decrement(self.back);
538            Some(unsafe { &*self.buffer.borrow().get_unchecked(index).as_ptr() })
539        }
540    }
541
542    /// Provides a mutable reference to the back element, or None if the `Deque` is empty.
543    pub fn back_mut(&mut self) -> Option<&mut T> {
544        if self.is_empty() {
545            None
546        } else {
547            let index = self.decrement(self.back);
548            Some(unsafe {
549                &mut *self
550                    .buffer
551                    .borrow_mut()
552                    .get_unchecked_mut(index)
553                    .as_mut_ptr()
554            })
555        }
556    }
557
558    /// Removes the item from the front of the deque and returns it, or `None` if it's empty
559    pub fn pop_front(&mut self) -> Option<T> {
560        if self.is_empty() {
561            None
562        } else {
563            Some(unsafe { self.pop_front_unchecked() })
564        }
565    }
566
567    /// Removes the item from the back of the deque and returns it, or `None` if it's empty
568    pub fn pop_back(&mut self) -> Option<T> {
569        if self.is_empty() {
570            None
571        } else {
572            Some(unsafe { self.pop_back_unchecked() })
573        }
574    }
575
576    /// Appends an `item` to the front of the deque
577    ///
578    /// Returns back the `item` if the deque is full
579    pub fn push_front(&mut self, item: T) -> Result<(), T> {
580        if self.is_full() {
581            Err(item)
582        } else {
583            unsafe { self.push_front_unchecked(item) }
584            Ok(())
585        }
586    }
587
588    /// Appends an `item` to the back of the deque
589    ///
590    /// Returns back the `item` if the deque is full
591    pub fn push_back(&mut self, item: T) -> Result<(), T> {
592        if self.is_full() {
593            Err(item)
594        } else {
595            unsafe { self.push_back_unchecked(item) }
596            Ok(())
597        }
598    }
599
600    /// Removes an item from the front of the deque and returns it, without checking that the deque
601    /// is not empty
602    ///
603    /// # Safety
604    ///
605    /// It's undefined behavior to call this on an empty deque
606    pub unsafe fn pop_front_unchecked(&mut self) -> T {
607        debug_assert!(!self.is_empty());
608
609        let index = self.front;
610        self.full = false;
611        self.front = self.increment(self.front);
612        self.buffer
613            .borrow_mut()
614            .get_unchecked_mut(index)
615            .as_ptr()
616            .read()
617    }
618
619    /// Removes an item from the back of the deque and returns it, without checking that the deque
620    /// is not empty
621    ///
622    /// # Safety
623    ///
624    /// It's undefined behavior to call this on an empty deque
625    pub unsafe fn pop_back_unchecked(&mut self) -> T {
626        debug_assert!(!self.is_empty());
627
628        self.full = false;
629        self.back = self.decrement(self.back);
630        self.buffer
631            .borrow_mut()
632            .get_unchecked_mut(self.back)
633            .as_ptr()
634            .read()
635    }
636
637    /// Appends an `item` to the front of the deque
638    ///
639    /// # Safety
640    ///
641    /// This assumes the deque is not full.
642    pub unsafe fn push_front_unchecked(&mut self, item: T) {
643        debug_assert!(!self.is_full());
644
645        let index = self.decrement(self.front);
646        // NOTE: the memory slot that we are about to write to is uninitialized. We assign
647        // a `MaybeUninit` to avoid running `T`'s destructor on the uninitialized memory
648        *self.buffer.borrow_mut().get_unchecked_mut(index) = MaybeUninit::new(item);
649        self.front = index;
650        if self.front == self.back {
651            self.full = true;
652        }
653    }
654
655    /// Appends an `item` to the back of the deque
656    ///
657    /// # Safety
658    ///
659    /// This assumes the deque is not full.
660    pub unsafe fn push_back_unchecked(&mut self, item: T) {
661        debug_assert!(!self.is_full());
662
663        // NOTE: the memory slot that we are about to write to is uninitialized. We assign
664        // a `MaybeUninit` to avoid running `T`'s destructor on the uninitialized memory
665        *self.buffer.borrow_mut().get_unchecked_mut(self.back) = MaybeUninit::new(item);
666        self.back = self.increment(self.back);
667        if self.front == self.back {
668            self.full = true;
669        }
670    }
671
672    /// Returns a reference to the element at the given index.
673    ///
674    /// Index 0 is the front of the `Deque`.
675    pub fn get(&self, index: usize) -> Option<&T> {
676        if index < self.storage_len() {
677            let idx = self.to_physical_index(index);
678            Some(unsafe { self.buffer.borrow().get_unchecked(idx).assume_init_ref() })
679        } else {
680            None
681        }
682    }
683
684    /// Returns a mutable reference to the element at the given index.
685    ///
686    /// Index 0 is the front of the `Deque`.
687    pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
688        if index < self.storage_len() {
689            let idx = self.to_physical_index(index);
690            Some(unsafe {
691                self.buffer
692                    .borrow_mut()
693                    .get_unchecked_mut(idx)
694                    .assume_init_mut()
695            })
696        } else {
697            None
698        }
699    }
700
701    /// Returns a reference to the element at the given index without checking if it exists.
702    ///
703    /// # Safety
704    ///
705    /// The element at the given `index` must exist (i.e. `index < self.len()`).
706    pub unsafe fn get_unchecked(&self, index: usize) -> &T {
707        debug_assert!(index < self.storage_len());
708
709        let idx = self.to_physical_index(index);
710        self.buffer.borrow().get_unchecked(idx).assume_init_ref()
711    }
712
713    /// Returns a mutable reference to the element at the given index without checking if it exists.
714    ///
715    /// # Safety
716    ///
717    /// The element at the given `index` must exist (i.e. `index < self.len()`).
718    pub unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
719        debug_assert!(index < self.storage_len());
720
721        let idx = self.to_physical_index(index);
722        self.buffer
723            .borrow_mut()
724            .get_unchecked_mut(idx)
725            .assume_init_mut()
726    }
727
728    /// Swaps elements at indices `i` and `j`.
729    ///
730    /// # Panics
731    ///
732    /// Panics if either `i` or `j` are out of bounds.
733    pub fn swap(&mut self, i: usize, j: usize) {
734        let len = self.storage_len();
735        assert!(i < len);
736        assert!(j < len);
737        unsafe { self.swap_unchecked(i, j) }
738    }
739
740    /// Swaps elements at indices `i` and `j` without checking that they exist.
741    ///
742    /// # Safety
743    ///
744    /// Elements at indexes `i` and `j` must exist (i.e. `i < self.len()` and `j < self.len()`).
745    pub unsafe fn swap_unchecked(&mut self, i: usize, j: usize) {
746        debug_assert!(i < self.storage_len());
747        debug_assert!(j < self.storage_len());
748        let idx_i = self.to_physical_index(i);
749        let idx_j = self.to_physical_index(j);
750
751        let buffer = self.buffer.borrow_mut();
752        let buffer_ptr = buffer.as_mut_ptr();
753        let ptr_i = buffer_ptr.add(idx_i);
754        let ptr_j = buffer_ptr.add(idx_j);
755        ptr::swap(ptr_i, ptr_j);
756    }
757
758    /// Removes an element from anywhere in the deque and returns it, replacing it with the first
759    /// element.
760    ///
761    /// This does not preserve ordering, but is *O*(1).
762    ///
763    /// Returns `None` if `index` is out of bounds.
764    ///
765    /// Element at index 0 is the front of the queue.
766    pub fn swap_remove_front(&mut self, index: usize) -> Option<T> {
767        let len = self.storage_len();
768        if len > 0 && index < len {
769            Some(unsafe {
770                self.swap_unchecked(index, 0);
771                self.pop_front_unchecked()
772            })
773        } else {
774            None
775        }
776    }
777
778    /// Removes an element from anywhere in the deque and returns it, replacing it with the last
779    /// element.
780    ///
781    /// This does not preserve ordering, but is *O*(1).
782    ///
783    /// Returns `None` if `index` is out of bounds.
784    ///
785    /// Element at index 0 is the front of the queue.
786    pub fn swap_remove_back(&mut self, index: usize) -> Option<T> {
787        let len = self.storage_len();
788        if len > 0 && index < len {
789            Some(unsafe {
790                self.swap_unchecked(index, len - 1);
791                self.pop_back_unchecked()
792            })
793        } else {
794            None
795        }
796    }
797
798    fn to_physical_index(&self, index: usize) -> usize {
799        let mut res = self.front + index;
800        if res >= self.storage_capacity() {
801            res -= self.storage_capacity();
802        }
803        res
804    }
805
806    /// Returns an iterator over the deque.
807    pub fn iter(&self) -> Iter<'_, T> {
808        let (start, end) = self.as_slices();
809        Iter {
810            inner: start.iter().chain(end),
811        }
812    }
813
814    /// Returns an iterator that allows modifying each value.
815    pub fn iter_mut(&mut self) -> IterMut<'_, T> {
816        let (start, end) = self.as_mut_slices();
817        IterMut {
818            inner: start.iter_mut().chain(end),
819        }
820    }
821
822    /// Shortens the deque, keeping the first `len` elements and dropping
823    /// the rest.
824    ///
825    /// If `len` is greater or equal to the deque's current length, this has
826    /// no effect.
827    ///
828    /// # Examples
829    ///
830    /// ```
831    /// use heapless::Deque;
832    ///
833    /// let mut buf: Deque<_, 5> = Deque::new();
834    /// buf.push_back(5);
835    /// buf.push_back(10);
836    /// buf.push_back(15);
837    /// buf.truncate(1);
838    /// assert_eq!(buf.make_contiguous(), [5]);
839    /// ```
840    pub fn truncate(&mut self, len: usize) {
841        /// Runs the destructor for all items in the slice when it gets dropped (gracefully or
842        /// during unwinding).
843        struct Dropper<'a, T>(&'a mut [T]);
844
845        impl<'a, T> Drop for Dropper<'a, T> {
846            fn drop(&mut self) {
847                unsafe {
848                    ptr::drop_in_place(self.0);
849                }
850            }
851        }
852
853        // Safety:
854        // * Any slice passed to `drop_in_place` is valid; the second case has `len <= front.len()`
855        //   and returning on `len > self.storage_len()` ensures `begin <= back.len()` in the first
856        //   case
857        // * Deque front/back cursors are moved before calling `drop_in_place`, so no value is
858        //   dropped twice if `drop_in_place` panics
859        unsafe {
860            // If new desired length is greater or equal, we don't need to act.
861            if len >= self.storage_len() {
862                return;
863            }
864
865            let (front, back) = self.as_mut_slices();
866
867            // If `len` desires to keep elements past front's entire length,
868            // then only back's contents will need to be dropped
869            // as the two slices combined should be more than `len`.
870            if len > front.len() {
871                let begin = len - front.len();
872                let drop_back = back.get_unchecked_mut(begin..) as *mut _;
873
874                // Self::to_physical_index returns the index `len` units _after_ the front cursor,
875                // meaning we can use it to find the decremented index for `back` for non-contiguous
876                // deques, as well as determine where the new "cap" for front needs
877                // to be placed for contiguous deques.
878                self.back = self.to_physical_index(len);
879                self.full = false;
880
881                ptr::drop_in_place(drop_back);
882            } else {
883                // Otherwise, we know back's entire contents need to be dropped,
884                // since the desired length never reaches into it.
885                let drop_back = back as *mut _;
886                let drop_front = front.get_unchecked_mut(len..) as *mut _;
887
888                self.back = self.to_physical_index(len);
889                self.full = false;
890
891                // If `drop_front` causes a panic, the Dropper will still be called to drop it's
892                // slice during unwinding. In either case, front will always be
893                // dropped before back.
894                let _back_dropper = Dropper(&mut *drop_back);
895                ptr::drop_in_place(drop_front);
896            }
897        }
898    }
899
900    /// Retains only the elements specified by the predicate.
901    ///
902    /// In other words, remove all elements `e` for which `f(&e)` returns false.
903    /// This method operates in place, visiting each element exactly once in the
904    /// original order, and preserves the order of the retained elements.
905    ///
906    /// # Examples
907    ///
908    /// ```
909    /// use heapless::Deque;
910    ///
911    /// let mut buf: Deque<_, 10> = Deque::new();
912    /// buf.extend(1..5);
913    /// buf.retain(|&x| x % 2 == 0);
914    /// assert_eq!(buf.make_contiguous(), [2, 4]);
915    /// ```
916    ///
917    /// Because the elements are visited exactly once in the original order,
918    /// external state may be used to decide which elements to keep.
919    ///
920    /// ```
921    /// use heapless::Deque;
922    ///
923    /// let mut buf: Deque<_, 10> = Deque::new();
924    /// buf.extend(1..6);
925    ///
926    /// let keep = [false, true, true, false, true];
927    /// let mut iter = keep.iter();
928    /// buf.retain(|_| *iter.next().unwrap());
929    /// assert_eq!(buf.make_contiguous(), [2, 3, 5]);
930    /// ```
931    pub fn retain<F>(&mut self, mut f: F)
932    where
933        F: FnMut(&T) -> bool,
934    {
935        self.retain_mut(|elem| f(elem));
936    }
937
938    /// Retains only the elements specified by the predicate.
939    ///
940    /// In other words, remove all elements `e` for which `f(&mut e)` returns false.
941    /// This method operates in place, visiting each element exactly once in the
942    /// original order, and preserves the order of the retained elements.
943    ///
944    /// # Examples
945    ///
946    /// ```
947    /// use heapless::Deque;
948    ///
949    /// let mut buf: Deque<_, 10> = Deque::new();
950    /// buf.extend(1..5);
951    /// buf.retain_mut(|x| {
952    ///     if *x % 2 == 0 {
953    ///         *x += 1;
954    ///         true
955    ///     } else {
956    ///         false
957    ///     }
958    /// });
959    /// assert_eq!(buf.make_contiguous(), [3, 5]);
960    /// ```
961    pub fn retain_mut<F>(&mut self, mut f: F)
962    where
963        F: FnMut(&mut T) -> bool,
964    {
965        let len = self.storage_len();
966        let mut idx = 0;
967        let mut cur = 0;
968
969        // Stage 1: Check if all values can be retained.
970        while cur < len {
971            let val = self
972                .get_mut(cur)
973                .expect("cur was checked to be less than deque's length");
974            if !f(val) {
975                cur += 1;
976                break;
977            }
978
979            cur += 1;
980            idx += 1;
981        }
982        // Stage 2: Swap retained values into current idx, building a contiguous chunk from 0 to
983        // idx.
984        while cur < len {
985            let val = self
986                .get_mut(cur)
987                .expect("cur was checked to be less than deque's length");
988            if !f(val) {
989                cur += 1;
990                continue;
991            }
992
993            self.swap(idx, cur);
994            cur += 1;
995            idx += 1;
996        }
997        // Stage 3: Truncate any moved values after idx.
998        if cur != idx {
999            self.truncate(idx);
1000        }
1001    }
1002}
1003
1004/// Iterator over the contents of a [`Deque`]
1005pub struct Iter<'a, T> {
1006    inner: core::iter::Chain<core::slice::Iter<'a, T>, core::slice::Iter<'a, T>>,
1007}
1008
1009/// Iterator over the contents of a [`Deque`]
1010pub struct IterMut<'a, T> {
1011    inner: core::iter::Chain<core::slice::IterMut<'a, T>, core::slice::IterMut<'a, T>>,
1012}
1013
1014impl<'a, T> Iterator for Iter<'a, T> {
1015    type Item = &'a T;
1016    #[inline]
1017    fn next(&mut self) -> Option<Self::Item> {
1018        self.inner.next()
1019    }
1020
1021    #[inline]
1022    fn size_hint(&self) -> (usize, Option<usize>) {
1023        self.inner.size_hint()
1024    }
1025}
1026
1027impl<T> DoubleEndedIterator for Iter<'_, T> {
1028    #[inline]
1029    fn next_back(&mut self) -> Option<Self::Item> {
1030        self.inner.next_back()
1031    }
1032}
1033
1034impl<T> ExactSizeIterator for Iter<'_, T> {}
1035impl<T> FusedIterator for Iter<'_, T> {}
1036
1037impl<'a, T> Iterator for IterMut<'a, T> {
1038    type Item = &'a mut T;
1039    #[inline]
1040    fn next(&mut self) -> Option<Self::Item> {
1041        self.inner.next()
1042    }
1043    #[inline]
1044    fn size_hint(&self) -> (usize, Option<usize>) {
1045        self.inner.size_hint()
1046    }
1047}
1048
1049impl<T> DoubleEndedIterator for IterMut<'_, T> {
1050    #[inline]
1051    fn next_back(&mut self) -> Option<Self::Item> {
1052        self.inner.next_back()
1053    }
1054}
1055
1056impl<T> ExactSizeIterator for IterMut<'_, T> {}
1057impl<T> FusedIterator for IterMut<'_, T> {}
1058
1059// Trait implementations
1060
1061impl<T, const N: usize> Default for Deque<T, N> {
1062    fn default() -> Self {
1063        Self::new()
1064    }
1065}
1066
1067impl<T, S: VecStorage<T> + ?Sized> Drop for DequeInner<T, S> {
1068    fn drop(&mut self) {
1069        // safety: `self` is left in an inconsistent state but it doesn't matter since
1070        // it's getting dropped. Nothing should be able to observe `self` after drop.
1071        unsafe { self.drop_contents() }
1072    }
1073}
1074
1075impl<T: fmt::Debug, S: VecStorage<T> + ?Sized> fmt::Debug for DequeInner<T, S> {
1076    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1077        f.debug_list().entries(self).finish()
1078    }
1079}
1080
1081/// As with the standard library's `VecDeque`, items are added via `push_back`.
1082impl<T, S: VecStorage<T> + ?Sized> Extend<T> for DequeInner<T, S> {
1083    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
1084        for item in iter {
1085            self.push_back(item).ok().unwrap();
1086        }
1087    }
1088}
1089impl<'a, T: 'a + Copy, S: VecStorage<T> + ?Sized> Extend<&'a T> for DequeInner<T, S> {
1090    fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
1091        self.extend(iter.into_iter().copied());
1092    }
1093}
1094
1095/// An iterator that moves out of a [`Deque`].
1096///
1097/// This struct is created by calling the `into_iter` method.
1098#[derive(Clone)]
1099pub struct IntoIter<T, const N: usize> {
1100    deque: Deque<T, N>,
1101}
1102
1103impl<T, const N: usize> Iterator for IntoIter<T, N> {
1104    type Item = T;
1105    fn next(&mut self) -> Option<Self::Item> {
1106        self.deque.pop_front()
1107    }
1108    fn size_hint(&self) -> (usize, Option<usize>) {
1109        let len = self.len();
1110        (len, Some(len))
1111    }
1112}
1113impl<T, const N: usize> DoubleEndedIterator for IntoIter<T, N> {
1114    fn next_back(&mut self) -> Option<Self::Item> {
1115        self.deque.pop_back()
1116    }
1117}
1118impl<T, const N: usize> FusedIterator for IntoIter<T, N> {}
1119impl<T, const N: usize> ExactSizeIterator for IntoIter<T, N> {
1120    fn len(&self) -> usize {
1121        self.deque.len()
1122    }
1123}
1124
1125impl<T, const N: usize> IntoIterator for Deque<T, N> {
1126    type Item = T;
1127    type IntoIter = IntoIter<T, N>;
1128
1129    fn into_iter(self) -> Self::IntoIter {
1130        IntoIter { deque: self }
1131    }
1132}
1133
1134impl<'a, T, S: VecStorage<T> + ?Sized> IntoIterator for &'a DequeInner<T, S> {
1135    type Item = &'a T;
1136    type IntoIter = Iter<'a, T>;
1137
1138    fn into_iter(self) -> Self::IntoIter {
1139        self.iter()
1140    }
1141}
1142
1143impl<'a, T, S: VecStorage<T> + ?Sized> IntoIterator for &'a mut DequeInner<T, S> {
1144    type Item = &'a mut T;
1145    type IntoIter = IterMut<'a, T>;
1146
1147    fn into_iter(self) -> Self::IntoIter {
1148        self.iter_mut()
1149    }
1150}
1151
1152impl<T, const N: usize> Clone for Deque<T, N>
1153where
1154    T: Clone,
1155{
1156    fn clone(&self) -> Self {
1157        let mut res = Self::new();
1158        for i in self {
1159            // safety: the original and new deques have the same capacity, so it can
1160            // not become full.
1161            unsafe { res.push_back_unchecked(i.clone()) }
1162        }
1163        res
1164    }
1165}
1166
1167impl<T: PartialEq, const N: usize> PartialEq for Deque<T, N> {
1168    fn eq(&self, other: &Self) -> bool {
1169        if self.len() != other.len() {
1170            return false;
1171        }
1172        let (sa, sb) = self.as_slices();
1173        let (oa, ob) = other.as_slices();
1174        match sa.len().cmp(&oa.len()) {
1175            Ordering::Equal => sa == oa && sb == ob,
1176            Ordering::Less => {
1177                // Always divisible in three sections, for example:
1178                // self:  [a b c|d e f]
1179                // other: [0 1 2 3|4 5]
1180                // front = 3, mid = 1,
1181                // [a b c] == [0 1 2] && [d] == [3] && [e f] == [4 5]
1182                let front = sa.len();
1183                let mid = oa.len() - front;
1184
1185                let (oa_front, oa_mid) = oa.split_at(front);
1186                let (sb_mid, sb_back) = sb.split_at(mid);
1187                debug_assert_eq!(sa.len(), oa_front.len());
1188                debug_assert_eq!(sb_mid.len(), oa_mid.len());
1189                debug_assert_eq!(sb_back.len(), ob.len());
1190                sa == oa_front && sb_mid == oa_mid && sb_back == ob
1191            }
1192            Ordering::Greater => {
1193                let front = oa.len();
1194                let mid = sa.len() - front;
1195
1196                let (sa_front, sa_mid) = sa.split_at(front);
1197                let (ob_mid, ob_back) = ob.split_at(mid);
1198                debug_assert_eq!(sa_front.len(), oa.len());
1199                debug_assert_eq!(sa_mid.len(), ob_mid.len());
1200                debug_assert_eq!(sb.len(), ob_back.len());
1201                sa_front == oa && sa_mid == ob_mid && sb == ob_back
1202            }
1203        }
1204    }
1205}
1206
1207impl<T: Eq, const N: usize> Eq for Deque<T, N> {}
1208
1209impl<T, const NS: usize, const ND: usize> TryFrom<[T; NS]> for Deque<T, ND> {
1210    /// Converts a `[T; NS]` into a `Deque<T, ND>`.
1211    ///
1212    /// ```
1213    /// use heapless::Deque;
1214    ///
1215    /// let deq1 = Deque::<u8, 5>::try_from([1, 2, 3]).unwrap();
1216    /// let mut deq2 = Deque::<u8, 5>::new();
1217    /// deq2.push_back(1).unwrap();
1218    /// deq2.push_back(2).unwrap();
1219    /// deq2.push_back(3).unwrap();
1220    ///
1221    /// assert_eq!(deq1, deq2);
1222    /// ```
1223    type Error = (CapacityError, [T; NS]);
1224
1225    /// Converts a `[T; NS]` array into a `Deque<T, ND>`.
1226    ///
1227    /// Returns back the `value` if NS > ND.
1228    fn try_from(value: [T; NS]) -> Result<Self, Self::Error> {
1229        if NS > ND {
1230            return Err((CapacityError, value));
1231        }
1232
1233        let mut deq = Self::default();
1234        let value = ManuallyDrop::new(value);
1235
1236        // SAFETY: We already ensured that value fits in deq.
1237        unsafe {
1238            ptr::copy_nonoverlapping(
1239                value.as_ptr(),
1240                deq.buffer.buffer.as_mut_ptr().cast::<T>(),
1241                NS,
1242            );
1243        }
1244
1245        deq.front = 0;
1246        deq.back = NS;
1247        deq.full = NS == ND;
1248
1249        Ok(deq)
1250    }
1251}
1252
1253#[cfg(test)]
1254mod tests {
1255    use super::Deque;
1256    use crate::CapacityError;
1257    use static_assertions::assert_not_impl_any;
1258
1259    // Ensure a `Deque` containing `!Send` values stays `!Send` itself.
1260    assert_not_impl_any!(Deque<*const (), 4>: Send);
1261
1262    #[test]
1263    fn static_new() {
1264        static mut _V: Deque<i32, 4> = Deque::new();
1265    }
1266
1267    #[test]
1268    fn stack_new() {
1269        let mut _v: Deque<i32, 4> = Deque::new();
1270    }
1271
1272    #[test]
1273    fn drop() {
1274        droppable!();
1275
1276        {
1277            let mut v: Deque<Droppable, 2> = Deque::new();
1278            v.push_back(Droppable::new()).ok().unwrap();
1279            v.push_back(Droppable::new()).ok().unwrap();
1280            v.pop_front().unwrap();
1281        }
1282
1283        assert_eq!(Droppable::count(), 0);
1284
1285        {
1286            let mut v: Deque<Droppable, 2> = Deque::new();
1287            v.push_back(Droppable::new()).ok().unwrap();
1288            v.push_back(Droppable::new()).ok().unwrap();
1289        }
1290
1291        assert_eq!(Droppable::count(), 0);
1292        {
1293            let mut v: Deque<Droppable, 2> = Deque::new();
1294            v.push_front(Droppable::new()).ok().unwrap();
1295            v.push_front(Droppable::new()).ok().unwrap();
1296        }
1297
1298        assert_eq!(Droppable::count(), 0);
1299    }
1300
1301    #[test]
1302    fn full() {
1303        let mut v: Deque<i32, 4> = Deque::new();
1304
1305        v.push_back(0).unwrap();
1306        v.push_front(1).unwrap();
1307        v.push_back(2).unwrap();
1308        v.push_back(3).unwrap();
1309
1310        assert!(v.push_front(4).is_err());
1311        assert!(v.push_back(4).is_err());
1312        assert!(v.is_full());
1313    }
1314
1315    #[test]
1316    fn empty() {
1317        let mut v: Deque<i32, 4> = Deque::new();
1318        assert!(v.is_empty());
1319
1320        v.push_back(0).unwrap();
1321        assert!(!v.is_empty());
1322
1323        v.push_front(1).unwrap();
1324        assert!(!v.is_empty());
1325
1326        v.pop_front().unwrap();
1327        v.pop_front().unwrap();
1328
1329        assert!(v.pop_front().is_none());
1330        assert!(v.pop_back().is_none());
1331        assert!(v.is_empty());
1332    }
1333
1334    #[test]
1335    fn front_back() {
1336        let mut v: Deque<i32, 4> = Deque::new();
1337        assert_eq!(v.front(), None);
1338        assert_eq!(v.front_mut(), None);
1339        assert_eq!(v.back(), None);
1340        assert_eq!(v.back_mut(), None);
1341
1342        v.push_back(4).unwrap();
1343        assert_eq!(v.front(), Some(&4));
1344        assert_eq!(v.front_mut(), Some(&mut 4));
1345        assert_eq!(v.back(), Some(&4));
1346        assert_eq!(v.back_mut(), Some(&mut 4));
1347
1348        v.push_front(3).unwrap();
1349        assert_eq!(v.front(), Some(&3));
1350        assert_eq!(v.front_mut(), Some(&mut 3));
1351        assert_eq!(v.back(), Some(&4));
1352        assert_eq!(v.back_mut(), Some(&mut 4));
1353
1354        v.pop_back().unwrap();
1355        assert_eq!(v.front(), Some(&3));
1356        assert_eq!(v.front_mut(), Some(&mut 3));
1357        assert_eq!(v.back(), Some(&3));
1358        assert_eq!(v.back_mut(), Some(&mut 3));
1359
1360        v.pop_front().unwrap();
1361        assert_eq!(v.front(), None);
1362        assert_eq!(v.front_mut(), None);
1363        assert_eq!(v.back(), None);
1364        assert_eq!(v.back_mut(), None);
1365    }
1366
1367    #[test]
1368    fn extend() {
1369        let mut v: Deque<i32, 4> = Deque::new();
1370        v.extend(&[1, 2, 3]);
1371        assert_eq!(v.pop_front().unwrap(), 1);
1372        assert_eq!(v.pop_front().unwrap(), 2);
1373        assert_eq!(*v.front().unwrap(), 3);
1374
1375        v.push_back(4).unwrap();
1376        v.extend(&[5, 6]);
1377        assert_eq!(v.pop_front().unwrap(), 3);
1378        assert_eq!(v.pop_front().unwrap(), 4);
1379        assert_eq!(v.pop_front().unwrap(), 5);
1380        assert_eq!(v.pop_front().unwrap(), 6);
1381        assert!(v.pop_front().is_none());
1382    }
1383
1384    #[test]
1385    #[should_panic]
1386    fn extend_panic() {
1387        let mut v: Deque<i32, 4> = Deque::new();
1388        // Is too many elements -> should panic
1389        v.extend(&[1, 2, 3, 4, 5]);
1390    }
1391
1392    #[test]
1393    fn iter() {
1394        let mut v: Deque<i32, 4> = Deque::new();
1395
1396        v.push_back(0).unwrap();
1397        v.push_back(1).unwrap();
1398        v.push_front(2).unwrap();
1399        v.push_front(3).unwrap();
1400        v.pop_back().unwrap();
1401        v.push_front(4).unwrap();
1402
1403        let mut items = v.iter();
1404
1405        assert_eq!(items.next(), Some(&4));
1406        assert_eq!(items.next(), Some(&3));
1407        assert_eq!(items.next(), Some(&2));
1408        assert_eq!(items.next(), Some(&0));
1409        assert_eq!(items.next(), None);
1410    }
1411
1412    #[test]
1413    fn iter_mut() {
1414        let mut v: Deque<i32, 4> = Deque::new();
1415
1416        v.push_back(0).unwrap();
1417        v.push_back(1).unwrap();
1418        v.push_front(2).unwrap();
1419        v.push_front(3).unwrap();
1420        v.pop_back().unwrap();
1421        v.push_front(4).unwrap();
1422
1423        let mut items = v.iter_mut();
1424
1425        assert_eq!(items.next(), Some(&mut 4));
1426        assert_eq!(items.next(), Some(&mut 3));
1427        assert_eq!(items.next(), Some(&mut 2));
1428        assert_eq!(items.next(), Some(&mut 0));
1429        assert_eq!(items.next(), None);
1430    }
1431
1432    #[test]
1433    fn iter_move() {
1434        let mut v: Deque<i32, 4> = Deque::new();
1435        v.push_back(0).unwrap();
1436        v.push_back(1).unwrap();
1437        v.push_back(2).unwrap();
1438        v.push_back(3).unwrap();
1439
1440        let mut items = v.into_iter();
1441
1442        assert_eq!(items.next(), Some(0));
1443        assert_eq!(items.next(), Some(1));
1444        assert_eq!(items.next(), Some(2));
1445        assert_eq!(items.next(), Some(3));
1446        assert_eq!(items.next(), None);
1447    }
1448
1449    #[test]
1450    fn iter_move_back() {
1451        let mut v: Deque<i32, 4> = Deque::new();
1452
1453        v.push_back(0).unwrap();
1454        v.push_back(1).unwrap();
1455        v.push_back(2).unwrap();
1456        v.push_back(3).unwrap();
1457
1458        let mut items = v.into_iter();
1459        assert_eq!(items.next_back(), Some(3));
1460        assert_eq!(items.next_back(), Some(2));
1461        assert_eq!(items.next_back(), Some(1));
1462        assert_eq!(items.next_back(), Some(0));
1463        assert_eq!(items.next_back(), None);
1464    }
1465
1466    #[test]
1467    fn iter_move_len() {
1468        let mut v: Deque<i32, 3> = Deque::new();
1469
1470        v.push_back(0).unwrap();
1471        v.push_back(1).unwrap();
1472        v.push_back(2).unwrap();
1473
1474        let mut items = v.into_iter();
1475        assert_eq!(items.len(), 3);
1476        let _ = items.next();
1477        assert_eq!(items.len(), 2);
1478        let _ = items.next_back();
1479        assert_eq!(items.len(), 1);
1480        let _ = items.next();
1481        assert_eq!(items.len(), 0);
1482    }
1483
1484    #[test]
1485    fn iter_move_drop() {
1486        droppable!();
1487
1488        {
1489            let mut deque: Deque<Droppable, 2> = Deque::new();
1490            deque.push_back(Droppable::new()).ok().unwrap();
1491            deque.push_back(Droppable::new()).ok().unwrap();
1492            let mut items = deque.into_iter();
1493            // Move all
1494            let _ = items.next();
1495            let _ = items.next();
1496        }
1497
1498        assert_eq!(Droppable::count(), 0);
1499
1500        {
1501            let mut deque: Deque<Droppable, 2> = Deque::new();
1502            deque.push_back(Droppable::new()).ok().unwrap();
1503            deque.push_back(Droppable::new()).ok().unwrap();
1504            let _items = deque.into_iter();
1505            // Move none
1506        }
1507
1508        assert_eq!(Droppable::count(), 0);
1509
1510        {
1511            let mut deque: Deque<Droppable, 2> = Deque::new();
1512            deque.push_back(Droppable::new()).ok().unwrap();
1513            deque.push_back(Droppable::new()).ok().unwrap();
1514            let mut items = deque.into_iter();
1515            let _ = items.next(); // Move partly
1516        }
1517
1518        assert_eq!(Droppable::count(), 0);
1519    }
1520
1521    #[test]
1522    fn push_and_pop() {
1523        let mut q: Deque<i32, 4> = Deque::new();
1524        assert_eq!(q.len(), 0);
1525
1526        assert_eq!(q.pop_front(), None);
1527        assert_eq!(q.pop_back(), None);
1528        assert_eq!(q.len(), 0);
1529
1530        q.push_back(0).unwrap();
1531        assert_eq!(q.len(), 1);
1532
1533        assert_eq!(q.pop_back(), Some(0));
1534        assert_eq!(q.len(), 0);
1535
1536        q.push_back(0).unwrap();
1537        q.push_back(1).unwrap();
1538        q.push_front(2).unwrap();
1539        q.push_front(3).unwrap();
1540        assert_eq!(q.len(), 4);
1541
1542        // deque contains: 3 2 0 1
1543        assert_eq!(q.pop_front(), Some(3));
1544        assert_eq!(q.len(), 3);
1545        assert_eq!(q.pop_front(), Some(2));
1546        assert_eq!(q.len(), 2);
1547        assert_eq!(q.pop_back(), Some(1));
1548        assert_eq!(q.len(), 1);
1549        assert_eq!(q.pop_front(), Some(0));
1550        assert_eq!(q.len(), 0);
1551
1552        // deque is now empty
1553        assert_eq!(q.pop_front(), None);
1554        assert_eq!(q.pop_back(), None);
1555        assert_eq!(q.len(), 0);
1556    }
1557
1558    #[test]
1559    fn as_slices() {
1560        let mut q: Deque<i32, 4> = Deque::new();
1561        assert_eq!(q.len(), 0);
1562
1563        q.push_back(0).unwrap();
1564        q.push_back(1).unwrap();
1565        q.push_back(2).unwrap();
1566        q.push_back(3).unwrap();
1567        assert_eq!(q.as_slices(), (&[0, 1, 2, 3][..], &[][..]));
1568
1569        q.pop_front().unwrap();
1570        assert_eq!(q.as_slices(), (&[1, 2, 3][..], &[][..]));
1571
1572        q.push_back(4).unwrap();
1573        assert_eq!(q.as_slices(), (&[1, 2, 3][..], &[4][..]));
1574    }
1575
1576    #[test]
1577    fn clear() {
1578        let mut q: Deque<i32, 4> = Deque::new();
1579        assert_eq!(q.len(), 0);
1580
1581        q.push_back(0).unwrap();
1582        q.push_back(1).unwrap();
1583        q.push_back(2).unwrap();
1584        q.push_back(3).unwrap();
1585        assert_eq!(q.len(), 4);
1586
1587        q.clear();
1588        assert_eq!(q.len(), 0);
1589
1590        q.push_back(0).unwrap();
1591        assert_eq!(q.len(), 1);
1592    }
1593
1594    #[test]
1595    fn make_contiguous() {
1596        let mut q: Deque<i32, 4> = Deque::new();
1597        assert_eq!(q.len(), 0);
1598
1599        q.push_back(0).unwrap();
1600        q.push_back(1).unwrap();
1601        q.push_back(2).unwrap();
1602        q.push_back(3).unwrap();
1603
1604        // Deque contains: 0, 1, 2, 3
1605        assert_eq!(q.pop_front(), Some(0));
1606        assert_eq!(q.pop_front(), Some(1));
1607
1608        // Deque contains: ., ., 2, 3
1609        q.push_back(4).unwrap();
1610
1611        // Deque contains: 4, ., 2, 3
1612        assert_eq!(q.as_slices(), ([2, 3].as_slice(), [4].as_slice()));
1613
1614        assert_eq!(q.make_contiguous(), &[2, 3, 4]);
1615
1616        // Deque contains: ., 2, 3, 4
1617        assert_eq!(q.as_slices(), ([2, 3, 4].as_slice(), [].as_slice()));
1618
1619        assert_eq!(q.pop_front(), Some(2));
1620        assert_eq!(q.pop_front(), Some(3));
1621        q.push_back(5).unwrap();
1622        q.push_back(6).unwrap();
1623
1624        // Deque contains: 5, 6, ., 4
1625        assert_eq!(q.as_slices(), ([4].as_slice(), [5, 6].as_slice()));
1626
1627        assert_eq!(q.make_contiguous(), &[4, 5, 6]);
1628
1629        // Deque contains: 4, 5, 6, .
1630        assert_eq!(q.as_slices(), ([4, 5, 6].as_slice(), [].as_slice()));
1631
1632        assert_eq!(q.pop_front(), Some(4));
1633        q.push_back(7).unwrap();
1634        q.push_back(8).unwrap();
1635
1636        // Deque contains: 8, 5, 6, 7
1637        assert_eq!(q.as_slices(), ([5, 6, 7].as_slice(), [8].as_slice()));
1638
1639        assert_eq!(q.make_contiguous(), &[5, 6, 7, 8]);
1640
1641        // Deque contains: 5, 6, 7, 8
1642        assert_eq!(q.as_slices(), ([5, 6, 7, 8].as_slice(), [].as_slice()));
1643    }
1644
1645    #[test]
1646    fn get() {
1647        let mut q: Deque<i32, 4> = Deque::new();
1648        assert_eq!(q.get(0), None);
1649
1650        q.push_back(0).unwrap();
1651        assert_eq!(q.get(0), Some(&0));
1652        assert_eq!(q.get(1), None);
1653
1654        q.push_back(1).unwrap();
1655        assert_eq!(q.get(0), Some(&0));
1656        assert_eq!(q.get(1), Some(&1));
1657        assert_eq!(q.get(2), None);
1658
1659        q.pop_front().unwrap();
1660        assert_eq!(q.get(0), Some(&1));
1661        assert_eq!(q.get(1), None);
1662
1663        q.push_back(2).unwrap();
1664        q.push_back(3).unwrap();
1665        q.push_back(4).unwrap();
1666        assert_eq!(q.get(0), Some(&1));
1667        assert_eq!(q.get(1), Some(&2));
1668        assert_eq!(q.get(2), Some(&3));
1669        assert_eq!(q.get(3), Some(&4));
1670    }
1671
1672    #[test]
1673    fn get_mut() {
1674        let mut q: Deque<i32, 4> = Deque::new();
1675        assert_eq!(q.get(0), None);
1676
1677        q.push_back(0).unwrap();
1678        assert_eq!(q.get_mut(0), Some(&mut 0));
1679        assert_eq!(q.get_mut(1), None);
1680
1681        q.push_back(1).unwrap();
1682        assert_eq!(q.get_mut(0), Some(&mut 0));
1683        assert_eq!(q.get_mut(1), Some(&mut 1));
1684        assert_eq!(q.get_mut(2), None);
1685        *q.get_mut(0).unwrap() = 42;
1686        *q.get_mut(1).unwrap() = 43;
1687
1688        assert_eq!(q.pop_front(), Some(42));
1689        assert_eq!(q.pop_front(), Some(43));
1690        assert_eq!(q.pop_front(), None);
1691    }
1692
1693    #[test]
1694    fn swap() {
1695        let mut q: Deque<i32, 4> = Deque::new();
1696        q.push_back(40).unwrap();
1697        q.push_back(41).unwrap();
1698        q.push_back(42).unwrap();
1699        q.pop_front().unwrap();
1700        q.push_back(43).unwrap();
1701        assert_eq!(*q.get(0).unwrap(), 41);
1702        assert_eq!(*q.get(1).unwrap(), 42);
1703        assert_eq!(*q.get(2).unwrap(), 43);
1704
1705        q.swap(0, 1);
1706        assert_eq!(*q.get(0).unwrap(), 42);
1707        assert_eq!(*q.get(1).unwrap(), 41);
1708        assert_eq!(*q.get(2).unwrap(), 43);
1709
1710        q.swap(1, 2);
1711        assert_eq!(*q.get(0).unwrap(), 42);
1712        assert_eq!(*q.get(1).unwrap(), 43);
1713        assert_eq!(*q.get(2).unwrap(), 41);
1714
1715        q.swap(1, 1);
1716        assert_eq!(*q.get(0).unwrap(), 42);
1717        assert_eq!(*q.get(1).unwrap(), 43);
1718        assert_eq!(*q.get(2).unwrap(), 41);
1719    }
1720
1721    #[test]
1722    fn swap_remove_front() {
1723        let mut q: Deque<i32, 4> = Deque::new();
1724        q.push_back(40).unwrap();
1725        q.push_back(41).unwrap();
1726        q.push_back(42).unwrap();
1727        q.push_back(43).unwrap();
1728
1729        assert_eq!(q.swap_remove_front(2), Some(42));
1730        assert_eq!(q.swap_remove_front(1), Some(40));
1731        assert_eq!(q.swap_remove_front(0), Some(41));
1732        assert_eq!(q.swap_remove_front(1), None);
1733        assert_eq!(q.swap_remove_front(4), None);
1734        assert_eq!(q.swap_remove_front(6), None);
1735        assert_eq!(q.swap_remove_front(0), Some(43));
1736    }
1737
1738    #[test]
1739    fn swap_remove_back() {
1740        let mut q: Deque<i32, 4> = Deque::new();
1741        q.push_back(40).unwrap();
1742        q.push_back(41).unwrap();
1743        q.push_back(42).unwrap();
1744        q.push_back(43).unwrap();
1745        q.pop_front().unwrap();
1746        q.push_back(44).unwrap();
1747
1748        assert_eq!(q.swap_remove_back(1), Some(42));
1749        assert_eq!(q.swap_remove_front(1), Some(44));
1750        assert_eq!(q.swap_remove_front(0), Some(41));
1751        assert_eq!(q.swap_remove_front(1), None);
1752        assert_eq!(q.swap_remove_front(4), None);
1753        assert_eq!(q.swap_remove_front(6), None);
1754        assert_eq!(q.swap_remove_front(0), Some(43));
1755    }
1756
1757    #[test]
1758    #[should_panic = "i < len"]
1759    fn swap_i_out_of_bounds() {
1760        let mut q: Deque<i32, 4> = Deque::new();
1761        q.push_back(40).unwrap();
1762        q.push_back(41).unwrap();
1763        q.push_back(42).unwrap();
1764        q.pop_front().unwrap();
1765        q.swap(2, 0);
1766    }
1767
1768    #[test]
1769    #[should_panic = "j < len"]
1770    fn swap_j_out_of_bounds() {
1771        let mut q: Deque<i32, 4> = Deque::new();
1772        q.push_back(40).unwrap();
1773        q.push_back(41).unwrap();
1774        q.push_back(42).unwrap();
1775        q.pop_front().unwrap();
1776        q.swap(0, 2);
1777    }
1778
1779    #[test]
1780    fn equality() {
1781        let mut a: Deque<i32, 7> = Deque::new();
1782        let mut b: Deque<i32, 7> = Deque::new();
1783
1784        assert_eq!(a, b);
1785
1786        a.push_back(1).unwrap();
1787        a.push_back(2).unwrap();
1788        a.push_back(3).unwrap();
1789
1790        assert_ne!(a, b);
1791
1792        b.push_back(1).unwrap();
1793        b.push_back(2).unwrap();
1794        b.push_back(3).unwrap();
1795
1796        assert_eq!(a, b);
1797
1798        a.push_back(1).unwrap();
1799        a.push_back(2).unwrap();
1800        a.push_back(3).unwrap();
1801
1802        assert_ne!(a, b);
1803
1804        b.push_front(3).unwrap();
1805        b.push_front(2).unwrap();
1806        b.push_front(1).unwrap();
1807
1808        assert_eq!(a, b);
1809
1810        a.push_back(4).unwrap();
1811        b.push_back(4).unwrap();
1812
1813        assert_eq!(a, b);
1814
1815        a.clear();
1816        b.clear();
1817
1818        a.push_back(1).unwrap();
1819        a.push_back(2).unwrap();
1820        a.push_back(3).unwrap();
1821        a.push_front(3).unwrap();
1822        a.push_front(2).unwrap();
1823        a.push_front(1).unwrap();
1824
1825        b.push_back(2).unwrap();
1826        b.push_back(3).unwrap();
1827        b.push_back(1).unwrap();
1828        b.push_back(2).unwrap();
1829        b.push_back(3).unwrap();
1830        b.push_front(1).unwrap();
1831
1832        assert_eq!(a, b);
1833    }
1834
1835    #[test]
1836    fn try_from_array() {
1837        // Array is too big error.
1838        assert!(matches!(
1839            Deque::<u8, 3>::try_from([1, 2, 3, 4]),
1840            Err((CapacityError, [1, 2, 3, 4]))
1841        ));
1842
1843        // Array is at limit.
1844        let deq1 = Deque::<u8, 3>::try_from([1, 2, 3]).unwrap();
1845        let mut deq2 = Deque::<u8, 3>::new();
1846        deq2.push_back(1).unwrap();
1847        deq2.push_back(2).unwrap();
1848        deq2.push_back(3).unwrap();
1849        assert!(deq1.is_full());
1850        assert_eq!(deq1, deq2);
1851
1852        // Array is under limit.
1853        let deq1 = Deque::<u8, 8>::try_from([1, 2, 3, 4]).unwrap();
1854        let mut deq2 = Deque::<u8, 8>::new();
1855        deq2.push_back(1).unwrap();
1856        deq2.push_back(2).unwrap();
1857        deq2.push_back(3).unwrap();
1858        deq2.push_back(4).unwrap();
1859
1860        assert!(!deq1.is_full());
1861        assert_eq!(deq1, deq2);
1862    }
1863
1864    #[test]
1865    fn try_from_array_with_zst() {
1866        #[derive(Debug, PartialEq, Copy, Clone)]
1867        struct ZeroSizedType;
1868
1869        // Test with ZST (zero-sized type)
1870        let deq1 =
1871            Deque::<ZeroSizedType, 5>::try_from([ZeroSizedType, ZeroSizedType, ZeroSizedType])
1872                .unwrap();
1873        let mut deq2 = Deque::<ZeroSizedType, 5>::new();
1874        deq2.push_back(ZeroSizedType).unwrap();
1875        deq2.push_back(ZeroSizedType).unwrap();
1876        deq2.push_back(ZeroSizedType).unwrap();
1877
1878        assert_eq!(deq1, deq2);
1879        assert_eq!(deq1.len(), 3);
1880    }
1881
1882    #[test]
1883    fn try_from_array_drop() {
1884        droppable!();
1885
1886        // Array is over limit.
1887        {
1888            let _result = Deque::<Droppable, 2>::try_from([
1889                Droppable::new(),
1890                Droppable::new(),
1891                Droppable::new(),
1892            ]);
1893        }
1894
1895        assert_eq!(Droppable::count(), 0);
1896
1897        // Array is at limit.
1898        {
1899            let _result = Deque::<Droppable, 3>::try_from([
1900                Droppable::new(),
1901                Droppable::new(),
1902                Droppable::new(),
1903            ]);
1904        }
1905
1906        assert_eq!(Droppable::count(), 0);
1907
1908        // Array is under limit.
1909        {
1910            let _result = Deque::<Droppable, 4>::try_from([
1911                Droppable::new(),
1912                Droppable::new(),
1913                Droppable::new(),
1914            ]);
1915        }
1916
1917        assert_eq!(Droppable::count(), 0);
1918    }
1919
1920    #[test]
1921    #[cfg(feature = "zeroize")]
1922    fn test_deque_zeroize() {
1923        use zeroize::Zeroize;
1924
1925        let mut deque = Deque::<u8, 16>::new();
1926
1927        for i in 1..=8 {
1928            deque.push_back(i).unwrap();
1929        }
1930        for i in 9..=16 {
1931            deque.push_front(i).unwrap();
1932        }
1933
1934        assert_eq!(deque.len(), 16);
1935        assert_eq!(deque.front(), Some(&16));
1936        assert_eq!(deque.back(), Some(&8));
1937
1938        // zeroized using Vec's implementation
1939        deque.zeroize();
1940
1941        assert_eq!(deque.len(), 0);
1942        assert!(deque.is_empty());
1943    }
1944
1945    // Checking that no invalid destructors are called with empty Deques
1946    #[test]
1947    fn truncate_empty() {
1948        droppable!();
1949
1950        const LEN: usize = 1;
1951        let mut tester: Deque<_, LEN> = Deque::new();
1952
1953        // Truncate to 0 from 0
1954        tester.truncate(0);
1955        assert_eq!(tester.len(), 0);
1956        assert_eq!(Droppable::count(), 0);
1957
1958        // Truncate to 123 from 0 (thus clamping back down to 0)
1959        tester.truncate(123);
1960        assert_eq!(tester.len(), 0);
1961        assert_eq!(Droppable::count(), 0);
1962
1963        // Ensure state is still valid by pushing one element in and then truncating again
1964        assert!(tester.push_front(Droppable::new()).is_ok());
1965        assert_eq!(tester.len(), 1);
1966        assert_eq!(Droppable::count(), 1);
1967
1968        // Truncate to 0 from 1
1969        tester.truncate(0);
1970        assert_eq!(tester.len(), 0);
1971        assert_eq!(Droppable::count(), 0);
1972    }
1973
1974    // Testing truncation with contiguous Deques
1975    #[test]
1976    fn truncate_contiguous() {
1977        droppable!();
1978
1979        fn slice_lengths<T>(slices: (&[T], &[T])) -> (usize, usize) {
1980            let (a, b) = slices;
1981            (a.len(), b.len())
1982        }
1983
1984        const LEN: usize = 20;
1985        let mut tester: Deque<_, LEN> = Deque::new();
1986
1987        // Filling from front.
1988        for _ in 0..5 {
1989            assert!(tester.push_front(Droppable::new()).is_ok());
1990        }
1991
1992        // Truncating past the elements present, no change.
1993        tester.truncate(10);
1994        let lens = slice_lengths(tester.as_slices());
1995        assert_eq!(lens, (5, 0));
1996        assert_eq!(Droppable::count(), 5);
1997
1998        // Truncating equal to elements present, no change.
1999        tester.truncate(5);
2000        let lens = slice_lengths(tester.as_slices());
2001        assert_eq!(lens, (5, 0));
2002        assert_eq!(Droppable::count(), 5);
2003
2004        // Truncating to empty.
2005        tester.truncate(0);
2006        assert_eq!(tester.len(), 0);
2007        assert_eq!(Droppable::count(), 0);
2008
2009        // Refill from front.
2010        for _ in 0..5 {
2011            assert!(tester.push_front(Droppable::new()).is_ok());
2012        }
2013
2014        let lens = slice_lengths(tester.as_slices());
2015        assert_eq!(lens, (5, 0));
2016        assert_eq!(Droppable::count(), 5);
2017
2018        // Truncate into the middle of elements.
2019        tester.truncate(3);
2020        let lens = slice_lengths(tester.as_slices());
2021        assert_eq!(lens, (3, 0));
2022        assert_eq!(Droppable::count(), 3);
2023
2024        // Truncating to empty.
2025        tester.truncate(0);
2026        assert_eq!(tester.len(), 0);
2027        assert_eq!(Droppable::count(), 0);
2028
2029        // Resetting cursors.
2030        tester.clear();
2031
2032        // Filling from back...
2033        for _ in 0..5 {
2034            assert!(tester.push_back(Droppable::new()).is_ok());
2035        }
2036
2037        tester.truncate(10);
2038        let lens = slice_lengths(tester.as_slices());
2039        assert_eq!(lens, (5, 0));
2040        assert_eq!(Droppable::count(), 5);
2041
2042        tester.truncate(5);
2043        let lens = slice_lengths(tester.as_slices());
2044        assert_eq!(lens, (5, 0));
2045        assert_eq!(Droppable::count(), 5);
2046
2047        tester.truncate(0);
2048        assert_eq!(tester.len(), 0);
2049        assert_eq!(Droppable::count(), 0);
2050
2051        for _ in 0..5 {
2052            assert!(tester.push_back(Droppable::new()).is_ok());
2053        }
2054
2055        let lens = slice_lengths(tester.as_slices());
2056        assert_eq!(lens, (5, 0));
2057        assert_eq!(Droppable::count(), 5);
2058
2059        tester.truncate(3);
2060        let lens = slice_lengths(tester.as_slices());
2061        assert_eq!(lens, (3, 0));
2062        assert_eq!(Droppable::count(), 3);
2063
2064        tester.truncate(0);
2065        assert_eq!(tester.len(), 0);
2066        assert_eq!(Droppable::count(), 0);
2067    }
2068
2069    // Testing truncation with non-contiguous Deques
2070    #[test]
2071    fn truncate_non_contiguous() {
2072        const LEN: usize = 20;
2073        let mut tester: Deque<u8, LEN> = Deque::new();
2074
2075        // Filling non-contiguously.
2076        //
2077        // Expecting [3, 2, 1, 1, 2, 3]
2078        for x in 1..=3 {
2079            assert!(tester.push_front(x).is_ok());
2080        }
2081        for y in 1..=3 {
2082            assert!(tester.push_back(y).is_ok());
2083        }
2084
2085        // Truncating past the elements present, no change.
2086        tester.truncate(10);
2087        assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[1, 2, 3][..]));
2088        println!("{} {}", tester.front, tester.back);
2089        // Truncating equal to elements present, no change.
2090        tester.truncate(6);
2091        assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[1, 2, 3][..]));
2092
2093        // Truncating to empty.
2094        tester.truncate(0);
2095        assert_eq!(tester.as_slices(), (&[][..], &[][..]));
2096
2097        // Resetting cursors.
2098        tester.clear();
2099
2100        // Refilling.
2101        for x in 1..=3 {
2102            assert!(tester.push_front(x).is_ok());
2103        }
2104        for y in 1..=3 {
2105            assert!(tester.push_back(y).is_ok());
2106        }
2107
2108        assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[1, 2, 3][..]));
2109
2110        // Truncating only part of back, retaining front and part of back.
2111        tester.truncate(5);
2112        assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[1, 2][..]));
2113
2114        // Replacing the truncated element.
2115        assert!(tester.push_back(3).is_ok());
2116        assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[1, 2, 3][..]));
2117
2118        // Truncating away all of back's contents, but retaining all of front's contents.
2119        tester.truncate(3);
2120        assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[][..]));
2121
2122        // Replacing the truncated elements.
2123        for y in 1..=3 {
2124            assert!(tester.push_back(y).is_ok());
2125        }
2126        assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[1, 2, 3][..]));
2127
2128        // Truncating into front, thus also dropping all of back.
2129        tester.truncate(2);
2130        assert_eq!(tester.as_slices(), (&[3, 2][..], &[][..]));
2131
2132        // Truncating to empty.
2133        tester.truncate(0);
2134        assert_eq!(tester.as_slices(), (&[][..], &[][..]));
2135
2136        // Should remain empty.
2137        tester.truncate(123);
2138        assert_eq!(tester.as_slices(), (&[][..], &[][..]));
2139    }
2140
2141    // Tests that each element's destructor is called when being truncated.
2142    #[test]
2143    fn truncate_drop_count() {
2144        droppable!();
2145
2146        const LEN: usize = 20;
2147        const TRUNC: usize = 3;
2148        for push_front_amt in 0..=LEN {
2149            let mut tester: Deque<_, LEN> = Deque::new();
2150            for index in 0..LEN {
2151                if index < push_front_amt {
2152                    assert!(
2153                        tester.push_front(Droppable::new()).is_ok(),
2154                        "deque must have room for all {LEN} entries"
2155                    );
2156                } else {
2157                    assert!(
2158                        tester.push_back(Droppable::new()).is_ok(),
2159                        "deque must have room for all {LEN} entries"
2160                    );
2161                }
2162            }
2163
2164            assert_eq!(Droppable::count(), LEN as i32);
2165
2166            tester.truncate(TRUNC);
2167            assert_eq!(tester.len(), TRUNC);
2168            assert_eq!(Droppable::count(), TRUNC as i32);
2169
2170            tester.truncate(0);
2171            assert_eq!(tester.len(), 0);
2172            assert_eq!(Droppable::count(), 0);
2173        }
2174    }
2175
2176    #[test]
2177    fn retain() {
2178        droppable!();
2179
2180        const LEN: usize = 20;
2181        for push_front_amt in 0..=LEN {
2182            let mut tester: Deque<_, LEN> = Deque::new();
2183            for index in 0..LEN {
2184                if index < push_front_amt {
2185                    assert!(tester.push_front((index, Droppable::new())).is_ok());
2186                } else {
2187                    assert!(tester.push_back((index, Droppable::new())).is_ok());
2188                }
2189            }
2190            assert_eq!(Droppable::count(), LEN as i32);
2191
2192            tester.retain(|(x, _)| *x >= 10);
2193
2194            assert_eq!(tester.len(), 10);
2195            assert_eq!(Droppable::count(), 10);
2196        }
2197    }
2198}