linear_deque/
lib.rs

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