Skip to main content

linear_deque/
lib.rs

1#![cfg_attr(not(any(feature = "std", test)), no_std)]
2#![warn(missing_docs)]
3#![doc(test(attr(deny(warnings))))]
4
5//! A double-ended queue that can be sliced at any time without preparation.
6//!
7//! # [`LinearDeque`] vs [`VecDeque`]
8//!
9//! ## Slicing
10//!
11//! The standard [`VecDeque`] uses a ring buffer. It requires that the
12//! [`make_contiguous`] method is called to ensure that the deque content can
13//! all be referenced in a single slice. [`make_contiguous`] is only callable on
14//! a mutable instance of the deque.
15//!
16//! The [`LinearDeque`] provided by this lib uses a linear buffer, keeping all
17//! its content contiguous and allowing to have a slice with all the content at
18//! any time, even when the deque is not mutable.
19//!
20//! ## Memory Usage
21//!
22//! By using a ring buffer, all spare memory allocated by the standard
23//! [`VecDeque`] can be used for elements added at both the front and the back
24//! ends.
25//!
26//! Using a linear buffer, each end of the [`LinearDeque`] have its own reserved
27//! memory, so it tends to use more memory a do more re-allocations than [`VecDeque`].
28//!
29//!  # `no_std`, `alloc` and the `std` feature
30//!
31//! For backward compatibility, this crate uses [`std`] by default. The `std` feature
32//! can be disabled to use this crate in a `no_std` environment. In that case, the crate
33//! will use the [`alloc`] crate instead of [`std`] for heap allocation and other utilities.
34//!
35//!  The only functionality that is gated behind the `std` feature is the implementation of
36//! [`Read`] and [`Write`] traits for `LinearDeque<u8>`.
37//!
38//! To disable the `std` feature, add the following to the `dependencies` in your `Cargo.toml`:
39//!
40//! ```toml
41//! linear-deque = { version = "0.1", default-features = false }
42//!  ```
43//!
44//! [`VecDeque`]: std::collections::VecDeque
45//! [`make_contiguous`]: std::collections::VecDeque::make_contiguous
46
47extern crate alloc;
48
49use alloc::vec::Vec;
50use core::cmp::Ordering;
51use core::fmt::Debug;
52use core::hash::Hash;
53use core::marker::PhantomData;
54use core::ops::{Bound, Deref, DerefMut, RangeBounds};
55use core::ptr;
56use core::{cmp, mem};
57#[cfg(feature = "std")]
58use std::io::{Read, Write};
59
60use buffer::Buffer;
61use iter::RawValIter;
62
63mod buffer;
64mod iter;
65
66#[cfg(test)]
67mod drop_tracker;
68
69/// A double-ended queue implemented with a growable linear buffer.
70///
71/// A `LinearDeque` with a known list of items can be initialized from an array:
72///
73/// ```
74/// use linear_deque::LinearDeque;
75///
76/// # #[allow(unused)]
77/// let deq = LinearDeque::from([-1, 0, 1]);
78/// ```
79///
80/// Since `LinearDeque` is a linear buffer, its elements are contiguous in
81/// memory, and it can be coerced into a slice at any time.
82pub struct LinearDeque<T> {
83    buf: Buffer<T>,
84    len: usize,
85    off: usize,
86}
87
88unsafe impl<T: Send> Send for LinearDeque<T> {}
89unsafe impl<T: Sync> Sync for LinearDeque<T> {}
90
91impl<T> LinearDeque<T> {
92    fn ptr(&self) -> *mut T {
93        self.buf.ptr.as_ptr()
94    }
95
96    fn cap(&self) -> usize {
97        self.buf.cap
98    }
99
100    /// Creates an empty deque.
101    ///
102    /// # Example
103    ///
104    /// ```
105    /// use linear_deque::LinearDeque;
106    /// # #[allow(unused)]
107    /// let deque: LinearDeque<u32> = LinearDeque::new();
108    /// ```
109    #[must_use]
110    pub fn new() -> Self {
111        Self::with_reserved_space(0, 0)
112    }
113
114    /// Creates an empty deque with reserved spaces at the front and the back.
115    ///
116    /// # Example
117    ///
118    /// ```
119    /// use linear_deque::LinearDeque;
120    ///
121    /// let deque: LinearDeque<u32> = LinearDeque::with_reserved_space(3, 7);
122    ///
123    /// assert_eq!(deque.reserved_front_space(), 3);
124    /// assert_eq!(deque.reserved_back_space(), 7);
125    /// assert_eq!(deque.len(), 0);
126    /// ```
127    #[must_use]
128    pub fn with_reserved_space(front: usize, back: usize) -> Self {
129        let mut buf = Buffer::new();
130
131        let cap = front + back;
132        if cap > 0 && !is_zst::<T>() {
133            buf.realloc(cap);
134        }
135
136        LinearDeque {
137            buf,
138            len: 0,
139            off: front,
140        }
141    }
142
143    /// Provides a reference to the front element, or `None` if the deque is
144    /// empty.
145    ///
146    /// # Example
147    ///
148    /// ```
149    /// use linear_deque::LinearDeque;
150    ///
151    /// let mut d = LinearDeque::new();
152    /// assert_eq!(d.front(), None);
153    ///
154    /// d.push_back(1);
155    /// d.push_back(2);
156    /// assert_eq!(d.front(), Some(&1));
157    /// ```
158    #[must_use]
159    pub fn front(&self) -> Option<&T> {
160        self.first()
161    }
162
163    /// Provides a mutable reference to the front element, or `None` if the
164    /// deque is empty.
165    ///
166    /// # Example
167    ///
168    /// ```
169    /// use linear_deque::LinearDeque;
170    ///
171    /// let mut d = LinearDeque::new();
172    /// assert_eq!(d.front_mut(), None);
173    ///
174    /// d.push_back(1);
175    /// d.push_back(2);
176    /// match d.front_mut() {
177    ///     Some(x) => *x = 9,
178    ///     None => (),
179    /// }
180    /// assert_eq!(d.front(), Some(&9));
181    /// ```
182    pub fn front_mut(&mut self) -> Option<&mut T> {
183        self.first_mut()
184    }
185
186    /// Provides a reference to the back element, or `None` if the deque is
187    /// empty.
188    ///
189    /// # Example
190    ///
191    /// ```
192    /// use linear_deque::LinearDeque;
193    ///
194    /// let mut d = LinearDeque::new();
195    /// assert_eq!(d.back(), None);
196    ///
197    /// d.push_back(1);
198    /// d.push_back(2);
199    /// assert_eq!(d.back(), Some(&2));
200    /// ```
201    #[must_use]
202    pub fn back(&self) -> Option<&T> {
203        self.last()
204    }
205
206    /// Provides a mutable reference to the back element, or `None` if the
207    /// deque is empty.
208    ///
209    /// # Example
210    ///
211    /// ```
212    /// use linear_deque::LinearDeque;
213    ///
214    /// let mut d = LinearDeque::new();
215    /// assert_eq!(d.back(), None);
216    ///
217    /// d.push_back(1);
218    /// d.push_back(2);
219    /// match d.back_mut() {
220    ///     Some(x) => *x = 9,
221    ///     None => (),
222    /// }
223    /// assert_eq!(d.back(), Some(&9));
224    /// ```
225    pub fn back_mut(&mut self) -> Option<&mut T> {
226        self.last_mut()
227    }
228
229    /// Prepends an element to the deque.
230    ///
231    /// # Example
232    ///
233    /// ```
234    /// use linear_deque::LinearDeque;
235    ///
236    /// let mut d = LinearDeque::new();
237    /// d.push_front(1);
238    /// d.push_front(2);
239    /// assert_eq!(d.front(), Some(&2));
240    /// ```
241    pub fn push_front(&mut self, elem: T) {
242        if !is_zst::<T>() {
243            self.ensure_reserved_front_space(1);
244            unsafe {
245                self.off -= 1;
246                ptr::write(self.ptr().add(self.off), elem);
247            }
248        }
249        self.len += 1;
250    }
251
252    /// Appends an element to the back of the deque.
253    ///
254    /// # Example
255    ///
256    /// ```
257    /// use linear_deque::LinearDeque;
258    ///
259    /// let mut buf = LinearDeque::new();
260    /// buf.push_back(1);
261    /// buf.push_back(3);
262    /// assert_eq!(3, *buf.back().unwrap());
263    /// ```
264    pub fn push_back(&mut self, elem: T) {
265        self.ensure_reserved_back_space(1);
266        unsafe {
267            ptr::write(self.ptr().add(self.off + self.len), elem);
268        }
269
270        self.len += 1;
271    }
272
273    /// Removes the first element and returns it, or `None` if the deque is
274    /// empty.
275    ///
276    /// # Example
277    ///
278    /// ```
279    /// use linear_deque::LinearDeque;
280    ///
281    /// let mut d = LinearDeque::new();
282    /// d.push_back(1);
283    /// d.push_back(2);
284    ///
285    /// assert_eq!(d.pop_front(), Some(1));
286    /// assert_eq!(d.pop_front(), Some(2));
287    /// assert_eq!(d.pop_front(), None);
288    /// ```
289    pub fn pop_front(&mut self) -> Option<T> {
290        if self.len == 0 {
291            None
292        } else {
293            self.len -= 1;
294            self.off += 1;
295            unsafe { Some(ptr::read(self.ptr().add(self.off - 1))) }
296        }
297    }
298
299    /// Removes the last element from the deque and returns it, or `None` if
300    /// it is empty.
301    ///
302    /// # Example
303    ///
304    /// ```
305    /// use linear_deque::LinearDeque;
306    ///
307    /// let mut buf = LinearDeque::new();
308    /// assert_eq!(buf.pop_back(), None);
309    /// buf.push_back(1);
310    /// buf.push_back(3);
311    /// assert_eq!(buf.pop_back(), Some(3));
312    /// ```
313    pub fn pop_back(&mut self) -> Option<T> {
314        if self.len == 0 {
315            None
316        } else {
317            self.len -= 1;
318            unsafe { Some(ptr::read(self.ptr().add(self.off + self.len))) }
319        }
320    }
321
322    /// Inserts an element at `index` within the deque, shifting all elements
323    /// before or after the index.
324    ///
325    /// If `index` is nearer to the front, the elements with indices lower than
326    /// `index` are moved to the left; otherwise, the elements with indices
327    /// grater than `index` are moved right.
328    ///
329    /// Element at index 0 is the front of the queue.
330    ///
331    /// # Panics
332    ///
333    /// Panics if `index` is greater than deque's length
334    ///
335    /// # Example
336    ///
337    /// ```
338    /// use linear_deque::LinearDeque;
339    ///
340    /// let mut deque = LinearDeque::new();
341    /// deque.push_back('a');
342    /// deque.push_back('b');
343    /// deque.push_back('c');
344    /// assert_eq!(deque, &['a', 'b', 'c']);
345    ///
346    /// deque.insert(1, 'd');
347    /// assert_eq!(deque, &['a', 'd', 'b', 'c']);
348    /// ```
349    pub fn insert(&mut self, index: usize, elem: T) {
350        assert!(index <= self.len, "index out of bounds");
351
352        if !is_zst::<T>() {
353            if 2 * index < self.len {
354                // near front
355                unsafe {
356                    let pending_copy = self.prepare_reserved_front_space(1);
357                    let (mut front_copy, back_copy) = pending_copy.split(index);
358                    front_copy.dst -= 1;
359                    back_copy.perform(self.ptr());
360                    front_copy.perform(self.ptr());
361                    self.off -= 1;
362                    ptr::write(self.ptr().add(self.off + index), elem);
363                }
364            } else {
365                // near back
366                unsafe {
367                    let pending_copy = self.prepare_reserved_back_space(1);
368                    let (front_copy, mut back_copy) = pending_copy.split(index);
369                    back_copy.dst += 1;
370                    front_copy.perform(self.ptr());
371                    back_copy.perform(self.ptr());
372                    ptr::write(self.ptr().add(self.off + index), elem);
373                }
374            }
375        }
376        self.len += 1;
377    }
378
379    /// Removes and returns the element at `index` from the deque.
380    /// Whichever end is closer to the removal point will be moved to make
381    /// room, and all the affected elements will be moved to new positions.
382    /// Returns `None` if `index` is out of bounds.
383    ///
384    /// Element at index 0 is the front of the queue.
385    ///
386    /// # Example
387    ///
388    /// ```
389    /// use linear_deque::LinearDeque;
390    ///
391    /// let mut buf = LinearDeque::new();
392    /// buf.push_back(1);
393    /// buf.push_back(2);
394    /// buf.push_back(3);
395    /// assert_eq!(buf, [1, 2, 3]);
396    ///
397    /// assert_eq!(buf.remove(1), Some(2));
398    /// assert_eq!(buf, [1, 3]);
399    /// ```
400    pub fn remove(&mut self, index: usize) -> Option<T> {
401        if index < self.len {
402            unsafe {
403                let start = self.ptr().add(self.off);
404                let result = ptr::read(start.add(index));
405
406                if index < self.len / 2 {
407                    // near front
408                    ptr::copy(start, start.add(1), index);
409                    self.off += 1;
410                } else {
411                    // near back
412                    ptr::copy(start.add(index + 1), start.add(index), self.len - index - 1);
413                }
414                self.len -= 1;
415
416                Some(result)
417            }
418        } else {
419            None
420        }
421    }
422
423    /// Removes the specified range from the deque in bulk, returning all removed
424    /// elements as an iterator. If the iterator is dropped before being fully
425    /// consumed, it drops the remaining removed elements.
426    ///
427    /// The returned iterator keeps a mutable borrow on the queue to optimize
428    /// its implementation.
429    ///
430    /// After draining, the remaining unused allocated memory is equally split
431    /// as reserved space for both ends.
432    ///
433    /// # Panics
434    ///
435    /// Panics if the starting point is greater than the end point or if
436    /// the end point is greater than the length of the deque.
437    ///
438    ///
439    /// # Example
440    ///
441    /// ```
442    /// use linear_deque::LinearDeque;
443    ///
444    /// let mut deque: LinearDeque<_> = [1, 2, 3].into();
445    /// let drained = deque.drain(2..).collect::<LinearDeque<_>>();
446    /// assert_eq!(drained, [3]);
447    /// assert_eq!(deque, [1, 2]);
448    ///
449    /// // A full range clears all contents, like `clear()` does
450    /// deque.drain(..);
451    /// assert!(deque.is_empty());
452    /// ```
453    pub fn drain<R>(&mut self, range: R) -> Drain<'_, T>
454    where
455        R: RangeBounds<usize>,
456    {
457        let start = match range.start_bound() {
458            Bound::Included(&start) => start,
459            Bound::Excluded(start) => start.checked_add(1).expect("invalid start index"),
460            Bound::Unbounded => 0,
461        };
462
463        let end = match range.end_bound() {
464            Bound::Included(end) => end.checked_add(1).expect("invalid end index"),
465            Bound::Excluded(&end) => end,
466            Bound::Unbounded => self.len,
467        };
468
469        assert!(!(start > end || end > self.len), "invalid range");
470
471        let iter = unsafe { RawValIter::new(&self[start..end]) };
472
473        let front_len = start;
474        let back_len = self.len - end;
475        let count = end - start;
476
477        let pending_copy = if front_len < back_len {
478            let prev_off = self.off;
479            self.off += count;
480            PendingCopy {
481                src: prev_off,
482                dst: prev_off + count,
483                count: front_len,
484            }
485        } else {
486            PendingCopy {
487                src: self.off + end,
488                dst: self.off + start,
489                count: back_len,
490            }
491        };
492
493        self.len -= count;
494
495        Drain {
496            iter,
497            pending_copy,
498            ptr: self.ptr(),
499            vec: PhantomData,
500        }
501    }
502
503    /// Extends the deque at the front end.
504    ///
505    /// It's the same as iterating on the `iter` parameter, passing each element
506    /// to [`push_front`].
507    ///
508    /// [`push_front`]: LinearDeque::push_front
509    ///
510    /// # Example
511    ///
512    /// ```
513    /// use linear_deque::LinearDeque;
514    ///
515    /// let mut deque = LinearDeque::from([2, 1]);
516    /// deque.extend_at_front([3, 4]);
517    /// assert_eq!(deque, [4, 3, 2, 1]);
518    /// ```
519    pub fn extend_at_front(&mut self, iter: impl IntoIterator<Item = T>) {
520        let iter = iter.into_iter();
521        let (lower, upper) = iter.size_hint();
522        let count = upper.unwrap_or(lower);
523        if count < usize::MAX {
524            self.ensure_reserved_front_space(count);
525        }
526        for elem in iter {
527            self.push_front(elem);
528        }
529    }
530
531    /// Extends the deque at the back end.
532    ///
533    /// It's the same as iterating on the `iter` parameter, passing each element
534    /// to [`push_back`].
535    ///
536    /// [`push_back`]: LinearDeque::push_back
537    ///
538    /// # Example
539    ///
540    /// ```
541    /// use linear_deque::LinearDeque;
542    ///
543    /// let mut deque = LinearDeque::from([1, 2]);
544    /// deque.extend_at_back([3, 4]);
545    /// assert_eq!(deque, [1, 2, 3, 4]);
546    /// ```
547    pub fn extend_at_back(&mut self, iter: impl IntoIterator<Item = T>) {
548        let iter = iter.into_iter();
549        let (lower, upper) = iter.size_hint();
550        let count = upper.unwrap_or(lower);
551        if count < usize::MAX {
552            self.ensure_reserved_back_space(count);
553        }
554        for elem in iter {
555            self.push_back(elem);
556        }
557    }
558
559    /// Resizes the `LinearDeque` in-place at the front end so that `len` is
560    /// equal to `new_len`.
561    ///
562    /// If `new_len` is greater than `len`, the `LinearDeque` is extended by the
563    /// difference, with each additional slot at front filled with the result of
564    /// calling the closure `f`. The return values from `f` will end up in the
565    /// `LinearDeque` in the order they have been generated.
566    ///
567    /// If `new_len` is less than `len`, the `LinearDeque` is simply truncated.
568    ///
569    /// This method uses a closure to create new values on every push. If you'd
570    /// rather [`Clone`] a given value, use [`resize_at_front`]. If you want to
571    /// use the [`Default`] trait to generate values, you can pass
572    /// [`Default::default`] as the second argument.
573    ///
574    /// [`resize_at_front`]: LinearDeque::resize_at_front
575    ///
576    /// # Example
577    ///
578    /// ```
579    /// use linear_deque::LinearDeque;
580    ///
581    /// let mut deque = LinearDeque::from([1, 2, 3]);
582    /// deque.resize_at_front_with(5, Default::default);
583    /// assert_eq!(deque, [0, 0, 1, 2, 3]);
584    ///
585    /// let mut deque = LinearDeque::new();
586    /// let mut p = 1;
587    /// deque.resize_at_front_with(4, || { p *= 2; p });
588    /// assert_eq!(deque, [16, 8, 4, 2]);
589    /// ```
590    pub fn resize_at_front_with(&mut self, new_len: usize, mut f: impl FnMut() -> T) {
591        match new_len.cmp(&self.len) {
592            Ordering::Less => self.truncate_at_front(new_len),
593            Ordering::Equal => (),
594            Ordering::Greater => {
595                let count = new_len - self.len;
596                self.set_reserved_space(SetReservedSpace::GrowTo(count), SetReservedSpace::Keep);
597                self.extend_at_front(core::iter::from_fn(|| Some(f())).take(count));
598            }
599        }
600    }
601
602    /// Resizes the `LinearDeque` in-place at the back end so that `len` is
603    /// equal to `new_len`.
604    ///
605    /// If `new_len` is greater than `len`, the `LinearDeque` is extended by the
606    /// difference, with each additional slot at back filled with the result of
607    /// calling the closure `f`. The return values from `f` will end up in the
608    /// `LinearDeque` in the order they have been generated.
609    ///
610    /// If `new_len` is less than `len`, the `LinearDeque` is simply truncated.
611    ///
612    /// This method uses a closure to create new values on every push. If you'd
613    /// rather [`Clone`] a given value, use [`resize_at_back`]. If you want to
614    /// use the [`Default`] trait to generate values, you can pass
615    /// [`Default::default`] as the second argument.
616    ///
617    /// [`resize_at_back`]: LinearDeque::resize_at_back
618    ///
619    /// # Example
620    ///
621    /// ```
622    /// use linear_deque::LinearDeque;
623    ///
624    /// let mut deque = LinearDeque::from([1, 2, 3]);
625    /// deque.resize_at_back_with(5, Default::default);
626    /// assert_eq!(deque, [1, 2, 3, 0, 0]);
627    ///
628    /// let mut deque = LinearDeque::new();
629    /// let mut p = 1;
630    /// deque.resize_at_back_with(4, || { p *= 2; p });
631    /// assert_eq!(deque, [2, 4, 8, 16]);
632    /// ```
633    pub fn resize_at_back_with(&mut self, new_len: usize, mut f: impl FnMut() -> T) {
634        match new_len.cmp(&self.len) {
635            Ordering::Less => self.truncate_at_back(new_len),
636            Ordering::Equal => (),
637            Ordering::Greater => {
638                let count = new_len - self.len;
639                self.set_reserved_space(SetReservedSpace::Keep, SetReservedSpace::GrowTo(count));
640                self.extend_at_back(core::iter::from_fn(|| Some(f())).take(count));
641            }
642        }
643    }
644
645    /// Resizes the `LinearDeque` in-place at the back end so that `len` is
646    /// equal to `new_len`.
647    ///
648    /// It is just an alias for [`resize_at_back_with`].
649    ///
650    /// [`resize_at_back_with`]: LinearDeque::resize_at_back_with
651    #[inline]
652    pub fn resize_with(&mut self, new_len: usize, f: impl FnMut() -> T) {
653        self.resize_at_back_with(new_len, f);
654    }
655
656    /// Retains only the elements specified by the predicate.
657    ///
658    /// In other words, remove all elements `e` for which `f(&e)` returns false.
659    /// This method operates in place, visiting each element exactly once in the
660    /// original order, and preserves the order of the retained elements.
661    ///
662    /// # Example
663    ///
664    /// ```
665    /// use linear_deque::LinearDeque;
666    ///
667    /// let mut buf = LinearDeque::from_iter(1..=5);
668    /// buf.retain(|&x| x % 2 == 0);
669    /// assert_eq!(buf, [2, 4]);
670    /// ```
671    ///
672    /// Because the elements are visited exactly once in the original order,
673    /// external state may be used to decide which elements to keep.
674    ///
675    /// ```
676    /// use linear_deque::LinearDeque;
677    ///
678    /// let mut buf = LinearDeque::from_iter(1..6);
679    ///
680    /// let keep = [false, true, true, false, true];
681    /// let mut iter = keep.iter();
682    /// buf.retain(|_| *iter.next().unwrap());
683    /// assert_eq!(buf, [2, 3, 5]);
684    /// ```
685    pub fn retain<F>(&mut self, mut f: F)
686    where
687        F: FnMut(&T) -> bool,
688    {
689        self.retain_mut(|x| f(x));
690    }
691
692    /// Retains only the elements specified by the predicate, passing a mutable reference to it.
693    ///
694    /// In other words, remove all elements `e` such that `f(&mut e)` returns `false`.
695    /// This method operates in place, visiting each element exactly once in the
696    /// original order, and preserves the order of the retained elements.
697    ///
698    /// # Example
699    ///
700    /// ```
701    /// use linear_deque::LinearDeque;
702    ///
703    /// let mut deque = LinearDeque::from([1, 2, 3, 4, 5]);
704    /// deque.retain_mut(|x| if *x % 2 == 0 {
705    ///     *x += 1;
706    ///     true
707    /// } else {
708    ///     false
709    /// });
710    /// assert_eq!(deque, [3, 5]);
711    /// ```
712    pub fn retain_mut<F>(&mut self, mut f: F)
713    where
714        F: FnMut(&mut T) -> bool,
715    {
716        unsafe {
717            let mut dropped_index_option = None;
718
719            let base = self.ptr().add(self.off);
720            for i in 0..self.len {
721                let p = base.add(i);
722                if f(&mut *p) {
723                    if let Some(dropped_index) = dropped_index_option {
724                        ptr::copy_nonoverlapping(p, base.add(dropped_index), 1);
725                        dropped_index_option = Some(dropped_index + 1);
726                    }
727                } else {
728                    p.drop_in_place();
729                    if dropped_index_option.is_none() {
730                        dropped_index_option = Some(i);
731                    }
732                }
733            }
734
735            if let Some(dropped_index) = dropped_index_option {
736                self.len = dropped_index;
737            }
738        }
739    }
740
741    /// Shortens the deque, keeping the last `len` elements and dropping
742    /// the rest.
743    ///
744    /// If `len` is greater than the deque's current length, this has no
745    /// effect.
746    ///
747    /// # Example
748    ///
749    /// ```
750    /// use linear_deque::LinearDeque;
751    ///
752    /// let mut buf = LinearDeque::new();
753    /// buf.push_back(5);
754    /// buf.push_back(10);
755    /// buf.push_back(15);
756    /// assert_eq!(buf, [5, 10, 15]);
757    /// buf.truncate_at_front(1);
758    /// assert_eq!(buf, [15]);
759    /// ```
760    pub fn truncate_at_front(&mut self, len: usize) {
761        if len < self.len {
762            unsafe {
763                let count = self.len() - len;
764                let front = self.get_unchecked_mut(..count);
765                ptr::drop_in_place(front);
766                self.off += count;
767                self.len = len;
768            }
769        }
770    }
771
772    /// Shortens the deque, keeping the first `len` elements and dropping
773    /// the rest.
774    ///
775    /// If `len` is greater than the deque's current length, this has no
776    /// effect.
777    ///
778    /// # Example
779    ///
780    /// ```
781    /// use linear_deque::LinearDeque;
782    ///
783    /// let mut buf = LinearDeque::new();
784    /// buf.push_back(5);
785    /// buf.push_back(10);
786    /// buf.push_back(15);
787    /// assert_eq!(buf, [5, 10, 15]);
788    /// buf.truncate_at_back(1);
789    /// assert_eq!(buf, [5]);
790    /// ```
791    pub fn truncate_at_back(&mut self, len: usize) {
792        if len < self.len {
793            unsafe {
794                let back = self.get_unchecked_mut(len..);
795                ptr::drop_in_place(back);
796                self.len = len;
797            }
798        }
799    }
800
801    /// Shortens the deque, keeping the first `len` elements and dropping
802    /// the rest.
803    ///
804    /// It is just an alias for [`truncate_at_back`].
805    ///
806    /// [`truncate_at_back`]: LinearDeque::truncate_at_back
807    #[inline]
808    pub fn truncate(&mut self, len: usize) {
809        self.truncate_at_back(len);
810    }
811
812    /// Clears the deque, removing all values.
813    ///
814    /// After clearing, the reserved space is equally distributed to the front
815    /// and back ends.
816    ///
817    /// # Example
818    ///
819    /// ```
820    /// use linear_deque::LinearDeque;
821    ///
822    /// let mut deque = LinearDeque::new();
823    /// deque.push_back(1);
824    /// deque.clear();
825    /// assert!(deque.is_empty());
826    /// ```
827    pub fn clear(&mut self) {
828        self.truncate_at_back(0);
829        self.off = self.cap() / 2;
830    }
831
832    /// Sets the reserved space on both ends of the deque.
833    ///
834    /// When the reserved front space is changed, the existing elements are moved.
835    ///
836    /// # Example
837    ///
838    /// ```
839    /// use linear_deque::{LinearDeque, SetReservedSpace};
840    ///
841    /// let mut deque: LinearDeque<i32> = LinearDeque::with_reserved_space(3, 7);
842    /// assert_eq!(deque.reserved_front_space(), 3);
843    /// assert_eq!(deque.reserved_back_space(), 7);
844    ///
845    /// deque.set_reserved_space(SetReservedSpace::GrowTo(8), SetReservedSpace::Keep);
846    /// assert_eq!(deque.reserved_front_space(), 8);
847    /// assert_eq!(deque.reserved_back_space(), 7);
848    /// ```
849    pub fn set_reserved_space(&mut self, front: SetReservedSpace, back: SetReservedSpace) {
850        fn new_space(current: usize, set: SetReservedSpace) -> usize {
851            match set {
852                SetReservedSpace::Keep => current,
853                SetReservedSpace::ShrinkTo(new) => current.min(new),
854                SetReservedSpace::GrowTo(new) => current.max(new),
855                SetReservedSpace::Exact(new) => new,
856            }
857        }
858
859        if is_zst::<T>() {
860            return;
861        }
862
863        let front_space = self.reserved_front_space();
864        let back_space = self.reserved_back_space();
865        let cap = self.cap();
866
867        let new_front_space = new_space(front_space, front);
868        let new_back_space = new_space(back_space, back);
869        let new_cap = new_front_space + self.len + new_back_space;
870
871        if new_cap > cap {
872            self.buf.realloc(new_cap);
873        }
874
875        if new_front_space != front_space {
876            unsafe {
877                ptr::copy(
878                    self.ptr().add(front_space),
879                    self.ptr().add(new_front_space),
880                    self.len,
881                );
882            }
883            self.off = new_front_space;
884        }
885
886        if new_cap < cap {
887            self.buf.realloc(new_cap);
888        }
889    }
890
891    fn ensure_reserved_front_space(&mut self, count: usize) {
892        unsafe {
893            let pending_copy = self.prepare_reserved_front_space(count);
894            pending_copy.perform(self.ptr());
895        }
896    }
897
898    unsafe fn prepare_reserved_front_space(&mut self, count: usize) -> PendingCopy {
899        let mut pending_copy = PendingCopy {
900            src: self.off,
901            dst: self.off,
902            count: self.len,
903        };
904
905        if self.reserved_front_space() >= count {
906            // do nothing
907        } else {
908            let total_reserved_space = self.cap() - self.len;
909            self.off = if total_reserved_space >= count {
910                usize::midpoint(total_reserved_space, count)
911            } else {
912                let growth = cmp::max(1, self.len);
913                let new_cap = if count > total_reserved_space + growth {
914                    self.len + count
915                } else {
916                    self.cap() + growth
917                };
918                self.buf.realloc(new_cap);
919                new_cap - self.len
920            };
921            pending_copy.dst = self.off;
922        }
923
924        debug_assert!(self.reserved_front_space() >= count);
925
926        pending_copy
927    }
928
929    fn ensure_reserved_back_space(&mut self, count: usize) {
930        unsafe {
931            let pending_copy = self.prepare_reserved_back_space(count);
932            pending_copy.perform(self.ptr());
933        }
934    }
935
936    unsafe fn prepare_reserved_back_space(&mut self, count: usize) -> PendingCopy {
937        let mut pending_copy = PendingCopy {
938            src: self.off,
939            dst: self.off,
940            count: self.len,
941        };
942
943        if self.reserved_back_space() >= count {
944            // do nothing
945        } else {
946            let total_reserved_space = self.cap() - self.len;
947            self.off = if total_reserved_space >= count {
948                (total_reserved_space - count) / 2
949            } else {
950                let growth = cmp::max(1, self.len);
951                let new_cap = if count > total_reserved_space + growth {
952                    self.len + count
953                } else {
954                    self.cap() + growth
955                };
956                self.buf.realloc(new_cap);
957                0
958            };
959            pending_copy.dst = self.off;
960        }
961
962        debug_assert!(self.reserved_back_space() >= count);
963
964        pending_copy
965    }
966
967    /// Returns the number of elements can be put at the front of the deque
968    /// without reallocating or moving existing elements.
969    ///
970    /// # Example
971    ///
972    /// ```
973    /// use linear_deque::LinearDeque;
974    ///
975    /// let buf: LinearDeque<i32> = LinearDeque::with_reserved_space(7, 3);
976    /// assert!(buf.reserved_front_space() == 7);
977    /// ```
978    #[must_use]
979    pub fn reserved_front_space(&self) -> usize {
980        if is_zst::<T>() { usize::MAX } else { self.off }
981    }
982
983    /// Returns the number of elements can be put at the back of the deque
984    /// without reallocating or moving existing elements.
985    ///
986    /// # Example
987    ///
988    /// ```
989    /// use linear_deque::LinearDeque;
990    ///
991    /// let buf: LinearDeque<i32> = LinearDeque::with_reserved_space(7, 3);
992    /// assert!(buf.reserved_back_space() == 3);
993    /// ```
994    #[must_use]
995    pub fn reserved_back_space(&self) -> usize {
996        if is_zst::<T>() {
997            usize::MAX
998        } else {
999            self.cap() - self.len - self.off
1000        }
1001    }
1002}
1003
1004impl<T: Clone> LinearDeque<T> {
1005    /// Resizes the `LinearDeque` in-place at the front end so that `len` is
1006    /// equal to `new_len`.
1007    ///
1008    /// If `new_len` is greater than `len`, the `LinearDeque` is extended by the
1009    /// difference, with clones of the `value` pushed at the front. If `new_len`
1010    /// is less than `len`, the `LinearDeque` is simply truncated at the front.
1011    ///
1012    /// This method requires `T` to implement [`Clone`], in order to be able to
1013    /// clone the passed value. If you need more flexibility (or want to rely on
1014    /// [`Default`] instead of [`Clone`]), use [`resize_at_front_with`]. If you
1015    /// only need to resize to a smaller size, use [`truncate_at_front`].
1016    ///
1017    /// [`resize_at_front_with`]: LinearDeque::resize_at_front_with
1018    /// [`truncate_at_front`]: LinearDeque::truncate_at_front
1019    ///
1020    /// # Example
1021    ///
1022    /// ```
1023    /// use linear_deque::LinearDeque;
1024    ///
1025    /// let mut buf = LinearDeque::from([5, 10, 15]);
1026    ///
1027    /// buf.resize_at_front(2, 0);
1028    /// assert_eq!(buf, [10, 15]);
1029    ///
1030    /// buf.resize_at_front(5, 20);
1031    /// assert_eq!(buf, [20, 20, 20, 10, 15]);
1032    /// ```
1033    pub fn resize_at_front(&mut self, new_len: usize, value: T) {
1034        self.resize_at_front_with(new_len, || value.clone());
1035    }
1036
1037    /// Resizes the `LinearDeque` in-place at the back end so that `len` is
1038    /// equal to `new_len`.
1039    ///
1040    /// If `new_len` is greater than `len`, the `LinearDeque` is extended by the
1041    /// difference, with clones of the `value` pushed at the back. If `new_len`
1042    /// is less than `len`, the `LinearDeque` is simply truncated at the back.
1043    ///
1044    /// This method requires `T` to implement [`Clone`], in order to be able to
1045    /// clone the passed value. If you need more flexibility (or want to rely on
1046    /// [`Default`] instead of [`Clone`]), use [`resize_at_back_with`]. If you
1047    /// only need to resize to a smaller size, use [`truncate_at_back`].
1048    ///
1049    /// [`resize_at_back_with`]: LinearDeque::resize_at_back_with
1050    /// [`truncate_at_back`]: LinearDeque::truncate_at_back
1051    ///
1052    /// # Example
1053    ///
1054    /// ```
1055    /// use linear_deque::LinearDeque;
1056    ///
1057    /// let mut buf = LinearDeque::from([5, 10, 15]);
1058    ///
1059    /// buf.resize_at_back(2, 0);
1060    /// assert_eq!(buf, [5, 10]);
1061    ///
1062    /// buf.resize_at_back(5, 20);
1063    /// assert_eq!(buf, [5, 10, 20, 20, 20]);
1064    /// ```
1065    pub fn resize_at_back(&mut self, new_len: usize, value: T) {
1066        self.resize_at_back_with(new_len, || value.clone());
1067    }
1068
1069    /// Resizes the `LinearDeque` in-place at the back end so that `len` is
1070    /// equal to `new_len`.
1071    ///
1072    /// It is just an alias for [`resize_at_back`].
1073    ///
1074    /// [`resize_at_back`]: LinearDeque::resize_at_back
1075    #[inline]
1076    pub fn resize(&mut self, new_len: usize, value: T) {
1077        self.resize_at_back(new_len, value);
1078    }
1079}
1080
1081impl<T> Default for LinearDeque<T> {
1082    fn default() -> Self {
1083        Self::new()
1084    }
1085}
1086
1087impl<T> Drop for LinearDeque<T> {
1088    fn drop(&mut self) {
1089        while self.pop_back().is_some() {}
1090    }
1091}
1092
1093impl<T> Deref for LinearDeque<T> {
1094    type Target = [T];
1095
1096    fn deref(&self) -> &Self::Target {
1097        unsafe { core::slice::from_raw_parts(self.ptr().add(self.off), self.len) }
1098    }
1099}
1100
1101impl<T> DerefMut for LinearDeque<T> {
1102    fn deref_mut(&mut self) -> &mut Self::Target {
1103        unsafe { core::slice::from_raw_parts_mut(self.ptr().add(self.off), self.len) }
1104    }
1105}
1106
1107impl<T> Extend<T> for LinearDeque<T> {
1108    /// Extends the deque with the contents of the iterator.
1109    ///
1110    /// It is just an alias for [`extend_at_back`].
1111    ///
1112    /// [`extend_at_back`]: LinearDeque::extend_at_back
1113    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
1114        self.extend_at_back(iter);
1115    }
1116}
1117
1118impl<'a, T> Extend<&'a T> for LinearDeque<T>
1119where
1120    T: 'a + Copy,
1121{
1122    fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
1123        self.extend(iter.into_iter().copied());
1124    }
1125}
1126
1127impl<T> IntoIterator for LinearDeque<T> {
1128    type Item = T;
1129
1130    type IntoIter = IntoIter<T>;
1131
1132    fn into_iter(self) -> Self::IntoIter {
1133        unsafe {
1134            let iter = RawValIter::new(&self);
1135
1136            let buf = ptr::read(&raw const self.buf);
1137            mem::forget(self);
1138
1139            IntoIter { iter, _buf: buf }
1140        }
1141    }
1142}
1143
1144macro_rules! impl_partial_eq {
1145    ([$($n:tt)*] $rhs:ty) => {
1146        impl<T, U, $($n)*> PartialEq<$rhs> for LinearDeque<T>
1147        where
1148            T: PartialEq<U>,
1149        {
1150            fn eq(&self, other: & $rhs) -> bool {
1151                self.deref() == other.deref()
1152            }
1153        }
1154    };
1155}
1156
1157impl_partial_eq!([const N: usize] [U; N]);
1158impl_partial_eq!([const N: usize] &[U; N]);
1159impl_partial_eq!([const N: usize] &mut [U; N]);
1160impl_partial_eq!([] & [U]);
1161impl_partial_eq!([] &mut [U]);
1162impl_partial_eq!([] Vec<U>);
1163impl_partial_eq!([] LinearDeque<U>);
1164
1165impl<T: Eq> Eq for LinearDeque<T> {}
1166
1167impl<T: PartialOrd> PartialOrd for LinearDeque<T> {
1168    fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
1169        self.iter().partial_cmp(other.iter())
1170    }
1171}
1172
1173impl<T: Ord> Ord for LinearDeque<T> {
1174    fn cmp(&self, other: &Self) -> core::cmp::Ordering {
1175        self.iter().cmp(other.iter())
1176    }
1177}
1178
1179impl<T: Hash> Hash for LinearDeque<T> {
1180    fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
1181        self.deref().hash(state);
1182    }
1183}
1184
1185impl<T, const N: usize> From<[T; N]> for LinearDeque<T> {
1186    /// Converts a `[T; N]` into a `LinearDeque<T>`.
1187    ///
1188    /// ```
1189    /// use linear_deque::LinearDeque;
1190    ///
1191    /// let deq = LinearDeque::from([1, 2, 3, 4]);
1192    /// assert_eq!(deq, [1, 2, 3, 4]);
1193    /// ```
1194    fn from(value: [T; N]) -> Self {
1195        Self::from_iter(value)
1196    }
1197}
1198
1199impl<T> From<Vec<T>> for LinearDeque<T> {
1200    /// Turn a [`Vec<T>`] into a [`LinearDeque<T>`].
1201    fn from(value: Vec<T>) -> Self {
1202        Self::from_iter(value)
1203    }
1204}
1205
1206impl<T> FromIterator<T> for LinearDeque<T> {
1207    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
1208        let iter = iter.into_iter();
1209        let (lower, upper) = iter.size_hint();
1210        let size = upper.unwrap_or(lower);
1211        let mut deque = Self::with_reserved_space(0, size);
1212        for elem in iter {
1213            deque.push_back(elem);
1214        }
1215        deque
1216    }
1217}
1218
1219#[cfg(feature = "std")]
1220impl Read for LinearDeque<u8> {
1221    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
1222        let result = (&*self as &[u8]).read(buf);
1223        if let Ok(ref count) = result {
1224            self.truncate_at_front(self.len - count);
1225        }
1226        result
1227    }
1228}
1229
1230#[cfg(feature = "std")]
1231impl Write for LinearDeque<u8> {
1232    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
1233        self.extend(buf);
1234        Ok(buf.len())
1235    }
1236
1237    fn flush(&mut self) -> std::io::Result<()> {
1238        Ok(())
1239    }
1240}
1241
1242impl<T: Clone> Clone for LinearDeque<T> {
1243    fn clone(&self) -> Self {
1244        let mut clone = Self::with_reserved_space(0, self.len);
1245        for elem in self.iter() {
1246            clone.push_back(elem.clone());
1247        }
1248        clone
1249    }
1250}
1251
1252impl<T: Debug> Debug for LinearDeque<T> {
1253    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1254        f.debug_struct("LinearDeque")
1255            .field("values", &&**self)
1256            .field(
1257                "reserved_spaces",
1258                &(self.reserved_front_space(), self.reserved_back_space()),
1259            )
1260            .finish()
1261    }
1262}
1263
1264#[derive(Clone, Copy, Debug)]
1265#[must_use]
1266struct PendingCopy {
1267    src: usize,
1268    dst: usize,
1269    count: usize,
1270}
1271
1272impl PendingCopy {
1273    unsafe fn perform<T>(self, ptr: *mut T) {
1274        unsafe {
1275            if self.count > 0 && self.src != self.dst {
1276                ptr::copy(ptr.add(self.src), ptr.add(self.dst), self.count);
1277            }
1278        }
1279    }
1280
1281    fn split(self, index: usize) -> (PendingCopy, PendingCopy) {
1282        let low = PendingCopy {
1283            count: index,
1284            ..self
1285        };
1286        let high = PendingCopy {
1287            src: self.src + index,
1288            dst: self.dst + index,
1289            count: self.count - index,
1290        };
1291        (low, high)
1292    }
1293}
1294
1295/// Defines what happens to the reserved space of one of the deque ends on a call
1296/// to [`set_reserved_space`].
1297///
1298/// [`set_reserved_space`]: LinearDeque::set_reserved_space
1299#[derive(Clone, Copy, PartialEq, Eq, Debug)]
1300pub enum SetReservedSpace {
1301    /// The reserved space is not changed.
1302    Keep,
1303
1304    /// The reserved space is shrunk to the specified size.
1305    ///
1306    /// If the current space is less than the wanted size, then this is a no-op.
1307    ShrinkTo(usize),
1308
1309    /// The reserved space is grown to the specified size.
1310    ///
1311    /// If the current space is greater than the wanted size, then this is a no-op.
1312    GrowTo(usize),
1313
1314    /// The reserved space is unconditionally changed to the specified size.
1315    Exact(usize),
1316}
1317
1318/// An owning iterator over the elements of a `LinearDeque`.
1319///
1320/// This `struct` is created by the [`into_iter`] method on [`LinearDeque`]
1321/// (provided by the [`IntoIterator`] trait). See its documentation for more.
1322///
1323/// [`into_iter`]: LinearDeque::into_iter
1324/// [`IntoIterator`]: core::iter::IntoIterator
1325pub struct IntoIter<T> {
1326    _buf: Buffer<T>,
1327    iter: RawValIter<T>,
1328}
1329
1330impl<T> Iterator for IntoIter<T> {
1331    type Item = T;
1332
1333    fn next(&mut self) -> Option<Self::Item> {
1334        self.iter.next()
1335    }
1336
1337    fn size_hint(&self) -> (usize, Option<usize>) {
1338        self.iter.size_hint()
1339    }
1340}
1341
1342impl<T> DoubleEndedIterator for IntoIter<T> {
1343    fn next_back(&mut self) -> Option<Self::Item> {
1344        self.iter.next_back()
1345    }
1346}
1347
1348impl<T> Drop for IntoIter<T> {
1349    fn drop(&mut self) {
1350        for _ in &mut *self {}
1351    }
1352}
1353
1354/// A draining iterator over the elements of a `LinearDeque`.
1355///
1356/// This `struct` is created by the [`drain`] method on [`LinearDeque`]. See its
1357/// documentation for more.
1358///
1359/// [`drain`]: LinearDeque::drain
1360pub struct Drain<'a, T: 'a> {
1361    vec: PhantomData<&'a mut LinearDeque<T>>,
1362    iter: RawValIter<T>,
1363    pending_copy: PendingCopy,
1364    ptr: *mut T,
1365}
1366
1367impl<T> Iterator for Drain<'_, T> {
1368    type Item = T;
1369
1370    fn next(&mut self) -> Option<Self::Item> {
1371        self.iter.next()
1372    }
1373
1374    fn size_hint(&self) -> (usize, Option<usize>) {
1375        self.iter.size_hint()
1376    }
1377}
1378
1379impl<T> Drop for Drain<'_, T> {
1380    fn drop(&mut self) {
1381        for _ in &mut *self {}
1382        unsafe {
1383            self.pending_copy.perform(self.ptr);
1384        }
1385    }
1386}
1387
1388fn is_zst<T>() -> bool {
1389    mem::size_of::<T>() == 0
1390}
1391
1392#[cfg(test)]
1393mod tests {
1394    use core::fmt::Debug;
1395    use core::hash::{Hash as _, Hasher};
1396    use core::{mem, ptr};
1397    use std::collections::hash_map::DefaultHasher;
1398    use std::io::{Read as _, Write as _};
1399
1400    use crate::drop_tracker::DropTracker;
1401    use crate::{LinearDeque, SetReservedSpace};
1402
1403    macro_rules! assert_deque {
1404        ($deque:ident, $expected_reserved_front_space:expr, $expected_elems:expr, $expected_reserved_back_space:expr $(,)?) => {{
1405            let expected_reserved_front_space = $expected_reserved_front_space;
1406            let expected_elems: Vec<_> = $expected_elems.into_iter().collect();
1407            let expected_reserved_back_space = $expected_reserved_back_space;
1408
1409            let expected_len = expected_elems.len();
1410            let expected_capacity =
1411                expected_reserved_front_space + expected_len + expected_reserved_back_space;
1412            let expected_off = expected_reserved_front_space;
1413
1414            assert_eq!($deque.cap(), expected_capacity, "cap");
1415            assert_eq!($deque.len, expected_len, "len");
1416            assert_eq!($deque.off, expected_off, "off");
1417            for (i, expected_elem) in expected_elems.into_iter().enumerate() {
1418                let elem = unsafe { ptr::read($deque.ptr().add($deque.off + i)) };
1419                assert_eq!(elem, expected_elem, "index {i}");
1420            }
1421            assert_eq!(
1422                $deque.reserved_front_space(),
1423                expected_reserved_front_space,
1424                "front space"
1425            );
1426            assert_eq!(
1427                $deque.reserved_back_space(),
1428                expected_reserved_back_space,
1429                "back_space"
1430            );
1431        }};
1432    }
1433
1434    fn prepare_deque<T: Clone + Eq + Debug>(
1435        reserved_front_space: usize,
1436        elems: impl IntoIterator<Item = T>,
1437        reserved_back_space: usize,
1438    ) -> LinearDeque<T> {
1439        let elems: Vec<_> = elems.into_iter().collect();
1440        let capacity = reserved_front_space + elems.len() + reserved_back_space;
1441
1442        let mut deque: LinearDeque<T> = LinearDeque::new();
1443        if capacity != 0 {
1444            deque.buf.realloc(capacity);
1445            deque.len = elems.len();
1446            deque.off = reserved_front_space;
1447            for (i, elem) in elems.iter().enumerate() {
1448                unsafe {
1449                    ptr::write(deque.ptr().add(deque.off + i), elem.clone());
1450                }
1451            }
1452        }
1453
1454        assert_deque!(deque, reserved_front_space, elems, reserved_back_space);
1455
1456        deque
1457    }
1458
1459    macro_rules! assert_zst_deque {
1460        ($deque:ident, $expected_len:expr) => {{
1461            fn assert_zst_deque<T>(_: &LinearDeque<T>) {
1462                assert_eq!(mem::size_of::<T>(), 0);
1463            }
1464            assert_zst_deque(&$deque);
1465        }
1466        assert_eq!($deque.cap(), usize::MAX);
1467        assert_eq!($deque.len, $expected_len);};
1468    }
1469
1470    fn prepare_zst_deque<T>(len: usize) -> LinearDeque<T> {
1471        assert_eq!(mem::size_of::<T>(), 0);
1472        let mut deque = LinearDeque::new();
1473        deque.len = len;
1474        deque
1475    }
1476
1477    #[test]
1478    fn new_zst() {
1479        let deque: LinearDeque<()> = LinearDeque::new();
1480
1481        assert_zst_deque!(deque, 0);
1482    }
1483
1484    #[test]
1485    fn with_reserved_space() {
1486        let deque: LinearDeque<char> = LinearDeque::with_reserved_space(3, 4);
1487
1488        assert_deque!(deque, 3, [], 4);
1489    }
1490
1491    #[test]
1492    fn with_reserved_space_zst() {
1493        let deque: LinearDeque<()> = LinearDeque::with_reserved_space(3, 4);
1494
1495        assert_zst_deque!(deque, 0);
1496    }
1497
1498    #[test]
1499    fn front_zst() {
1500        let deque: LinearDeque<()> = prepare_zst_deque(0);
1501        assert_eq!(deque.front(), None);
1502
1503        let deque: LinearDeque<()> = prepare_zst_deque(2);
1504        assert_eq!(deque.front(), Some(&()));
1505    }
1506
1507    #[test]
1508    fn back_zst() {
1509        let deque: LinearDeque<()> = prepare_zst_deque(0);
1510        assert_eq!(deque.back(), None);
1511
1512        let deque: LinearDeque<()> = prepare_zst_deque(2);
1513        assert_eq!(deque.back(), Some(&()));
1514    }
1515
1516    #[test]
1517    fn push_front() {
1518        let mut deque: LinearDeque<char> = prepare_deque(2, [], 1);
1519        // |--[]-|
1520
1521        deque.push_front('A');
1522
1523        // |-[A]-|
1524        assert_deque!(deque, 1, ['A'], 1);
1525
1526        deque.push_front('B');
1527
1528        // |[BA]-|
1529        assert_deque!(deque, 0, ['B', 'A'], 1);
1530
1531        deque.push_front('C');
1532
1533        // |[CBA]|
1534        assert_deque!(deque, 0, ['C', 'B', 'A'], 0);
1535
1536        deque.push_front('D');
1537
1538        // |--[DCBA]|
1539        assert_deque!(deque, 2, ['D', 'C', 'B', 'A'], 0);
1540
1541        deque.push_front('E');
1542
1543        // |-[EDCBA]|
1544        assert_deque!(deque, 1, ['E', 'D', 'C', 'B', 'A'], 0);
1545    }
1546
1547    #[test]
1548    fn push_front_zst() {
1549        let mut deque = prepare_zst_deque(0);
1550
1551        deque.push_front(());
1552        deque.push_front(());
1553
1554        assert_zst_deque!(deque, 2);
1555    }
1556
1557    #[test]
1558    fn push_back() {
1559        let mut deque: LinearDeque<char> = prepare_deque(1, [], 2);
1560        // |-[]--|
1561
1562        deque.push_back('A');
1563
1564        // |-[A]-|
1565        assert_deque!(deque, 1, ['A'], 1);
1566
1567        deque.push_back('B');
1568
1569        // |-[AB]|
1570        assert_deque!(deque, 1, ['A', 'B'], 0);
1571
1572        deque.push_back('C');
1573
1574        // |[ABC]|
1575        assert_deque!(deque, 0, ['A', 'B', 'C'], 0);
1576
1577        deque.push_back('D');
1578
1579        // |[ABCD]--|
1580        assert_deque!(deque, 0, ['A', 'B', 'C', 'D'], 2);
1581
1582        deque.push_back('E');
1583
1584        // |[ABCDE]-|
1585        assert_deque!(deque, 0, ['A', 'B', 'C', 'D', 'E'], 1);
1586    }
1587
1588    #[test]
1589    fn push_back_zst() {
1590        let mut deque = prepare_zst_deque(0);
1591
1592        deque.push_back(());
1593        deque.push_back(());
1594
1595        assert_zst_deque!(deque, 2);
1596    }
1597
1598    #[test]
1599    fn pop_front() {
1600        let mut deque = prepare_deque(1, ['B', 'A'], 2);
1601        // |-[AB]--|
1602
1603        let popped = deque.pop_front();
1604
1605        assert_eq!(popped, Some('B'));
1606        // |--[A]--|
1607        assert_deque!(deque, 2, ['A'], 2);
1608
1609        let popped = deque.pop_front();
1610
1611        assert_eq!(popped, Some('A'));
1612        // |---[]--|
1613        assert_deque!(deque, 3, [], 2);
1614
1615        let popped = deque.pop_front();
1616
1617        assert_eq!(popped, None);
1618        assert_deque!(deque, 3, [], 2);
1619    }
1620
1621    #[test]
1622    fn pop_front_zst() {
1623        let mut deque = prepare_zst_deque(2);
1624
1625        let popped = deque.pop_front();
1626        assert_eq!(popped, Some(()));
1627        assert_zst_deque!(deque, 1);
1628
1629        let popped = deque.pop_front();
1630        assert_eq!(popped, Some(()));
1631        assert_zst_deque!(deque, 0);
1632
1633        let popped = deque.pop_front();
1634        assert_eq!(popped, None);
1635        assert_zst_deque!(deque, 0);
1636    }
1637
1638    #[test]
1639    fn pop_back() {
1640        let mut deque = prepare_deque(2, ['A', 'B'], 1);
1641        // |--[AB]-|
1642
1643        let popped = deque.pop_back();
1644
1645        assert_eq!(popped, Some('B'));
1646        // |--[A]--|
1647        assert_deque!(deque, 2, ['A'], 2);
1648
1649        let popped = deque.pop_back();
1650
1651        assert_eq!(popped, Some('A'));
1652        // |--[]---|
1653        assert_deque!(deque, 2, [], 3);
1654
1655        let popped = deque.pop_back();
1656
1657        assert_eq!(popped, None);
1658        assert_deque!(deque, 2, [], 3);
1659    }
1660
1661    #[test]
1662    fn pop_back_zst() {
1663        let mut deque = prepare_zst_deque(2);
1664
1665        let popped = deque.pop_back();
1666        assert_eq!(popped, Some(()));
1667        assert_zst_deque!(deque, 1);
1668
1669        let popped = deque.pop_back();
1670        assert_eq!(popped, Some(()));
1671        assert_zst_deque!(deque, 0);
1672
1673        let popped = deque.pop_back();
1674        assert_eq!(popped, None);
1675        assert_zst_deque!(deque, 0);
1676    }
1677
1678    #[test]
1679    fn insert_near_front() {
1680        let mut deque = prepare_deque(1, ['A', 'B', 'C'], 1);
1681        // |-[ABC]-|
1682
1683        deque.insert(1, 'x');
1684
1685        // |[AxBC]-|
1686        assert_deque!(deque, 0, ['A', 'x', 'B', 'C'], 1);
1687
1688        deque.insert(1, 'y');
1689
1690        // |[AyxBC]|
1691        assert_deque!(deque, 0, ['A', 'y', 'x', 'B', 'C'], 0);
1692
1693        deque.insert(1, 'z');
1694
1695        // |----[AzyxBC]|
1696        assert_deque!(deque, 4, ['A', 'z', 'y', 'x', 'B', 'C'], 0);
1697    }
1698
1699    #[test]
1700    fn insert_near_back() {
1701        let mut deque = prepare_deque(1, ['A', 'B', 'C'], 1);
1702        // |-[ABC]-|
1703
1704        deque.insert(2, 'x');
1705
1706        // |-[ABxC]|
1707        assert_deque!(deque, 1, ['A', 'B', 'x', 'C'], 0);
1708
1709        deque.insert(3, 'y');
1710
1711        // |[ABxyC]|
1712        assert_deque!(deque, 0, ['A', 'B', 'x', 'y', 'C'], 0);
1713
1714        deque.insert(4, 'z');
1715
1716        // |[ABxyzC]----|
1717        assert_deque!(deque, 0, ['A', 'B', 'x', 'y', 'z', 'C'], 4);
1718    }
1719
1720    #[test]
1721    fn insert_zst() {
1722        let mut deque = LinearDeque::new();
1723
1724        deque.insert(0, ());
1725        deque.insert(0, ());
1726        deque.insert(2, ());
1727        deque.insert(2, ());
1728
1729        assert_zst_deque!(deque, 4);
1730    }
1731
1732    #[test]
1733    fn remove_near_front() {
1734        let mut deque = prepare_deque(0, ['A', 'B', 'C', 'D'], 0);
1735        // |[ABCD]|
1736
1737        let removed = deque.remove(1);
1738
1739        assert_eq!(removed, Some('B'));
1740        // |-[ACD]|
1741        assert_deque!(deque, 1, ['A', 'C', 'D'], 0);
1742    }
1743
1744    #[test]
1745    fn remove_near_back() {
1746        let mut deque = prepare_deque(0, ['A', 'B', 'C', 'D'], 0);
1747        // |[ABCD]|
1748
1749        let removed = deque.remove(2);
1750
1751        assert_eq!(removed, Some('C'));
1752        // |[ABD]-|
1753        assert_deque!(deque, 0, ['A', 'B', 'D'], 1);
1754    }
1755
1756    #[test]
1757    fn remove_zst() {
1758        let mut deque = prepare_zst_deque(3);
1759
1760        let removed = deque.remove(1);
1761        assert_eq!(removed, Some(()));
1762        assert_zst_deque!(deque, 2);
1763
1764        let removed = deque.remove(1);
1765        assert_eq!(removed, Some(()));
1766        assert_zst_deque!(deque, 1);
1767
1768        let removed = deque.remove(0);
1769        assert_eq!(removed, Some(()));
1770        assert_zst_deque!(deque, 0);
1771
1772        let removed = deque.remove(0);
1773        assert_eq!(removed, None);
1774        assert_zst_deque!(deque, 0);
1775    }
1776
1777    #[test]
1778    fn drain_all() {
1779        let mut deque = prepare_deque(2, 'A'..='H', 2);
1780        // |--[ABCDEFGH]--]
1781
1782        let drained = deque.drain(..);
1783
1784        assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('A'..='H'));
1785        // There is no requirement for exact reserved space distribution in this case
1786        // |--..........--]
1787        assert_eq!(deque.cap(), 12);
1788        assert!(deque.reserved_front_space() >= 2);
1789        assert!(deque.reserved_back_space() >= 2);
1790        assert!(deque.is_empty());
1791    }
1792
1793    #[test]
1794    fn drain_start() {
1795        let mut deque = prepare_deque(2, 'A'..='H', 2);
1796        // |--[ABCDEFGH]--]
1797
1798        let drained = deque.drain(..3);
1799
1800        assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('A'..='C'));
1801        // |-----[DEFGH]--]
1802        assert_deque!(deque, 5, 'D'..='H', 2);
1803    }
1804
1805    #[test]
1806    fn drain_end() {
1807        let mut deque = prepare_deque(2, 'A'..='H', 2);
1808        // |--[ABCDEFGH]--]
1809
1810        let drained = deque.drain(5..);
1811
1812        assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('F'..='H'));
1813        // |--[ABCDE]-----]
1814        assert_deque!(deque, 2, 'A'..='E', 5);
1815    }
1816
1817    #[test]
1818    fn drain_near_start() {
1819        let mut deque = prepare_deque(2, 'A'..='H', 2);
1820        // |--[ABCDEFGH]--]
1821
1822        let drained = deque.drain(1..5);
1823
1824        assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('B'..='E'));
1825        // |------[AFGH]--]
1826        assert_deque!(deque, 6, ['A', 'F', 'G', 'H'], 2);
1827    }
1828
1829    #[test]
1830    fn drain_near_end() {
1831        let mut deque = prepare_deque(2, 'A'..='H', 2);
1832        // |--[ABCDEFGH]--]
1833
1834        let drained = deque.drain(3..7);
1835
1836        assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('D'..='G'));
1837        // |--[ABCH]------]
1838        assert_deque!(deque, 2, ['A', 'B', 'C', 'H'], 6);
1839    }
1840
1841    #[test]
1842    fn drain_nothing() {
1843        let mut deque = prepare_deque(2, 'A'..='H', 2);
1844        // |--[ABCDEFGH]--]
1845
1846        let drained = deque.drain(3..3);
1847
1848        assert_eq!(drained.count(), 0);
1849        // |--[ABCDEFGH]--]
1850        assert_deque!(deque, 2, 'A'..='H', 2);
1851    }
1852
1853    #[test]
1854    fn drain_not_fully_consumed() {
1855        let mut deque = prepare_deque(2, 'A'..='H', 2);
1856        // |--[ABCDEFGH]--|
1857
1858        let mut drained = deque.drain(3..7);
1859        assert_eq!(drained.next(), Some('D'));
1860        drop(drained);
1861
1862        // |--[ABCH]------]
1863        assert_deque!(deque, 2, ['A', 'B', 'C', 'H'], 6);
1864    }
1865
1866    #[test]
1867    fn drain_zst() {
1868        let mut deque: LinearDeque<()> = prepare_zst_deque(8);
1869
1870        let iter = deque.drain(3..5);
1871        assert_eq!(iter.count(), 2);
1872        assert_zst_deque!(deque, 6);
1873
1874        let iter = deque.drain(4..);
1875        assert_eq!(iter.count(), 2);
1876        assert_zst_deque!(deque, 4);
1877
1878        let iter = deque.drain(..2);
1879        assert_eq!(iter.count(), 2);
1880        assert_zst_deque!(deque, 2);
1881
1882        let iter = deque.drain(..);
1883        assert_eq!(iter.count(), 2);
1884        assert_zst_deque!(deque, 0);
1885    }
1886
1887    #[test]
1888    fn extend_at_front() {
1889        let mut deque = prepare_deque(1, ['C', 'D'], 1);
1890        // |-[CD]-|
1891
1892        deque.extend_at_front(['B', 'A']);
1893
1894        // |[ABCD]|
1895        assert_deque!(deque, 0, 'A'..='D', 0);
1896    }
1897
1898    #[test]
1899    fn extend_at_front_zst() {
1900        let mut deque = prepare_zst_deque(2);
1901
1902        deque.extend_at_front(std::iter::repeat(()).take(4));
1903
1904        assert_zst_deque!(deque, 6);
1905    }
1906
1907    #[test]
1908    fn extend_at_back() {
1909        let mut deque = prepare_deque(1, ['A', 'B'], 1);
1910        // |-[AB]-|
1911
1912        deque.extend_at_back(['C', 'D']);
1913
1914        // |[ABCD]|
1915        assert_deque!(deque, 0, 'A'..='D', 0);
1916    }
1917
1918    #[test]
1919    fn extend_at_back_zst() {
1920        let mut deque = prepare_zst_deque(2);
1921
1922        deque.extend_at_back(std::iter::repeat(()).take(4));
1923
1924        assert_zst_deque!(deque, 6);
1925    }
1926
1927    #[test]
1928    fn reserved_front_space() {
1929        let deque = prepare_deque(3, 'A'..='D', 4);
1930
1931        assert_eq!(deque.reserved_front_space(), 3);
1932    }
1933
1934    #[test]
1935    fn reserved_front_space_zst() {
1936        let deque: LinearDeque<()> = prepare_zst_deque(5);
1937
1938        assert_eq!(deque.reserved_front_space(), usize::MAX);
1939    }
1940
1941    #[test]
1942    fn reserved_back_space() {
1943        let deque = prepare_deque(3, 'A'..='D', 4);
1944
1945        assert_eq!(deque.reserved_back_space(), 4);
1946    }
1947
1948    #[test]
1949    fn reserved_back_space_zst() {
1950        let deque: LinearDeque<()> = prepare_zst_deque(5);
1951
1952        assert_eq!(deque.reserved_back_space(), usize::MAX);
1953    }
1954
1955    #[test]
1956    fn deref_empty() {
1957        let deque: LinearDeque<char> = prepare_deque(6, [], 4);
1958
1959        assert!(deque.is_empty());
1960        assert_eq!(deque.len(), 0);
1961    }
1962
1963    #[test]
1964    fn deref_non_empty() {
1965        let deque = prepare_deque(2, ['A', 'B', 'C'], 4);
1966
1967        assert!(!deque.is_empty());
1968        assert_eq!(deque.len(), 3);
1969        assert_eq!(deque[0], 'A');
1970        assert_eq!(deque[1], 'B');
1971        assert_eq!(deque[2], 'C');
1972    }
1973
1974    #[test]
1975    fn deref_zst() {
1976        let deque: LinearDeque<()> = prepare_zst_deque(4);
1977
1978        assert!(!deque.is_empty());
1979        assert_eq!(deque.len(), 4);
1980        assert_eq!(deque[0], ());
1981        assert_zst_deque!(deque, 4);
1982    }
1983
1984    #[test]
1985    fn into_iter() {
1986        let deque = prepare_deque(2, ['A', 'B', 'C'], 4);
1987
1988        let mut iter = deque.into_iter();
1989
1990        assert_eq!(iter.next(), Some('A'));
1991        assert_eq!(iter.next(), Some('B'));
1992        assert_eq!(iter.next(), Some('C'));
1993        assert_eq!(iter.next(), None);
1994    }
1995
1996    #[test]
1997    fn into_iter_double_ended() {
1998        let deque = prepare_deque(2, ['A', 'B', 'C'], 4);
1999
2000        let mut iter = deque.into_iter();
2001
2002        assert_eq!(iter.next_back(), Some('C'));
2003        assert_eq!(iter.next_back(), Some('B'));
2004        assert_eq!(iter.next_back(), Some('A'));
2005        assert_eq!(iter.next_back(), None);
2006    }
2007
2008    #[test]
2009    fn into_iter_mixed() {
2010        let deque = prepare_deque(2, ['A', 'B', 'C'], 4);
2011
2012        let mut iter = deque.into_iter();
2013
2014        assert_eq!(iter.next_back(), Some('C'));
2015        assert_eq!(iter.next(), Some('A'));
2016        assert_eq!(iter.next_back(), Some('B'));
2017        assert_eq!(iter.next(), None);
2018        assert_eq!(iter.next_back(), None);
2019    }
2020
2021    #[test]
2022    fn into_iter_zst() {
2023        let deque: LinearDeque<()> = prepare_zst_deque(4);
2024
2025        let iter = deque.into_iter();
2026
2027        assert_eq!(iter.count(), 4);
2028    }
2029
2030    #[test]
2031    fn resize_at_front_larger() {
2032        let mut deque = prepare_deque(2, ['A', 'B', 'C', 'D'], 3);
2033        // |--[ABCD]---|
2034
2035        deque.resize_at_front(10, 'x');
2036
2037        // |[xxxxxxABCD]---|
2038        assert_deque!(
2039            deque,
2040            0,
2041            ['x', 'x', 'x', 'x', 'x', 'x', 'A', 'B', 'C', 'D'],
2042            3
2043        );
2044    }
2045
2046    #[test]
2047    fn resize_at_front_smaller() {
2048        let mut deque = prepare_deque(2, ['A', 'B', 'C', 'D'], 3);
2049        // |--[ABCD]---|
2050
2051        deque.resize_at_front(3, 'x');
2052
2053        // |---[BCD]---|
2054        assert_deque!(deque, 3, ['B', 'C', 'D'], 3);
2055    }
2056
2057    #[test]
2058    fn resize_at_front_zst() {
2059        let mut deque = prepare_zst_deque(5);
2060
2061        deque.resize_at_front(2, ());
2062        assert_zst_deque!(deque, 2);
2063
2064        deque.resize_at_front(4, ());
2065        assert_zst_deque!(deque, 4);
2066    }
2067
2068    #[test]
2069    fn resize_at_back_larger() {
2070        let mut deque = prepare_deque(3, ['A', 'B', 'C', 'D'], 2);
2071        // |---[ABCD]--|
2072
2073        deque.resize_at_back(10, 'x');
2074
2075        // |---[ABCDxxxxxx]|
2076        assert_deque!(
2077            deque,
2078            3,
2079            ['A', 'B', 'C', 'D', 'x', 'x', 'x', 'x', 'x', 'x'],
2080            0
2081        );
2082    }
2083
2084    #[test]
2085    fn resize_at_back_smaller() {
2086        let mut deque = prepare_deque(3, ['A', 'B', 'C', 'D'], 2);
2087        // |---[ABCD]--|
2088
2089        deque.resize_at_back(3, 'x');
2090
2091        // |---[ABC]---|
2092        assert_deque!(deque, 3, ['A', 'B', 'C'], 3);
2093    }
2094
2095    #[test]
2096    fn resize_at_back_zst() {
2097        let mut deque = prepare_zst_deque(5);
2098
2099        deque.resize_at_back(2, ());
2100        assert_zst_deque!(deque, 2);
2101
2102        deque.resize_at_back(4, ());
2103        assert_zst_deque!(deque, 4);
2104    }
2105
2106    #[test]
2107    fn resize_at_front_with_larger() {
2108        let mut deque = prepare_deque(2, 'A'..='D', 3);
2109        // |--[ABCD]---|
2110        let mut chars = 'a'..;
2111
2112        deque.resize_at_front_with(7, || chars.next().unwrap());
2113
2114        // |[cbaABCD]---|
2115        assert_deque!(deque, 0, ['c', 'b', 'a', 'A', 'B', 'C', 'D'], 3);
2116    }
2117
2118    #[test]
2119    fn resize_at_front_with_smaller() {
2120        let mut deque = prepare_deque(2, 'A'..='D', 3);
2121        // |--[ABCD]---|
2122        let mut chars = 'a'..;
2123
2124        deque.resize_at_front_with(3, || chars.next().unwrap());
2125
2126        // |---[BCD]---|
2127        assert_deque!(deque, 3, ['B', 'C', 'D'], 3);
2128    }
2129
2130    #[test]
2131    fn resize_at_front_with_zst() {
2132        let mut deque = prepare_zst_deque(5);
2133
2134        deque.resize_at_front_with(2, || ());
2135        assert_zst_deque!(deque, 2);
2136
2137        deque.resize_at_front_with(4, || ());
2138        assert_zst_deque!(deque, 4);
2139    }
2140
2141    #[test]
2142    fn resize_at_back_with_larger() {
2143        let mut deque = prepare_deque(3, 'A'..='D', 2);
2144        // |---[ABCD]--|
2145        let mut chars = 'a'..;
2146
2147        deque.resize_at_back_with(7, || chars.next().unwrap());
2148
2149        // |---[ABCDabc]|
2150        assert_deque!(deque, 3, ['A', 'B', 'C', 'D', 'a', 'b', 'c'], 0);
2151    }
2152
2153    #[test]
2154    fn resize_at_back_with_smaller() {
2155        let mut deque = prepare_deque(2, 'A'..='D', 3);
2156        // |--[ABCD]---|
2157        let mut chars = 'a'..;
2158
2159        deque.resize_at_back_with(3, || chars.next().unwrap());
2160
2161        // |--[ABC]----|
2162        assert_deque!(deque, 2, ['A', 'B', 'C'], 4);
2163    }
2164
2165    #[test]
2166    fn resize_at_back_with_zst() {
2167        let mut deque = prepare_zst_deque(5);
2168
2169        deque.resize_at_back_with(2, || ());
2170        assert_zst_deque!(deque, 2);
2171
2172        deque.resize_at_back_with(4, || ());
2173        assert_zst_deque!(deque, 4);
2174    }
2175
2176    #[test]
2177    fn retain() {
2178        let mut drop_tracker = DropTracker::new();
2179        let mut deque = prepare_deque(2, drop_tracker.wrap_iter(['A', 'b', 'c', 'D', 'e']), 1);
2180        // |--[AbcDe]-|
2181
2182        let (dropped, _) = drop_tracker.track(|| {
2183            deque.retain(|c| c.value.is_lowercase());
2184        });
2185
2186        // |--[bce]---|
2187        assert_deque!(deque, 2, drop_tracker.wrap_iter(['b', 'c', 'e']), 3);
2188        assert_eq!(dropped, ['A', 'D']);
2189    }
2190
2191    #[test]
2192    fn retain_mut() {
2193        let mut drop_tracker = DropTracker::new();
2194        let mut deque = prepare_deque(2, drop_tracker.wrap_iter(['A', 'b', 'c', 'D', 'e']), 1);
2195        // |--[AbcDe]-|
2196
2197        let (dropped, _) = drop_tracker.track(|| {
2198            deque.retain_mut(|c| {
2199                if c.value.is_lowercase() {
2200                    c.value = c.value.to_uppercase().next().unwrap();
2201                    true
2202                } else {
2203                    false
2204                }
2205            });
2206        });
2207
2208        // |--[BCE]---|
2209        assert_deque!(deque, 2, drop_tracker.wrap_iter(['B', 'C', 'E']), 3);
2210        assert_eq!(dropped, ['A', 'D']);
2211    }
2212
2213    #[test]
2214    fn retain_mut_drop_none() {
2215        let mut drop_tracker = DropTracker::new();
2216        let mut deque = prepare_deque(2, drop_tracker.wrap_iter('A'..='E'), 1);
2217        // |--[ABCDE]-|
2218
2219        let (dropped, _) = drop_tracker.track(|| {
2220            deque.retain_mut(|_| true);
2221        });
2222
2223        // |--[ABCDE]-|
2224        assert_deque!(deque, 2, drop_tracker.wrap_iter('A'..='E'), 1);
2225        assert!(dropped.is_empty());
2226    }
2227
2228    #[test]
2229    fn retain_mut_drop_all() {
2230        let mut drop_tracker = DropTracker::new();
2231        let mut deque = prepare_deque(2, drop_tracker.wrap_iter('A'..='E'), 1);
2232        // |--[ABCDE]-|
2233
2234        let (dropped, _) = drop_tracker.track(|| {
2235            deque.retain_mut(|_| false);
2236        });
2237
2238        // |--[]------|
2239        assert_deque!(deque, 2, [], 6);
2240        assert_eq!(dropped, Vec::from_iter('A'..='E'));
2241    }
2242
2243    #[test]
2244    fn retain_mut_zst() {
2245        let mut deque: LinearDeque<()> = prepare_zst_deque(4);
2246
2247        let mut p = false;
2248        deque.retain(|_| {
2249            p = !p;
2250            p
2251        });
2252
2253        assert_zst_deque!(deque, 2);
2254    }
2255
2256    #[test]
2257    fn truncate_at_front() {
2258        let mut drop_tracker = DropTracker::new();
2259        let mut deque = prepare_deque(5, drop_tracker.wrap_iter('A'..='F'), 1);
2260        // |-----[ABCDEF]-|
2261
2262        let (dropped, _) = drop_tracker.track(|| {
2263            deque.truncate_at_front(2);
2264        });
2265
2266        // |---------[EF]-|
2267        assert_deque!(deque, 9, drop_tracker.wrap_iter('E'..='F'), 1);
2268        assert_eq!(dropped, Vec::from_iter('A'..='D'));
2269    }
2270
2271    #[test]
2272    fn truncate_at_front_zst() {
2273        let mut deque: LinearDeque<()> = prepare_zst_deque(4);
2274
2275        deque.truncate_at_front(3);
2276
2277        assert_zst_deque!(deque, 3);
2278    }
2279
2280    #[test]
2281    fn truncate_at_back() {
2282        let mut drop_tracker = DropTracker::new();
2283        let mut deque = prepare_deque(1, drop_tracker.wrap_iter('A'..='F'), 5);
2284        // |-[ABCDEF]-----|
2285
2286        let (dropped, _) = drop_tracker.track(|| {
2287            deque.truncate_at_back(2);
2288        });
2289
2290        // |-[AB]---------|
2291        assert_deque!(deque, 1, drop_tracker.wrap_iter('A'..='B'), 9);
2292        assert_eq!(dropped, Vec::from_iter('C'..='F'));
2293    }
2294
2295    #[test]
2296    fn truncate_at_back_zst() {
2297        let mut deque: LinearDeque<()> = prepare_zst_deque(4);
2298
2299        deque.truncate_at_back(3);
2300
2301        assert_zst_deque!(deque, 3);
2302    }
2303
2304    #[test]
2305    fn clear() {
2306        let mut deque = prepare_deque(2, 'A'..='D', 4);
2307        // |--[ABCD]----|
2308
2309        deque.clear();
2310
2311        // |-----[]-----|
2312        assert_deque!(deque, 5, [], 5);
2313    }
2314
2315    #[test]
2316    fn clear_zst() {
2317        let mut deque: LinearDeque<()> = prepare_zst_deque(4);
2318
2319        deque.clear();
2320
2321        assert_zst_deque!(deque, 0);
2322    }
2323
2324    #[test]
2325    fn set_reserved_space_keeping() {
2326        let mut deque = prepare_deque(2, 'A'..='D', 5);
2327        // |--[ABCD]-----|
2328
2329        deque.set_reserved_space(SetReservedSpace::Keep, SetReservedSpace::Keep);
2330
2331        // |--[ABCD]-----|
2332        assert_deque!(deque, 2, 'A'..='D', 5);
2333    }
2334
2335    #[test]
2336    fn set_reserved_space_growing() {
2337        let mut deque = prepare_deque(3, 'A'..='D', 1);
2338        // |---[ABCD]-|
2339
2340        deque.set_reserved_space(SetReservedSpace::GrowTo(6), SetReservedSpace::GrowTo(2));
2341
2342        // |------[ABCD]--|
2343        assert_deque!(deque, 6, 'A'..='D', 2);
2344    }
2345
2346    #[test]
2347    fn set_reserved_space_not_growing() {
2348        let mut deque = prepare_deque(3, 'A'..='D', 1);
2349        // |---[ABCD]-|
2350
2351        deque.set_reserved_space(SetReservedSpace::GrowTo(2), SetReservedSpace::GrowTo(1));
2352
2353        // |---[ABCD]-|
2354        assert_deque!(deque, 3, 'A'..='D', 1);
2355    }
2356
2357    #[test]
2358    fn set_reserved_space_shrinking() {
2359        let mut deque = prepare_deque(5, 'A'..='D', 2);
2360        // |-----[ABCD]--|
2361
2362        deque.set_reserved_space(SetReservedSpace::ShrinkTo(2), SetReservedSpace::ShrinkTo(1));
2363
2364        // |--[ABCD]-|
2365        assert_deque!(deque, 2, 'A'..='D', 1);
2366    }
2367
2368    #[test]
2369    fn set_reserved_space_not_shrinking() {
2370        let mut deque = prepare_deque(5, 'A'..='D', 2);
2371        // |-----[ABCD]--|
2372
2373        deque.set_reserved_space(SetReservedSpace::ShrinkTo(6), SetReservedSpace::ShrinkTo(3));
2374
2375        // |-----[ABCD]--|
2376        assert_deque!(deque, 5, 'A'..='D', 2);
2377    }
2378
2379    #[test]
2380    fn set_reserved_space_exactly_growing() {
2381        let mut deque = prepare_deque(2, 'A'..='D', 1);
2382        // |--[ABCD]-|
2383
2384        deque.set_reserved_space(SetReservedSpace::Exact(5), SetReservedSpace::Exact(2));
2385
2386        // |-----[ABCD]--|
2387        assert_deque!(deque, 5, 'A'..='D', 2);
2388    }
2389
2390    #[test]
2391    fn set_reserved_space_exactly_shrinking() {
2392        let mut deque = prepare_deque(5, 'A'..='D', 2);
2393        // |-----[ABCD]--|
2394
2395        deque.set_reserved_space(SetReservedSpace::Exact(2), SetReservedSpace::Exact(1));
2396
2397        // |--[ABCD]-|
2398        assert_deque!(deque, 2, 'A'..='D', 1);
2399    }
2400
2401    #[test]
2402    fn ensure_reserved_front_space_doing_nothing_1() {
2403        let mut deque = prepare_deque(3, 'A'..='C', 1);
2404        // |---[ABC]-|
2405
2406        deque.ensure_reserved_front_space(1);
2407
2408        // |---[ABC]-|
2409        assert_deque!(deque, 3, 'A'..='C', 1);
2410    }
2411
2412    #[test]
2413    fn ensure_reserved_front_space_doing_nothing_2() {
2414        let mut deque = prepare_deque(3, 'A'..='C', 1);
2415        // |---[ABC]-|
2416
2417        deque.ensure_reserved_front_space(3);
2418
2419        // |---[ABC]-|
2420        assert_deque!(deque, 3, 'A'..='C', 1);
2421    }
2422
2423    #[test]
2424    fn ensure_reserved_front_space_moving_1() {
2425        let mut deque = prepare_deque(1, 'A'..='C', 3);
2426        // |-[ABC]---|
2427
2428        deque.ensure_reserved_front_space(2);
2429
2430        // |-**[ABC]-|
2431        assert_deque!(deque, 3, 'A'..='C', 1);
2432    }
2433
2434    #[test]
2435    fn ensure_reserved_front_space_moving_2() {
2436        let mut deque = prepare_deque(1, 'A'..='C', 3);
2437        // |-[ABC]---|
2438
2439        deque.ensure_reserved_front_space(4);
2440
2441        // |****[ABC]|
2442        assert_deque!(deque, 4, 'A'..='C', 0);
2443    }
2444
2445    #[test]
2446    fn ensure_reserved_front_space_reallocating_1() {
2447        let mut deque = prepare_deque(2, 'A'..='C', 2);
2448        // |--[ABC]--|
2449
2450        deque.ensure_reserved_front_space(5);
2451
2452        // |--*****[ABC]|
2453        assert_deque!(deque, 7, 'A'..='C', 0);
2454    }
2455
2456    #[test]
2457    fn ensure_reserved_front_space_reallocating_2() {
2458        let mut deque = prepare_deque(2, 'A'..='C', 2);
2459        // |--[ABC]--|
2460
2461        deque.ensure_reserved_front_space(8);
2462
2463        // |********[ABC]|
2464        assert_deque!(deque, 8, 'A'..='C', 0);
2465    }
2466
2467    #[test]
2468    fn ensure_reserved_back_space_doing_nothing_1() {
2469        let mut deque = prepare_deque(1, 'A'..='C', 3);
2470        // |-[ABC]---|
2471
2472        deque.ensure_reserved_back_space(1);
2473
2474        // |-[ABC]---|
2475        assert_deque!(deque, 1, 'A'..='C', 3);
2476    }
2477
2478    #[test]
2479    fn ensure_reserved_back_space_doing_nothing_2() {
2480        let mut deque = prepare_deque(1, 'A'..='C', 3);
2481        // |-[ABC]---|
2482
2483        deque.ensure_reserved_back_space(3);
2484
2485        // |-[ABC]---|
2486        assert_deque!(deque, 1, 'A'..='C', 3);
2487    }
2488
2489    #[test]
2490    fn ensure_reserved_back_space_moving_1() {
2491        let mut deque = prepare_deque(3, 'A'..='C', 1);
2492        // |---[ABC]-|
2493
2494        deque.ensure_reserved_back_space(2);
2495
2496        // |-[ABC]**-|
2497        assert_deque!(deque, 1, 'A'..='C', 3);
2498    }
2499
2500    #[test]
2501    fn ensure_reserved_back_space_moving_2() {
2502        let mut deque = prepare_deque(3, 'A'..='C', 1);
2503        // |---[ABC]-|
2504
2505        deque.ensure_reserved_back_space(4);
2506
2507        // |[ABC]****|
2508        assert_deque!(deque, 0, 'A'..='C', 4);
2509    }
2510
2511    #[test]
2512    fn ensure_reserved_back_space_reallocating_1() {
2513        let mut deque = prepare_deque(2, 'A'..='C', 2);
2514        // |--[ABC]--|
2515
2516        deque.ensure_reserved_back_space(5);
2517
2518        // |[ABC]*****--|
2519        assert_deque!(deque, 0, 'A'..='C', 7);
2520    }
2521
2522    #[test]
2523    fn ensure_reserved_back_space_reallocating_2() {
2524        let mut deque = prepare_deque(2, 'A'..='C', 2);
2525        // |--[ABC]--|
2526
2527        deque.ensure_reserved_back_space(8);
2528
2529        // |[ABC]********|
2530        assert_deque!(deque, 0, 'A'..='C', 8);
2531    }
2532
2533    #[test]
2534    fn set_reserved_space_zst() {
2535        let mut deque: LinearDeque<()> = prepare_zst_deque(5);
2536
2537        deque.set_reserved_space(SetReservedSpace::Exact(3), SetReservedSpace::Exact(4));
2538
2539        assert_zst_deque!(deque, 5);
2540    }
2541
2542    #[test]
2543    fn eq() {
2544        let mut array = ['A', 'B'];
2545        let mut array_x = ['B', 'A'];
2546
2547        let deque = prepare_deque(1, array, 5);
2548
2549        {
2550            let slice: &[_] = &array;
2551            let slice_x: &[_] = &array_x;
2552
2553            assert!(deque == slice);
2554            assert!(deque != slice_x);
2555        }
2556
2557        assert!(deque == &array);
2558        assert!(deque != &array_x);
2559
2560        {
2561            let slice_mut: &mut [_] = &mut array;
2562            let slice_mut_x: &mut [_] = &mut array_x;
2563
2564            assert!(deque == slice_mut);
2565            assert!(deque != slice_mut_x);
2566        }
2567
2568        assert!(deque == &mut array);
2569        assert!(deque != &mut array_x);
2570
2571        assert!(deque == array);
2572        assert!(deque != array_x);
2573
2574        assert!(deque == Vec::from(array));
2575        assert!(deque != Vec::from(array_x));
2576
2577        assert!(deque == prepare_deque(5, array, 0));
2578        assert!(deque != prepare_deque(1, array_x, 5));
2579    }
2580
2581    #[test]
2582    fn hash() {
2583        let deque1 = prepare_deque(3, ['A', 'B', 'C'], 5);
2584        let deque2 = {
2585            let mut d = LinearDeque::new();
2586            d.push_back('B');
2587            d.push_front('A');
2588            d.push_back('C');
2589            d
2590        };
2591        let mut hasher1 = DefaultHasher::new();
2592        let mut hasher2 = DefaultHasher::new();
2593
2594        deque1.hash(&mut hasher1);
2595        deque2.hash(&mut hasher2);
2596
2597        assert_eq!(hasher1.finish(), hasher2.finish());
2598    }
2599
2600    #[test]
2601    fn from_iter() {
2602        let deque = LinearDeque::from_iter('A'..='D');
2603
2604        assert_deque!(deque, 0, ['A', 'B', 'C', 'D'], 0);
2605    }
2606
2607    #[test]
2608    fn from_iter_zst() {
2609        let deque = LinearDeque::from_iter(std::iter::repeat(()).take(4));
2610
2611        assert_zst_deque!(deque, 4);
2612    }
2613
2614    #[test]
2615    fn read() {
2616        let mut deque = prepare_deque(1, b'A'..=b'E', 2);
2617        // |-[ABCDE]--|
2618        let mut buf = [b'0'; 3];
2619
2620        let result = deque.read(&mut buf);
2621
2622        assert_eq!(result.unwrap(), 3);
2623        assert_eq!(buf, [b'A', b'B', b'C']);
2624        // |----[DE]--|
2625        assert_deque!(deque, 4, [b'D', b'E'], 2);
2626    }
2627
2628    #[test]
2629    fn write() {
2630        let mut deque = prepare_deque(2, b'A'..=b'C', 1);
2631        // |--[ABC]-|
2632        let buf: Vec<_> = (b'D'..=b'H').collect();
2633
2634        let result = deque.write(&buf);
2635
2636        assert_eq!(result.unwrap(), 5);
2637        // |[ABCDEFGH]-|
2638        assert_deque!(deque, 0, b'A'..=b'H', 1);
2639    }
2640
2641    #[test]
2642    fn clone() {
2643        let mut deque = prepare_deque(2, 'A'..='C', 1);
2644        // |--[ABC]-|
2645
2646        let mut clone = deque.clone();
2647
2648        deque[1] = 'x';
2649        clone[1] = 'y';
2650        assert_deque!(deque, 2, ['A', 'x', 'C'], 1);
2651        assert_deque!(clone, 0, ['A', 'y', 'C'], 0);
2652    }
2653}