fixed_slice_deque/
lib.rs

1//! A fixed size double-ended queue that `Deref`s into a slice.
2//! For keeping the fixed queue size items pushed out of bounds are pop and returned in inserting
3//! operations.
4//!
5//! ## Example:
6//! Initialize state, empty, with fixed size of `3`
7//! ```txt
8//! `X = None`
9//! +---+---+---+
10//! | X | X | X |
11//! +---+---+---+
12//!```
13//!
14//! Pushing `1` to the back, since it is empty, `1` is the only item in the deque  
15//! ```txt
16//! => push_back(1)
17//!
18//! +---+---+---+
19//! | 1 | X | X |
20//! +---+---+---+
21//!```
22//!
23//! Push `2` to the front (left)
24//!
25//! ```txt
26//! => push_front(2)
27//!
28//! +---+---+---+
29//! | 2 | 1 | X |
30//! +---+---+---+
31//!```
32//!
33//! Push again to the back, a single `3`. The deque now [is full](`FixedSliceDeque::is_full`)
34//!
35//! ```txt
36//! => push_back(3)
37//!
38//! +---+---+---+
39//! | 2 | 1 | 3 |
40//! +---+---+---+
41//!```
42//!
43//! We try to add a new item at the back, but we would have one extra, the first item (`2`) is pop
44//! to the left and returned. We keep the elements and the fixed size
45//!
46//! ```txt
47//! => push_back(4)
48//!
49//! +---+---+---+
50//! | 1 | 3 | 4 | => return Some(2)
51//! +---+---+---+
52//!```
53//!
54//! The same happens when pushing to the front again, the back-most (right) item is pop and returned
55//!
56//! ```txt
57//! => push_front(5)
58//!
59//! +---+---+---+
60//! | 5 | 1 | 3 | => return Some(4)
61//! +---+---+---+
62//!```
63//!
64//! It is implemented as a wrapper over [`SliceDeque`] [**`slice-deque`** crate](<https://crates.io/crates/slice-deque>)
65//!
66//! Almost every orignal [`SliceDeque`] method is wrapped.
67//! Please refer to it's twin method [documentation](https://docs.rs/slice-deque/latest/slice_deque/)
68//! for internal functionality.
69
70mod drain_filter;
71
72pub use drain_filter::DrainFilter;
73
74use std::collections::VecDeque;
75use std::ops::{Deref, DerefMut};
76use std::slice;
77
78/// A fixed size double-ended queue that derefs into a slice.
79/// It maintains the size by poping out of bounds items in inserting operations.
80///
81/// It is implemented as a wrapper over [`VecDeque`]
82#[derive(Debug, Clone, Eq, Hash, Default)]
83pub struct FixedSliceDeque<T> {
84    pub(crate) buffer: VecDeque<T>,
85    capacity: usize,
86}
87
88/// Creates a [`FixedSliceDeque`] containing the arguments.
89///
90/// `fsdeq!` allows `FixedSliceDeque`s to be defined with the same syntax as array
91/// expressions. There are two forms of this macro:
92///
93/// - Create a [`FixedSliceDeque`] containing a given list of elements:
94///
95/// ```
96/// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
97/// # fn main() {
98/// let v: FixedSliceDeque<i32> = fsdeq![1, 2, 3];
99/// assert_eq!(v[0], 1);
100/// assert_eq!(v[1], 2);
101/// assert_eq!(v[2], 3);
102/// # }
103/// ```
104///
105/// - Create a [`FixedSliceDeque`] from a given element and size:
106///
107/// ```
108/// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
109/// # fn main() {
110/// let v = fsdeq![7; 3];
111/// assert_eq!(v, [7, 7, 7]);
112/// # }
113/// ```
114///
115/// Note that unlike array expressions this syntax supports all elements
116/// which implement `Clone` and the number of elements doesn't have to be
117/// a constant.
118///
119/// This will use `clone` to duplicate an expression, so one should be careful
120/// using this with types having a nonstandard `Clone` implementation. For
121/// example, `fsdeq![Rc::new(1); 5]` will create a deque of five references
122/// to the same boxed integer value, not five references pointing to
123/// independently boxed integers.
124///
125/// ```
126/// # #[macro_use] extern crate fixed_slice_deque;
127/// # use std::rc::Rc;
128/// # fn main() {
129/// let v = fsdeq![Rc::new(1_i32); 5];
130/// let ptr: *const i32 = &*v[0] as *const i32;
131/// for i in v.iter() {
132///     assert_eq!(Rc::into_raw(i.clone()), ptr);
133/// }
134/// # }
135/// ```
136///
137/// [`VecDeque`]: std::collections::VecDeque
138#[macro_export]
139macro_rules! fsdeq {
140    ($elem:expr; $n:expr) => (
141        {
142            let mut deq = $crate::FixedSliceDeque::new($n);
143            deq.resize($n, $elem);
144            deq
145        }
146    );
147    ($($x:expr),*) => (
148        {
149            let vdeq = std::collections::VecDeque::from(vec![$($x),*]);
150            let deq = $crate::FixedSliceDeque::from_vec_deque(vdeq);
151            deq
152        }
153    );
154    ($($x:expr,)*) => (fsdeq![$($x),*])
155}
156
157impl<T> FixedSliceDeque<T> {
158    /// Create an empty fixed size deque with capacity to hold `n` elements.
159    ///
160    /// # Examples
161    ///
162    /// ```rust
163    /// # use fixed_slice_deque::FixedSliceDeque;
164    /// let deq = FixedSliceDeque::new(10);
165    /// # let o: FixedSliceDeque<u32> = deq;
166    /// ```
167    #[inline]
168    pub fn new(size: usize) -> Self {
169        Self {
170            buffer: VecDeque::with_capacity(size),
171            capacity: size,
172        }
173    }
174
175    /// Create an new fixed size deque with capacity to hold `n` elements from a [`VecDeque`].
176    ///
177    /// # Examples
178    ///
179    /// ```rust
180    /// # use fixed_slice_deque::FixedSliceDeque;
181    /// # use std::collections::VecDeque;
182    /// let deq = FixedSliceDeque::from_vec_deque(VecDeque::from(vec![1, 2, 3]));
183    /// # let o: FixedSliceDeque<u32> = deq;
184    /// ```
185    pub fn from_vec_deque(mut deque: VecDeque<T>) -> Self {
186        deque.make_contiguous();
187        Self {
188            capacity: deque.len(),
189            buffer: deque,
190        }
191    }
192
193    /// Is the ring buffer full ?
194    ///
195    /// # Examples
196    ///
197    /// ```rust
198    /// # use fixed_slice_deque::FixedSliceDeque;
199    /// let mut deq = FixedSliceDeque::new(10);
200    /// assert!(!deq.is_full());
201    /// # let o: FixedSliceDeque<u32> = deq;
202    /// ```
203    #[inline]
204    pub fn is_full(&self) -> bool {
205        self.buffer.len() == self.capacity
206    }
207
208    /// Is the ring buffer empty ?
209    /// Check if the buffer do not contain any item
210    ///
211    /// # Examples
212    ///
213    /// ```rust
214    /// # use fixed_slice_deque::FixedSliceDeque;
215    /// let mut deq = FixedSliceDeque::new(10);
216    /// assert!(deq.is_empty());
217    /// # let o: FixedSliceDeque<u32> = deq;
218    /// ```
219    #[inline]
220    pub fn is_empty(&self) -> bool {
221        self.buffer.is_empty()
222    }
223
224    /// Buffer occupied size
225    #[inline]
226    pub fn len(&self) -> usize {
227        self.buffer.len()
228    }
229
230    /// Buffer capacity
231    #[inline]
232    pub fn capacity(&self) -> usize {
233        self.capacity
234    }
235
236    /// Extracts a slice containing the entire deque.
237    #[inline]
238    pub fn as_slice(&self) -> &[T] {
239        // Safety: We maintain the invariant that buffer is always contiguous
240        // by calling make_contiguous() after any operation that could make it non-contiguous
241        let (front, back) = self.buffer.as_slices();
242        debug_assert!(back.is_empty(), "buffer should always be contiguous");
243        front
244    }
245
246    /// Extracts a mutable slice containing the entire deque.
247    #[inline]
248    pub fn as_mut_slice(&mut self) -> &mut [T] {
249        self.buffer.make_contiguous()
250    }
251
252    /// Moves all the elements of `other` into `Self`, leaving `other` empty.
253    ///
254    /// It keeps the internal [`FixedSliceDeque`] capacity. All items that will not fit into the
255    /// capacity are truncated from the head.
256    ///
257    /// # Examples
258    ///
259    /// ```
260    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
261    /// # fn main() {
262    /// let mut deq = fsdeq![1, 2, 3];
263    /// let mut deq2 = fsdeq![4, 5, 6];
264    /// deq.append(&mut deq2);
265    /// assert_eq!(deq, [4, 5, 6]);
266    /// assert_eq!(deq2, []);
267    /// # }
268    /// ```
269    #[inline]
270    pub fn append(&mut self, other: &mut Self) {
271        if other.len() + self.len() <= self.capacity {
272            self.buffer.append(&mut other.buffer);
273        } else {
274            // Combined would exceed capacity - keep only the last `capacity` elements
275            let total = self.len() + other.len();
276            let to_keep = self.capacity;
277            let to_skip = total - to_keep;
278
279            // Clear self and append, then skip from front
280            self.buffer.append(&mut other.buffer);
281            for _ in 0..to_skip {
282                self.buffer.pop_front();
283            }
284        }
285        other.buffer.clear();
286        self.buffer.make_contiguous();
287    }
288
289    /// Provides a reference to the first element, or `None` if the deque is
290    /// empty.
291    ///
292    /// # Examples
293    ///
294    /// ```
295    /// # use fixed_slice_deque::FixedSliceDeque;
296    /// let mut deq = FixedSliceDeque::new(3);
297    /// assert_eq!(deq.front(), None);
298    ///
299    /// deq.push_back(1);
300    /// deq.push_back(2);
301    /// assert_eq!(deq.front(), Some(&1));
302    /// deq.push_front(3);
303    /// assert_eq!(deq.front(), Some(&3));
304    /// ```
305    #[inline]
306    pub fn front(&self) -> Option<&T> {
307        self.buffer.front()
308    }
309
310    /// Provides a mutable reference to the first element, or `None` if the
311    /// deque is empty.
312    ///
313    /// # Examples
314    ///
315    /// ```
316    /// # use fixed_slice_deque::FixedSliceDeque;
317    /// let mut deq = FixedSliceDeque::new(3);
318    /// assert_eq!(deq.front(), None);
319    ///
320    /// deq.push_back(1);
321    /// deq.push_back(2);
322    /// assert_eq!(deq.front(), Some(&1));
323    /// (*deq.front_mut().unwrap()) = 3;
324    /// assert_eq!(deq.front(), Some(&3));
325    /// ```
326    #[inline]
327    pub fn front_mut(&mut self) -> Option<&mut T> {
328        self.buffer.front_mut()
329    }
330
331    /// Provides a reference to the last element, or `None` if the deque is
332    /// empty.
333    ///
334    /// # Examples
335    ///
336    /// ```
337    /// # use fixed_slice_deque::FixedSliceDeque;
338    /// let mut deq = FixedSliceDeque::new(3);
339    /// assert_eq!(deq.back(), None);
340    ///
341    /// deq.push_back(1);
342    /// deq.push_back(2);
343    /// assert_eq!(deq.back(), Some(&2));
344    /// deq.push_front(3);
345    /// assert_eq!(deq.back(), Some(&2));
346    /// ```
347    #[inline]
348    pub fn back(&self) -> Option<&T> {
349        self.buffer.back()
350    }
351
352    /// Provides a mutable reference to the last element, or `None` if the
353    /// deque is empty.
354    ///
355    /// # Examples
356    ///
357    /// ```
358    /// # use fixed_slice_deque::FixedSliceDeque;
359    /// let mut deq = FixedSliceDeque::new(3);
360    /// assert_eq!(deq.front(), None);
361    ///
362    /// deq.push_back(1);
363    /// deq.push_back(2);
364    /// assert_eq!(deq.back(), Some(&2));
365    /// (*deq.back_mut().unwrap()) = 3;
366    /// assert_eq!(deq.back(), Some(&3));
367    /// ```
368    #[inline]
369    pub fn back_mut(&mut self) -> Option<&mut T> {
370        self.buffer.back_mut()
371    }
372
373    /// Prepends `value` to the deque.
374    /// If the deque `is_full` the last item is discarded and returned
375    ///
376    /// # Examples
377    ///
378    /// ```rust
379    /// # use fixed_slice_deque::FixedSliceDeque;
380    /// let mut deq = FixedSliceDeque::new(1);
381    /// deq.push_front(1);
382    /// let pop = deq.push_front(2);
383    /// assert_eq!(pop, Some(1));
384    /// assert_eq!(deq.front(), Some(&2));
385    /// ```
386    #[inline]
387    pub fn push_front(&mut self, value: T) -> Option<T> {
388        let ret = self.is_full().then(|| self.buffer.pop_back()).flatten();
389        self.buffer.push_front(value);
390        self.buffer.make_contiguous();
391        ret
392    }
393
394    /// Appends `value` to the deque.
395    /// If the deque `is_full` the first item is discarded and returned
396    ///
397    /// # Examples
398    ///
399    /// ```rust
400    /// # use fixed_slice_deque::FixedSliceDeque;
401    /// let mut deq = FixedSliceDeque::new(1);
402    /// deq.push_back(1);
403    /// let pop = deq.push_back(3);
404    /// assert_eq!(pop, Some(1));
405    /// assert_eq!(deq.back(), Some(&3));
406    /// ```
407    #[inline]
408    pub fn push_back(&mut self, value: T) -> Option<T> {
409        let ret = self.is_full().then(|| self.buffer.pop_front()).flatten();
410        self.buffer.push_back(value);
411        if ret.is_some() {
412            self.buffer.make_contiguous();
413        }
414        ret
415    }
416
417    /// Prepends `value` to the deque if the deque is `!is_full` (not full)
418    /// otherwise an error with the passed value is returned.
419    ///
420    /// # Examples
421    ///
422    /// ```rust
423    /// # use fixed_slice_deque::FixedSliceDeque;
424    /// let mut deq = FixedSliceDeque::new(0);
425    /// let res = deq.try_push_front(1);
426    /// assert_eq!(res, Err(1));
427    /// ```
428    #[inline]
429    pub fn try_push_front(&mut self, value: T) -> Result<(), T> {
430        if self.is_full() {
431            return Err(value);
432        }
433        self.push_front(value);
434        Ok(())
435    }
436
437    /// Appends `value` to the deque if the deque is `!is_full` (not full)
438    /// otherwise an error with the passed value is returned.
439    ///
440    /// # Examples
441    ///
442    /// ```rust
443    /// # use fixed_slice_deque::FixedSliceDeque;
444    /// let mut deq = FixedSliceDeque::new(0);
445    /// let res = deq.try_push_back(1);
446    /// assert_eq!(res, Err(1));
447    /// ```
448    #[inline]
449    pub fn try_push_back(&mut self, value: T) -> Result<(), T> {
450        if self.is_full() {
451            return Err(value);
452        }
453        self.push_back(value);
454        Ok(())
455    }
456
457    /// Removes the first element and returns it, or `None` if the deque is
458    /// empty.
459    ///
460    /// # Examples
461    ///
462    /// ```
463    /// # use fixed_slice_deque::FixedSliceDeque;
464    /// let mut deq = FixedSliceDeque::new(2);
465    /// assert_eq!(deq.pop_front(), None);
466    ///
467    /// deq.push_back(1);
468    /// deq.push_back(2);
469    ///
470    /// assert_eq!(deq.pop_front(), Some(1));
471    /// assert_eq!(deq.pop_front(), Some(2));
472    /// assert_eq!(deq.pop_front(), None);
473    /// ```
474    #[inline]
475    pub fn pop_front(&mut self) -> Option<T> {
476        let ret = self.buffer.pop_front();
477        if ret.is_some() {
478            self.buffer.make_contiguous();
479        }
480        ret
481    }
482
483    /// Removes the last element from the deque and returns it, or `None` if it
484    /// is empty.
485    ///
486    /// # Examples
487    ///
488    /// ```
489    /// # use fixed_slice_deque::FixedSliceDeque;
490    /// let mut deq = FixedSliceDeque::new(2);
491    /// assert_eq!(deq.pop_back(), None);
492    ///
493    /// deq.push_back(1);
494    /// deq.push_back(3);
495    ///
496    /// assert_eq!(deq.pop_back(), Some(3));
497    /// assert_eq!(deq.pop_back(), Some(1));
498    /// assert_eq!(deq.pop_back(), None);
499    /// ```
500    #[inline]
501    pub fn pop_back(&mut self) -> Option<T> {
502        self.buffer.pop_back()
503    }
504
505    /// Shortens the deque by removing excess elements from the front.
506    /// At most `capacity` is removed (`len.min(self.capacity)`)
507    ///
508    /// If `len` is greater than the FixedSliceDeque's all items will be removed
509    ///
510    /// # Examples
511    ///
512    /// ```rust
513    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
514    /// # fn main() {
515    /// let mut deq = fsdeq![5, 10, 15];
516    /// assert_eq!(deq, [5, 10, 15]);
517    /// deq.truncate_front(1);
518    /// assert_eq!(deq, [15]);
519    /// # }
520    /// ```
521    #[inline]
522    pub fn truncate_front(&mut self, len: usize) {
523        let target_len = len.min(self.capacity);
524        while self.buffer.len() > target_len {
525            self.buffer.pop_front();
526        }
527        self.buffer.make_contiguous();
528    }
529
530    /// Shortens the deque by removing excess elements from the back.
531    /// At most `capacity` is removed (`len.min(self.capacity)`)
532    ///
533    /// If `len` is greater than the FixedSliceDeque's all items will be removed
534    ///
535    /// # Examples
536    ///
537    /// ```rust
538    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
539    /// # fn main() {
540    /// let mut deq = fsdeq![5, 10, 15];
541    /// assert_eq!(deq, [5, 10, 15]);
542    /// deq.truncate_back(1);
543    /// assert_eq!(deq, [5]);
544    /// # }
545    /// ```
546    #[inline]
547    pub fn truncate_back(&mut self, len: usize) {
548        self.buffer.truncate(len.min(self.capacity));
549    }
550
551    /// Removes all values from the deque.
552    ///
553    /// # Examples
554    ///
555    /// ```rust
556    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
557    /// # fn main() {
558    /// let mut deq = fsdeq![1];
559    /// assert!(!deq.is_empty());
560    /// deq.clear();
561    /// assert!(deq.is_empty());
562    /// # }
563    #[inline]
564    pub fn clear(&mut self) {
565        self.buffer.clear()
566    }
567
568    /// Creates a draining iterator that removes the specified range in the
569    /// deque and yields the removed items.
570    ///
571    /// Note 1: The element range is removed even if the iterator is only
572    /// partially consumed or not consumed at all.
573    ///
574    /// Note 2: It is unspecified how many elements are removed from the deque
575    /// if the `Drain` value is leaked.
576    ///
577    /// # Panics
578    ///
579    /// Panics if the starting point is greater than the end point or if
580    /// the end point is greater than the length of the deque.
581    ///
582    /// # Examples
583    ///
584    /// ```
585    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
586    /// # fn main() {
587    /// let mut deq = fsdeq![1, 2, 3];
588    /// let u: Vec<_> = deq.drain(1..).collect();
589    /// assert_eq!(deq, &[1]);
590    /// assert_eq!(u, &[2, 3]);
591    ///
592    /// // A full range clears the deque
593    /// deq.drain(..);
594    /// assert_eq!(deq, &[]);
595    /// # }
596    /// ```
597    #[inline]
598    #[allow(mismatched_lifetime_syntaxes)]
599    pub fn drain<R>(&mut self, range: R) -> std::collections::vec_deque::Drain<T>
600    where
601        R: std::ops::RangeBounds<usize>,
602    {
603        self.buffer.drain(range)
604    }
605
606    /// Extracts a the inner [`VecDeque`] buffer, consuming the [`FixedSliceDeque`]
607    #[inline]
608    pub fn into_inner(self) -> VecDeque<T> {
609        self.buffer
610    }
611
612    /// Inserts an `element` at `index` within the deque, shifting all elements
613    /// with indices greater than or equal to `index` towards the back, keeping the deque max capacity.
614    /// If the deque `if_full` the back-most element is returned.
615    ///
616    /// Element at index 0 is the front of the queue.
617    ///
618    /// # Panics
619    ///
620    /// Panics if `index` is greater than deque's length
621    ///
622    /// # Examples
623    ///
624    /// ```
625    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
626    /// # fn main() {
627    /// let mut deq = fsdeq!['a', 'b', 'c'];
628    /// assert_eq!(deq, &['a', 'b', 'c']);
629    ///
630    /// let c = deq.insert(1, 'd');
631    /// assert_eq!(deq, &['a', 'd', 'b']);
632    /// assert_eq!(c, Some('c'));
633    /// # }
634    /// ```
635    #[inline]
636    pub fn insert(&mut self, index: usize, element: T) -> Option<T> {
637        let is_full = self.is_full();
638        if index == 0 && is_full {
639            return Some(element);
640        }
641        let ret = is_full.then(|| self.pop_back()).flatten();
642        self.buffer.insert(index, element);
643        self.buffer.make_contiguous();
644        ret
645    }
646
647    /// Removes and returns the element at position `index` within the deque.
648    ///
649    /// # Panics
650    ///
651    /// Panics if `index` is out of bounds.
652    ///
653    /// # Examples
654    ///
655    /// ```
656    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
657    /// # fn main() {
658    /// let mut deq = fsdeq![1, 2, 3, 4, 5];
659    /// assert_eq!(deq.remove(1), 2);
660    /// assert_eq!(deq, [1, 3, 4, 5]);
661    /// # }
662    /// ```
663    #[inline]
664    pub fn remove(&mut self, index: usize) -> T {
665        self.buffer.remove(index).expect("index out of bounds")
666    }
667
668    /// Retains only the elements specified by the predicate.
669    ///
670    /// That is, remove all elements `e` such that `f(&e)` returns `false`.
671    /// This method operates in place and preserves the order of the
672    /// retained elements.
673    ///
674    /// # Examples
675    ///
676    /// ```
677    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
678    /// # fn main() {
679    /// let mut deq = fsdeq![1, 2, 3, 4];
680    /// deq.retain(|&x| x % 2 == 0);
681    /// assert_eq!(deq, [2, 4]);
682    /// # }
683    /// ```
684    #[inline]
685    pub fn retain<F>(&mut self, f: F)
686    where
687        F: FnMut(&T) -> bool,
688    {
689        self.buffer.retain(f);
690    }
691
692    /// Removes all but the first of consecutive elements in the deque that
693    /// resolve to the same key.
694    ///
695    /// If the deque is sorted, this removes all duplicates.
696    ///
697    /// # Examples
698    ///
699    /// ```
700    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
701    /// # fn main() {
702    /// let mut deq = fsdeq![10, 20, 21, 30, 20];
703    ///
704    /// deq.dedup_by_key(|i| *i / 10);
705    /// assert_eq!(deq, [10, 20, 30, 20]);
706    /// # }
707    /// ```
708    #[inline]
709    pub fn dedup_by_key<F, K>(&mut self, mut key: F)
710    where
711        F: FnMut(&mut T) -> K,
712        K: PartialEq,
713    {
714        self.dedup_by(|a, b| key(a) == key(b));
715    }
716
717    /// Removes all but the first of consecutive elements in the deque
718    /// satisfying a given equality relation.
719    ///
720    /// The `same_bucket` function is passed references to two elements from
721    /// the deque, and returns `true` if the elements compare equal, or
722    /// `false` if they do not. The elements are passed in opposite order
723    /// from their order in the deque, so if `same_bucket(a, b)` returns
724    /// `true`, `a` is removed.
725    ///
726    /// If the deque is sorted, this removes all duplicates.
727    ///
728    /// # Examples
729    ///
730    /// ```
731    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
732    /// # fn main() {
733    /// let mut deq = fsdeq!["foo", "bar", "Bar", "baz", "bar"];
734    ///
735    /// deq.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
736    ///
737    /// assert_eq!(deq, ["foo", "bar", "baz", "bar"]);
738    /// # }
739    /// ```
740    #[inline]
741    pub fn dedup_by<F>(&mut self, mut same_bucket: F)
742    where
743        F: FnMut(&mut T, &mut T) -> bool,
744    {
745        let len = self.buffer.len();
746        if len < 2 {
747            return;
748        }
749        // Make contiguous first to simplify comparisons
750        self.buffer.make_contiguous();
751        let mut i = 0;
752        while i + 1 < self.buffer.len() {
753            let should_remove = {
754                let slice = self.buffer.make_contiguous();
755                let (left, right) = slice.split_at_mut(i + 1);
756                same_bucket(&mut right[0], &mut left[i])
757            };
758            if should_remove {
759                self.buffer.remove(i + 1);
760            } else {
761                i += 1;
762            }
763        }
764    }
765
766    /// Creates an iterator which uses a closure to determine if an element
767    /// should be removed.
768    ///
769    /// If the closure returns `true`, then the element is removed and yielded.
770    /// If the closure returns `false`, it will try again, and call the closure
771    /// on the next element, seeing if it passes the test.
772    ///
773    /// Using this method is equivalent to the following code:
774    ///
775    /// ```
776    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
777    /// # fn main() {
778    /// # let some_predicate = |x: &mut i32| { *x == 2 || *x == 3 || *x == 6
779    /// # };
780    /// let mut deq = FixedSliceDeque::new(0);
781    /// deq.extend(1..7);
782    /// let mut i = 0;
783    /// while i != deq.len() {
784    ///     if some_predicate(&mut deq[i]) {
785    ///         let val = deq.remove(i);
786    ///     // your code here
787    ///     } else {
788    ///         i += 1;
789    ///     }
790    /// }
791    /// # let mut expected = fsdeq![1, 4, 5];
792    /// # assert_eq!(deq, expected);
793    /// # }
794    /// ```
795    ///
796    /// But `drain_filter` is easier to use. `drain_filter` is also more
797    /// efficient, because it can backshift the elements of the deque in
798    /// bulk.
799    ///
800    /// Note that `drain_filter` also lets you mutate every element in the
801    /// filter closure, regardless of whether you choose to keep or remove
802    /// it.
803    ///
804    ///
805    /// # Examples
806    ///
807    /// Splitting a deque into evens and odds, reusing the original allocation:
808    ///
809    /// ```
810    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
811    /// # fn main() {
812    /// let mut numbers = fsdeq![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];
813    ///
814    /// let evens = numbers
815    ///     .drain_filter(|x| *x % 2 == 0)
816    ///     .collect::<FixedSliceDeque<_>>();
817    /// let odds = numbers;
818    ///
819    /// assert_eq!(fsdeq![2, 4, 6, 8, 14], evens);
820    /// assert_eq!(evens.capacity(), 5);
821    /// assert_eq!(odds, fsdeq![1, 3, 5, 9, 11, 13, 15]);
822    /// assert_eq!(odds.capacity(), 12);
823    /// # }
824    /// ```
825    #[inline]
826    #[allow(mismatched_lifetime_syntaxes)]
827    pub fn drain_filter<F>(&mut self, filter: F) -> DrainFilter<T, F>
828    where
829        F: FnMut(&mut T) -> bool,
830    {
831        let old_len = self.len();
832        DrainFilter {
833            deque: self,
834            filter,
835            old_len,
836            idx: 0,
837            del: 0,
838        }
839    }
840}
841
842impl<T: PartialEq> FixedSliceDeque<T> {
843    /// Removes consecutive repeated elements in the deque.
844    ///
845    /// If the deque is sorted, this removes all duplicates.
846    ///
847    /// # Examples
848    ///
849    /// ```
850    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
851    /// # fn main() {
852    /// let mut deq = fsdeq![1, 2, 2, 3, 2];
853    ///
854    /// deq.dedup();
855    /// assert_eq!(deq, [1, 2, 3, 2]);
856    ///
857    /// deq.sort();
858    /// assert_eq!(deq, [1, 2, 2, 3]);
859    ///
860    /// deq.dedup();
861    /// assert_eq!(deq, [1, 2, 3]);
862    /// # }
863    /// ```
864    #[inline]
865    pub fn dedup(&mut self) {
866        self.dedup_by(|a, b| a == b);
867    }
868
869    /// Removes the first instance of `item` from the deque if the item exists.
870    ///
871    /// # Examples
872    ///
873    /// ```
874    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
875    /// # fn main() {
876    /// let mut deq = fsdeq![1, 2, 3, 1];
877    ///
878    /// deq.remove_item(&1);
879    /// assert_eq!(deq, &[2, 3, 1]);
880    /// deq.remove_item(&1);
881    /// assert_eq!(deq, &[2, 3]);
882    /// # }
883    /// ```
884    #[inline]
885    pub fn remove_item(&mut self, item: &T) -> Option<T> {
886        let pos = self.buffer.iter().position(|x| x == item)?;
887        self.buffer.remove(pos)
888    }
889}
890
891impl<T: Clone> FixedSliceDeque<T> {
892    /// Clones and appends all elements in a slice to the [`FixedSliceDeque`]
893    /// Capacity is upgraded so elements can fit.
894    /// Iterates over the slice `other`, clones each element, and then appends
895    /// it to this `SliceDeque`. The `other` slice is traversed in-order.
896    ///
897    /// Note that this function is same as `extend` except that it is
898    /// specialized to work with slices instead. If and when Rust gets
899    /// specialization this function will likely be deprecated (but still
900    /// available).
901    ///
902    /// # Examples
903    ///
904    /// ```
905    /// # use fixed_slice_deque::FixedSliceDeque;
906    /// let mut deq = FixedSliceDeque::new(1);
907    /// assert_eq!(deq.capacity(), 1);
908    /// deq.push_back(1);
909    /// deq.extend_from_slice(&[2, 3, 4]);
910    /// assert_eq!(deq, [1, 2, 3, 4]);
911    /// assert_eq!(deq.capacity(), 4);
912    /// ```
913    #[inline]
914    pub fn extend_from_slice(&mut self, other: &[T]) {
915        self.capacity = self.len() + other.len();
916        self.buffer.extend(other.iter().cloned());
917    }
918
919    /// Modifies the [`FixedSliceDeque`] in-place so that `capacity` is equal to
920    /// `new_capacity`, either by removing excess elements or by appending clones of
921    /// `value` to the back.
922    ///
923    /// # Examples
924    ///
925    /// ```
926    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
927    /// # fn main() {
928    /// let mut deq = fsdeq![5, 10, 15];
929    /// assert_eq!(deq, [5, 10, 15]);
930    /// assert_eq!(deq.capacity(), 3);
931    ///
932    /// deq.resize(2, 0);
933    /// assert_eq!(deq, [5, 10]);
934    ///assert_eq!(deq.capacity(), 2);
935    ///
936    /// deq.resize(5, 20);
937    /// assert_eq!(deq, [5, 10, 20, 20, 20]);
938    /// assert_eq!(deq.capacity(), 5);
939    /// # }
940    /// ```
941    #[inline]
942    pub fn resize(&mut self, new_capacity: usize, value: T) {
943        self.capacity = new_capacity;
944        self.buffer.resize(new_capacity, value);
945    }
946}
947
948impl<T: Default> FixedSliceDeque<T> {
949    /// Resizes the [`FixedSliceDeque`] in-place so that `capacity` is equal to `new_capacity`.
950    ///
951    /// If `new_capacity` is greater than `capacity`, the [`FixedSliceDeque`] is extended by the
952    /// difference, with each additional slot filled with `Default::default()`.
953    /// If `new_capacity` is less than `len`, the `[`FixedSliceDeque`] is simply truncated.
954    ///
955    /// This method uses `Default` to create new values on every push. If
956    /// you'd rather `Clone` a given value, use [`resize`].
957    ///
958    ///
959    /// # Examples
960    ///
961    /// ```
962    /// # use fixed_slice_deque::{FixedSliceDeque, fsdeq};
963    /// # fn main() {
964    /// let mut deq = fsdeq![1, 2, 3];
965    /// deq.resize_default(5);
966    /// assert_eq!(deq, [1, 2, 3, 0, 0]);
967    /// assert_eq!(deq.capacity(), 5);
968    ///
969    /// deq.resize_default(2);
970    /// assert_eq!(deq, [1, 2]);
971    /// assert_eq!(deq.capacity(), 2);
972    /// # }
973    /// ```
974    ///
975    /// [`resize`]: #method.resize
976    #[inline]
977    pub fn resize_default(&mut self, new_capacity: usize) {
978        self.capacity = new_capacity;
979        if new_capacity < self.buffer.len() {
980            self.buffer.truncate(new_capacity);
981        } else {
982            while self.buffer.len() < new_capacity {
983                self.buffer.push_back(Default::default());
984            }
985        }
986    }
987}
988
989impl<T> Deref for FixedSliceDeque<T> {
990    type Target = [T];
991
992    fn deref(&self) -> &Self::Target {
993        self.as_slice()
994    }
995}
996
997impl<T> DerefMut for FixedSliceDeque<T> {
998    fn deref_mut(&mut self) -> &mut Self::Target {
999        self.buffer.make_contiguous()
1000    }
1001}
1002
1003impl<T> From<VecDeque<T>> for FixedSliceDeque<T> {
1004    fn from(deque: VecDeque<T>) -> Self {
1005        Self::from_vec_deque(deque)
1006    }
1007}
1008
1009impl<'a, T: Clone> From<&'a [T]> for FixedSliceDeque<T> {
1010    fn from(slice: &'a [T]) -> Self {
1011        Self {
1012            capacity: slice.len(),
1013            buffer: VecDeque::from(slice.to_vec()),
1014        }
1015    }
1016}
1017
1018impl<'a, T: Clone> From<&'a mut [T]> for FixedSliceDeque<T> {
1019    fn from(slice: &'a mut [T]) -> Self {
1020        Self {
1021            capacity: slice.len(),
1022            buffer: VecDeque::from(slice.to_vec()),
1023        }
1024    }
1025}
1026
1027/// An owning iterator over the elements of a `FixedSliceDeque`.
1028pub struct IntoIter<T> {
1029    inner: VecDeque<T>,
1030}
1031
1032impl<T: Clone> Clone for IntoIter<T> {
1033    fn clone(&self) -> Self {
1034        IntoIter {
1035            inner: self.inner.clone(),
1036        }
1037    }
1038}
1039
1040impl<T> IntoIter<T> {
1041    /// Returns the remaining items as a slice.
1042    pub fn as_slice(&self) -> &[T] {
1043        self.inner.as_slices().0
1044    }
1045
1046    /// Returns the remaining items as a mutable slice.
1047    pub fn as_mut_slice(&mut self) -> &mut [T] {
1048        self.inner.as_mut_slices().0
1049    }
1050}
1051
1052impl<T> Iterator for IntoIter<T> {
1053    type Item = T;
1054
1055    fn next(&mut self) -> Option<T> {
1056        self.inner.pop_front()
1057    }
1058
1059    fn size_hint(&self) -> (usize, Option<usize>) {
1060        let len = self.inner.len();
1061        (len, Some(len))
1062    }
1063}
1064
1065impl<T> ExactSizeIterator for IntoIter<T> {}
1066
1067impl<T> DoubleEndedIterator for IntoIter<T> {
1068    fn next_back(&mut self) -> Option<T> {
1069        self.inner.pop_back()
1070    }
1071}
1072
1073impl<T: std::fmt::Debug> std::fmt::Debug for IntoIter<T> {
1074    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1075        f.debug_tuple("IntoIter").field(&self.as_slice()).finish()
1076    }
1077}
1078
1079impl<T> IntoIterator for FixedSliceDeque<T> {
1080    type Item = T;
1081    type IntoIter = IntoIter<T>;
1082
1083    fn into_iter(self) -> Self::IntoIter {
1084        IntoIter { inner: self.buffer }
1085    }
1086}
1087
1088impl<'a, T> IntoIterator for &'a FixedSliceDeque<T> {
1089    type Item = &'a T;
1090    type IntoIter = slice::Iter<'a, T>;
1091    #[inline]
1092    fn into_iter(self) -> slice::Iter<'a, T> {
1093        self.iter()
1094    }
1095}
1096
1097impl<'a, T> IntoIterator for &'a mut FixedSliceDeque<T> {
1098    type Item = &'a mut T;
1099    type IntoIter = slice::IterMut<'a, T>;
1100    #[inline]
1101    fn into_iter(self) -> slice::IterMut<'a, T> {
1102        self.iter_mut()
1103    }
1104}
1105
1106impl<T> Extend<T> for FixedSliceDeque<T> {
1107    #[inline]
1108    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
1109        self.buffer.extend(iter);
1110        self.capacity = self.buffer.len();
1111        self.buffer.make_contiguous();
1112    }
1113}
1114
1115impl<'a, T: 'a + Copy> Extend<&'a T> for FixedSliceDeque<T> {
1116    fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
1117        self.buffer.extend(iter);
1118        self.capacity = self.buffer.len();
1119        self.buffer.make_contiguous();
1120    }
1121}
1122
1123impl<T> std::iter::FromIterator<T> for FixedSliceDeque<T> {
1124    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
1125        Self::from_vec_deque(VecDeque::from_iter(iter))
1126    }
1127}
1128
1129macro_rules! __impl_slice_eq1 {
1130    ($Lhs:ty, $Rhs:ty) => {
1131        __impl_slice_eq1! { $Lhs, $Rhs, Sized }
1132    };
1133    ($Lhs:ty, $Rhs:ty, $Bound:ident) => {
1134        #[allow(clippy::extra_unused_lifetimes)]
1135        impl<'a, 'b, A: $Bound, B> PartialEq<$Rhs> for $Lhs
1136        where
1137            A: PartialEq<B>,
1138        {
1139            #[inline]
1140            fn eq(&self, other: &$Rhs) -> bool {
1141                if self.len() != other.len() {
1142                    return false;
1143                }
1144                self.iter().zip(other.iter()).all(|(a, b)| a == b)
1145            }
1146        }
1147    };
1148}
1149
1150impl<A, B> PartialEq<FixedSliceDeque<B>> for FixedSliceDeque<A>
1151where
1152    A: PartialEq<B>,
1153{
1154    #[inline]
1155    fn eq(&self, other: &FixedSliceDeque<B>) -> bool {
1156        if self.len() != other.len() {
1157            return false;
1158        }
1159        self.iter().zip(other.iter()).all(|(a, b)| a == b)
1160    }
1161}
1162
1163__impl_slice_eq1! { FixedSliceDeque<A>, &'b [B] }
1164__impl_slice_eq1! { FixedSliceDeque<A>, &'b mut [B] }
1165__impl_slice_eq1! { FixedSliceDeque<A>, Vec<B> }
1166
1167macro_rules! array_impls {
1168    ($($N: expr)+) => {
1169        $(
1170            // NOTE: some less important impls are omitted to reduce code bloat
1171            __impl_slice_eq1! { FixedSliceDeque<A>, [B; $N] }
1172            __impl_slice_eq1! { FixedSliceDeque<A>, &'b [B; $N] }
1173        )+
1174    }
1175}
1176
1177array_impls! {
1178     0  1  2  3  4  5  6  7  8  9
1179    10 11 12 13 14 15 16 17 18 19
1180    20 21 22 23 24 25 26 27 28 29
1181    30 31 32
1182}
1183
1184#[cfg(test)]
1185mod tests {
1186    use crate::FixedSliceDeque;
1187    use std::cell::RefCell;
1188    use std::collections::{HashMap, VecDeque};
1189    use std::rc::Rc;
1190
1191    const SIZES_TO_TEST: &[usize] = &[2, 4, 8, 16, 32, 64, 128];
1192
1193    #[derive(Clone, Debug)]
1194    struct WithDrop {
1195        counter: Rc<RefCell<usize>>,
1196    }
1197
1198    impl Drop for WithDrop {
1199        fn drop(&mut self) {
1200            *self.counter.borrow_mut() += 1;
1201        }
1202    }
1203
1204    #[test]
1205    fn get() {
1206        let mut deq = FixedSliceDeque::new(3);
1207        deq.push_back(3);
1208        deq.push_back(4);
1209        deq.push_back(5);
1210        assert_eq!(deq.get(1), Some(&4));
1211    }
1212
1213    #[test]
1214    fn get_mut() {
1215        let mut deq = FixedSliceDeque::new(3);
1216        deq.push_back(3);
1217        deq.push_back(4);
1218        deq.push_back(5);
1219        assert_eq!(deq.get(1), Some(&4));
1220        if let Some(elem) = deq.get_mut(1) {
1221            *elem = 7;
1222        }
1223        assert_eq!(deq[1], 7);
1224    }
1225
1226    #[test]
1227    fn is_empty() {
1228        let mut deq = FixedSliceDeque::new(1);
1229        assert!(deq.is_empty());
1230        deq.push_back(4);
1231        assert!(!deq.is_empty());
1232        deq.pop_front();
1233        assert!(deq.is_empty());
1234    }
1235
1236    #[test]
1237    fn push_pop_front() {
1238        for size in SIZES_TO_TEST.iter().copied() {
1239            let mut v: FixedSliceDeque<usize> = FixedSliceDeque::new(size);
1240            for i in 0..size {
1241                v.push_front(i);
1242                assert_eq!(v.len(), i + 1);
1243                assert_eq!(v.capacity(), size);
1244                for j in 0..v.len() {
1245                    assert_eq!(*v.get(v.len() - j - 1).unwrap(), j);
1246                }
1247            }
1248            assert_eq!(v.len(), size);
1249            for i in 0..size {
1250                assert_eq!(*v.get(i).unwrap(), size - i - 1);
1251            }
1252            for i in 0..size {
1253                assert_eq!(v.len(), size - i);
1254                assert_eq!(v.capacity(), size);
1255                v.pop_front();
1256                for j in 0..v.len() {
1257                    assert_eq!(*v.get(v.len() - j - 1).unwrap(), j);
1258                }
1259            }
1260            assert_eq!(v.len(), 0);
1261            assert_eq!(v.capacity(), size);
1262        }
1263    }
1264
1265    #[test]
1266    fn try_push_front() {
1267        let mut deque = FixedSliceDeque::new(0);
1268        assert_eq!(deque.try_push_front(1), Err(1));
1269    }
1270
1271    #[test]
1272    fn try_push_back() {
1273        let mut deque = FixedSliceDeque::new(0);
1274        assert_eq!(deque.try_push_back(1), Err(1));
1275    }
1276
1277    #[test]
1278    fn front_back_mut() {
1279        let mut v = fsdeq![1];
1280        assert_eq!(v.front_mut(), Some(&mut 1));
1281        assert_eq!(v.back_mut(), Some(&mut 1));
1282    }
1283
1284    #[test]
1285    fn mut_slice() {
1286        let mut v = fsdeq![1];
1287        assert_eq!(v.as_mut_slice(), &mut [1]);
1288    }
1289
1290    #[test]
1291    fn push_pop_back() {
1292        for size in SIZES_TO_TEST.iter().copied() {
1293            let mut v: FixedSliceDeque<_> = (0..size).collect();
1294            for i in 0..size {
1295                assert_eq!(v.len(), size - i);
1296                assert_eq!(v.capacity(), size);
1297                v.pop_back();
1298                for j in 0..v.len() {
1299                    assert_eq!(*v.get(j).unwrap(), j);
1300                }
1301            }
1302            assert_eq!(v.len(), 0);
1303            assert_eq!(v.capacity(), size);
1304        }
1305    }
1306
1307    #[test]
1308    fn keeps_capacity() {
1309        for size in SIZES_TO_TEST.iter().copied() {
1310            let mut v: FixedSliceDeque<_> = (0..size).collect();
1311            for i in 0..size {
1312                let first = v.push_back(i);
1313                assert!(v.is_full());
1314                assert_eq!(v.capacity(), size);
1315                assert!(first.is_some());
1316            }
1317
1318            for i in 0..size {
1319                let last = v.push_front(i);
1320                assert!(v.is_full());
1321                assert_eq!(v.capacity(), size);
1322                assert!(last.is_some());
1323            }
1324        }
1325    }
1326
1327    #[test]
1328    fn from_vec_deque() {
1329        let deque = VecDeque::from(vec![1, 2, 3]);
1330        let v: FixedSliceDeque<_> = deque.clone().into();
1331        assert_eq!(&v[..], &deque.iter().copied().collect::<Vec<_>>()[..]);
1332        let v: FixedSliceDeque<_> = FixedSliceDeque::from_vec_deque(deque.clone());
1333        assert_eq!(&v[..], &deque.iter().copied().collect::<Vec<_>>()[..]);
1334    }
1335
1336    #[test]
1337    fn from_slice() {
1338        let deque = [1, 2, 3];
1339        let v: FixedSliceDeque<_> = deque.clone().as_slice().into();
1340        assert_eq!(&v, &deque);
1341    }
1342
1343    #[test]
1344    fn from_slice_mut() {
1345        let deque = [1, 2, 3];
1346        let v: FixedSliceDeque<_> = deque.clone().as_mut_slice().into();
1347        assert_eq!(&v, &deque);
1348    }
1349
1350    #[test]
1351    fn clear() {
1352        for size in SIZES_TO_TEST.iter().copied() {
1353            let counter = Rc::new(RefCell::new(0));
1354            let val = WithDrop {
1355                counter: counter.clone(),
1356            };
1357            assert_eq!(*counter.borrow(), 0);
1358            let mut deque: FixedSliceDeque<_> = (0..size).map(|_| val.clone()).collect();
1359            assert_eq!(*counter.borrow(), 0);
1360            deque.clear();
1361            assert_eq!(*counter.borrow(), size);
1362            assert_eq!(deque.len(), 0);
1363        }
1364    }
1365
1366    #[test]
1367    fn resize() {
1368        for size in SIZES_TO_TEST.iter().copied() {
1369            let mut v: FixedSliceDeque<_> = (0..size).collect();
1370            let v_ref: FixedSliceDeque<_> = (0..size / 2).collect();
1371            v.resize(size / 2, 0);
1372            assert_eq!(v.len(), size / 2);
1373            assert_eq!(v.capacity(), size / 2);
1374            assert_eq!(v.as_slice(), v_ref.as_slice());
1375
1376            v.resize(size, 3);
1377            assert_eq!(v.len(), size);
1378            assert_eq!(v.capacity(), size);
1379            assert_eq!(v.as_slice().last(), Some(&3));
1380
1381            v.resize(0, 3);
1382            assert_eq!(v.len(), 0);
1383            assert_eq!(v.capacity(), 0);
1384
1385            v.resize(size, 3);
1386            let v_ref: FixedSliceDeque<_> = (0..size).map(|_| 3usize).collect();
1387            assert_eq!(v.len(), size);
1388            assert_eq!(v.capacity(), size);
1389            assert_eq!(v_ref.len(), size);
1390            assert_eq!(v.as_slice(), v_ref.as_slice());
1391        }
1392    }
1393
1394    #[test]
1395    fn resize_default() {
1396        for size in SIZES_TO_TEST.iter().copied() {
1397            let mut v: FixedSliceDeque<_> = (0..size).collect();
1398            let v_ref: FixedSliceDeque<_> = (0..size / 2).collect();
1399            v.resize_default(size / 2);
1400            assert_eq!(v.len(), size / 2);
1401            assert_eq!(v.capacity(), size / 2);
1402            assert_eq!(v.as_slice(), v_ref.as_slice());
1403
1404            v.resize_default(size);
1405            assert_eq!(v.len(), size);
1406            assert_eq!(v.capacity(), size);
1407            assert_eq!(v.as_slice().last(), Some(&0));
1408
1409            v.resize_default(0);
1410            assert_eq!(v.len(), 0);
1411            assert_eq!(v.capacity(), 0);
1412
1413            v.resize_default(size);
1414            let v_ref: FixedSliceDeque<_> = (0..size).map(|_| 0).collect();
1415            assert_eq!(v.len(), size);
1416            assert_eq!(v.capacity(), size);
1417            assert_eq!(v_ref.len(), size);
1418            assert_eq!(v.as_slice(), v_ref.as_slice());
1419        }
1420    }
1421
1422    #[test]
1423    fn iter() {
1424        let mut deq = FixedSliceDeque::new(3);
1425        deq.push_back(5);
1426        deq.push_back(3);
1427        deq.push_back(4);
1428        let b: &[_] = &[&5, &3, &4];
1429        let c: Vec<&i32> = deq.iter().collect();
1430        assert_eq!(&c[..], b);
1431    }
1432
1433    #[test]
1434    fn iter_mut() {
1435        let mut deq = FixedSliceDeque::new(3);
1436        deq.push_back(5);
1437        deq.push_back(3);
1438        deq.push_back(4);
1439        for num in deq.iter_mut() {
1440            *num -= 2;
1441        }
1442        let b: &[_] = &[&mut 3, &mut 1, &mut 2];
1443        assert_eq!(&deq.iter_mut().collect::<Vec<&mut i32>>()[..], b);
1444    }
1445
1446    #[test]
1447    fn hash_map() {
1448        let mut hm: HashMap<FixedSliceDeque<u32>, u32> = HashMap::new();
1449        let mut a = FixedSliceDeque::new(2);
1450        a.push_back(1);
1451        a.push_back(2);
1452        hm.insert(a.clone(), 3);
1453        let b = FixedSliceDeque::new(0);
1454        assert_eq!(hm.get(&a), Some(&3));
1455        assert_eq!(hm.get(&b), None);
1456    }
1457
1458    #[test]
1459    fn eq() {
1460        let mut a = FixedSliceDeque::new(3);
1461        a.push_back(1);
1462        a.push_back(2);
1463        a.push_back(3);
1464        assert!(a == a);
1465        assert!(!(a != a));
1466    }
1467
1468    #[test]
1469    fn vec_extend() {
1470        let mut v = FixedSliceDeque::new(0);
1471        let mut w = FixedSliceDeque::new(3);
1472
1473        v.extend(w.clone().iter().copied());
1474        assert_eq!(v, &[]);
1475
1476        v.extend(0..3);
1477
1478        for i in 0..3 {
1479            w.push_back(i);
1480        }
1481
1482        assert_eq!(v, w);
1483
1484        v.extend(3..10);
1485        for i in 3..10 {
1486            w.push_back(i);
1487        }
1488
1489        assert_eq!(v[7..10], w[..3]);
1490    }
1491
1492    #[test]
1493    fn vec_extend_zst() {
1494        // Zero sized types
1495        #[derive(PartialEq, Eq, Debug, Clone, Copy)]
1496        struct Foo;
1497
1498        let mut a = FixedSliceDeque::new(0);
1499        let b = fsdeq![Foo, Foo];
1500
1501        a.extend_from_slice(&b);
1502        assert_eq!(&a, &b);
1503        assert_eq!(a.capacity(), 2);
1504    }
1505
1506    #[test]
1507    fn vec_extend_ref() {
1508        let mut v = FixedSliceDeque::new(2);
1509        for &i in &[1, 2] {
1510            v.push_back(i);
1511        }
1512        assert_eq!(v.capacity(), 2);
1513        v.extend(&[3, 4, 5]);
1514        assert_eq!(v.capacity(), 5);
1515
1516        assert_eq!(v.len(), 5);
1517        assert_eq!(v, [1, 2, 3, 4, 5]);
1518
1519        let mut w = FixedSliceDeque::new(2);
1520        for &i in &[6, 7] {
1521            w.push_back(i);
1522        }
1523        assert_eq!(v.capacity(), 5);
1524        v.extend(&w);
1525        assert_eq!(v.capacity(), 7);
1526
1527        assert_eq!(v.len(), 7);
1528        assert_eq!(v, [1, 2, 3, 4, 5, 6, 7]);
1529    }
1530
1531    #[test]
1532    fn vec_slice_from_mut() {
1533        let mut values = fsdeq![1, 2, 3, 4, 5];
1534        {
1535            let slice = &mut values[2..];
1536            assert_eq!(slice, [3, 4, 5]);
1537            for p in slice {
1538                *p += 2;
1539            }
1540        }
1541        assert_eq!(values.capacity(), 5);
1542        assert_eq!(values, [1, 2, 5, 6, 7]);
1543    }
1544
1545    #[test]
1546    fn vec_slice_to_mut() {
1547        let mut values = fsdeq![1, 2, 3, 4, 5];
1548        {
1549            let slice = &mut values[..2];
1550            assert_eq!(slice, [1, 2]);
1551            for p in slice {
1552                *p += 1;
1553            }
1554        }
1555
1556        assert_eq!(values.capacity(), 5);
1557        assert_eq!(values, [2, 3, 3, 4, 5]);
1558    }
1559
1560    #[test]
1561    fn vec_split_at_mut() {
1562        let mut values = fsdeq![1, 2, 3, 4, 5];
1563        {
1564            let (left, right) = values.split_at_mut(2);
1565            {
1566                let left: &[_] = left;
1567                assert_eq!(&left[..left.len()], &[1, 2]);
1568            }
1569            for p in left {
1570                *p += 1;
1571            }
1572
1573            {
1574                let right: &[_] = right;
1575                assert_eq!(&right[..right.len()], &[3, 4, 5]);
1576            }
1577            for p in right {
1578                *p += 2;
1579            }
1580        }
1581
1582        assert_eq!(values.capacity(), 5);
1583        assert_eq!(values, [2, 3, 5, 6, 7]);
1584    }
1585
1586    #[test]
1587    fn vec_clone() {
1588        let v: FixedSliceDeque<i32> = fsdeq![];
1589        let w = fsdeq![1, 2, 3];
1590
1591        assert_eq!(v, v.clone());
1592
1593        let z = w.clone();
1594        assert_eq!(w, z);
1595        // they should be disjoint in memory.
1596        assert_ne!(w.as_ptr(), z.as_ptr())
1597    }
1598
1599    #[test]
1600    fn vec_retain() {
1601        let mut deq = fsdeq![1, 2, 3, 4];
1602        deq.retain(|&x| x % 2 == 0);
1603        assert_eq!(deq, [2, 4]);
1604    }
1605
1606    #[test]
1607    fn vec_dedup() {
1608        fn case(a: FixedSliceDeque<i32>, b: FixedSliceDeque<i32>) {
1609            let mut v = a;
1610            v.dedup();
1611            assert_eq!(v, b);
1612        }
1613        case(fsdeq![], fsdeq![]);
1614        case(fsdeq![1], fsdeq![1]);
1615        case(fsdeq![1, 1], fsdeq![1]);
1616        case(fsdeq![1, 2, 3], fsdeq![1, 2, 3]);
1617        case(fsdeq![1, 1, 2, 3], fsdeq![1, 2, 3]);
1618        case(fsdeq![1, 2, 2, 3], fsdeq![1, 2, 3]);
1619        case(fsdeq![1, 2, 3, 3], fsdeq![1, 2, 3]);
1620        case(fsdeq![1, 1, 2, 2, 2, 3, 3], fsdeq![1, 2, 3]);
1621    }
1622
1623    #[test]
1624    fn vec_dedup_by_key() {
1625        fn case(a: FixedSliceDeque<i32>, b: FixedSliceDeque<i32>) {
1626            let mut v = a;
1627            v.dedup_by_key(|i| *i / 10);
1628            assert_eq!(v, b);
1629        }
1630        case(fsdeq![], fsdeq![]);
1631        case(fsdeq![10], fsdeq![10]);
1632        case(fsdeq![10, 11], fsdeq![10]);
1633        case(fsdeq![10, 20, 30], fsdeq![10, 20, 30]);
1634        case(fsdeq![10, 11, 20, 30], fsdeq![10, 20, 30]);
1635        case(fsdeq![10, 20, 21, 30], fsdeq![10, 20, 30]);
1636        case(fsdeq![10, 20, 30, 31], fsdeq![10, 20, 30]);
1637        case(fsdeq![10, 11, 20, 21, 22, 30, 31], fsdeq![10, 20, 30]);
1638    }
1639
1640    #[test]
1641    fn vec_dedup_by() {
1642        let mut deq = fsdeq!["foo", "bar", "Bar", "baz", "bar"];
1643        deq.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
1644
1645        assert_eq!(deq, ["foo", "bar", "baz", "bar"]);
1646
1647        let mut deq: FixedSliceDeque<(&'static str, i32)> =
1648            fsdeq![("foo", 1), ("foo", 2), ("bar", 3), ("bar", 4), ("bar", 5)];
1649        deq.dedup_by(|a, b| {
1650            a.0 == b.0 && {
1651                b.1 += a.1;
1652                true
1653            }
1654        });
1655
1656        assert_eq!(deq, [("foo", 3), ("bar", 12)]);
1657    }
1658
1659    #[test]
1660    fn zero_sized_values() {
1661        let mut v = FixedSliceDeque::new(1);
1662        assert_eq!(v.len(), 0);
1663        v.push_back(());
1664        assert_eq!(v.len(), 1);
1665        v.push_back(());
1666        assert_eq!(v.len(), 1);
1667        assert_eq!(v.pop_back(), Some(()));
1668        assert_eq!(v.pop_back(), None);
1669        assert_eq!(v.pop_back(), None);
1670        assert_eq!(v.capacity(), 1);
1671
1672        assert_eq!(v.iter().count(), 0);
1673        v.push_back(());
1674        assert_eq!(v.iter().count(), 1);
1675        v.push_back(());
1676        assert_eq!(v.iter().count(), 1);
1677
1678        for &() in &v {}
1679
1680        assert_eq!(v.iter_mut().count(), 1);
1681        v.push_back(());
1682        assert_eq!(v.iter_mut().count(), 1);
1683        v.push_back(());
1684        assert_eq!(v.iter_mut().count(), 1);
1685
1686        for &mut () in &mut v {}
1687        v.clear();
1688        assert_eq!(v.iter_mut().count(), 0);
1689        assert_eq!(v.capacity(), 1);
1690    }
1691
1692    #[test]
1693    fn vec_partition() {
1694        assert_eq!(
1695            fsdeq![].into_iter().partition(|x: &i32| *x < 4),
1696            (fsdeq![], fsdeq![])
1697        );
1698        assert_eq!(
1699            fsdeq![1, 2, 3].into_iter().partition(|x| *x < 4),
1700            (fsdeq![1, 2, 3], fsdeq![])
1701        );
1702        assert_eq!(
1703            fsdeq![1, 2, 3].into_iter().partition(|x| *x < 2),
1704            (fsdeq![1], fsdeq![2, 3])
1705        );
1706        assert_eq!(
1707            fsdeq![1, 2, 3].into_iter().partition(|x| *x < 0),
1708            (fsdeq![], fsdeq![1, 2, 3])
1709        );
1710    }
1711
1712    #[test]
1713    fn vec_zip_unzip() {
1714        let z1 = fsdeq![(1, 4), (2, 5), (3, 6)];
1715
1716        let (left, right): (FixedSliceDeque<_>, FixedSliceDeque<_>) = z1.iter().cloned().unzip();
1717
1718        assert_eq!((1, 4), (left[0], right[0]));
1719        assert_eq!((2, 5), (left[1], right[1]));
1720        assert_eq!((3, 6), (left[2], right[2]));
1721    }
1722
1723    #[test]
1724    fn vec_vec_truncate_drop() {
1725        static mut DROPS: u32 = 0;
1726        struct Elem;
1727        impl Drop for Elem {
1728            fn drop(&mut self) {
1729                unsafe {
1730                    DROPS += 1;
1731                }
1732            }
1733        }
1734
1735        let mut v = fsdeq![Elem, Elem, Elem, Elem, Elem];
1736        assert_eq!(unsafe { DROPS }, 0);
1737        v.truncate_back(3);
1738        assert_eq!(unsafe { DROPS }, 2);
1739        v.truncate_back(0);
1740        assert_eq!(unsafe { DROPS }, 5);
1741    }
1742
1743    #[test]
1744    fn vec_vec_truncate_front_drop() {
1745        static mut DROPS: u32 = 0;
1746        struct Elem;
1747        impl Drop for Elem {
1748            fn drop(&mut self) {
1749                unsafe {
1750                    DROPS += 1;
1751                }
1752            }
1753        }
1754
1755        let mut v = fsdeq![Elem, Elem, Elem, Elem, Elem];
1756        assert_eq!(unsafe { DROPS }, 0);
1757        v.truncate_front(3);
1758        assert_eq!(unsafe { DROPS }, 2);
1759        v.truncate_front(0);
1760        assert_eq!(unsafe { DROPS }, 5);
1761    }
1762
1763    #[test]
1764    #[should_panic]
1765    fn vec_vec_truncate_fail() {
1766        struct BadElem(i32);
1767        impl Drop for BadElem {
1768            fn drop(&mut self) {
1769                let BadElem(ref mut x) = *self;
1770                if *x == 0xbadbeef {
1771                    panic!("BadElem panic: 0xbadbeef")
1772                }
1773            }
1774        }
1775
1776        let mut v = fsdeq![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
1777        v.truncate_back(0);
1778    }
1779
1780    #[test]
1781    fn vec_index() {
1782        let deq = fsdeq![1, 2, 3];
1783        assert_eq!(deq[1], 2);
1784    }
1785
1786    #[test]
1787    #[should_panic]
1788    fn vec_index_out_of_bounds() {
1789        let deq = fsdeq![1, 2, 3];
1790        let _ = deq[3];
1791    }
1792
1793    #[test]
1794    #[should_panic]
1795    fn vec_slice_out_of_bounds_1() {
1796        let x = fsdeq![1, 2, 3, 4, 5];
1797        let _ = &x[!0..];
1798    }
1799
1800    #[test]
1801    #[should_panic]
1802    fn vec_slice_out_of_bounds_2() {
1803        let x = fsdeq![1, 2, 3, 4, 5];
1804        let _ = &x[..6];
1805    }
1806
1807    #[test]
1808    #[should_panic]
1809    fn vec_slice_out_of_bounds_3() {
1810        let x = fsdeq![1, 2, 3, 4, 5];
1811        #[expect(clippy::reversed_empty_ranges, reason = "Forcing panic")]
1812        let _ = &x[!0..4];
1813    }
1814
1815    #[test]
1816    #[should_panic]
1817    fn vec_slice_out_of_bounds_4() {
1818        let x = fsdeq![1, 2, 3, 4, 5];
1819        let _ = &x[1..6];
1820    }
1821
1822    #[test]
1823    #[should_panic]
1824    fn vec_slice_out_of_bounds_5() {
1825        let x = fsdeq![1, 2, 3, 4, 5];
1826        #[expect(clippy::reversed_empty_ranges, reason = "Forcing panic")]
1827        let _ = &x[3..2];
1828    }
1829
1830    #[test]
1831    fn vec_move_items() {
1832        let deq = fsdeq![1, 2, 3];
1833        let mut deq2 = FixedSliceDeque::new(3);
1834        for i in deq {
1835            deq2.push_back(i);
1836        }
1837        assert_eq!(deq2, [1, 2, 3]);
1838    }
1839
1840    #[test]
1841    fn vec_move_items_reverse() {
1842        let deq = fsdeq![1, 2, 3];
1843        let mut deq2 = FixedSliceDeque::new(3);
1844        for i in deq.into_iter().rev() {
1845            deq2.push_back(i);
1846        }
1847        assert_eq!(deq2, [3, 2, 1]);
1848    }
1849
1850    #[test]
1851    fn vec_move_items_zero_sized() {
1852        let deq = fsdeq![(), (), ()];
1853        let mut deq2 = FixedSliceDeque::new(3);
1854        for i in deq {
1855            deq2.push_back(i);
1856        }
1857        assert_eq!(deq2, [(), (), ()]);
1858    }
1859
1860    #[test]
1861    fn vec_drain_items() {
1862        let mut deq = fsdeq![1, 2, 3];
1863        let mut deq2 = FixedSliceDeque::new(3);
1864        for i in deq.drain(..) {
1865            deq2.push_back(i);
1866        }
1867        assert_eq!(deq, []);
1868        assert_eq!(deq2, [1, 2, 3]);
1869        assert_eq!(deq.capacity(), deq2.capacity());
1870    }
1871
1872    #[test]
1873    fn vec_drain_items_reverse() {
1874        let mut deq = fsdeq![1, 2, 3];
1875        let mut deq2 = FixedSliceDeque::new(3);
1876        for i in deq.drain(..).rev() {
1877            deq2.push_back(i);
1878        }
1879        assert_eq!(deq, []);
1880        assert_eq!(deq2, [3, 2, 1]);
1881        assert_eq!(deq.capacity(), deq2.capacity());
1882    }
1883
1884    #[test]
1885    fn vec_drain_items_zero_sized() {
1886        let mut deq = fsdeq![(), (), ()];
1887        let mut deq2 = FixedSliceDeque::new(3);
1888        for i in deq.drain(..) {
1889            deq2.push_back(i);
1890        }
1891        assert_eq!(deq, []);
1892        assert_eq!(deq2, [(), (), ()]);
1893        assert_eq!(deq.capacity(), deq2.capacity());
1894    }
1895
1896    #[test]
1897    #[should_panic]
1898    fn vec_drain_out_of_bounds() {
1899        let mut v = fsdeq![1, 2, 3, 4, 5];
1900        v.drain(5..6);
1901    }
1902
1903    #[test]
1904    fn vec_drain_range() {
1905        let mut v = fsdeq![1, 2, 3, 4, 5];
1906        for _ in v.drain(4..) {}
1907        assert_eq!(v, &[1, 2, 3, 4]);
1908
1909        let mut v: FixedSliceDeque<_> = (1..6).map(|x| x.to_string()).collect();
1910        for _ in v.drain(1..4) {}
1911        assert_eq!(v, &[1.to_string(), 5.to_string()]);
1912
1913        let mut v: FixedSliceDeque<_> = (1..6).map(|x| x.to_string()).collect();
1914        for _ in v.drain(1..4).rev() {}
1915        assert_eq!(v, &[1.to_string(), 5.to_string()]);
1916    }
1917
1918    #[test]
1919    fn vec_drain_range_zst() {
1920        let mut v: FixedSliceDeque<_> = fsdeq![(); 5];
1921        for _ in v.drain(1..4).rev() {}
1922        assert_eq!(v, &[(), ()]);
1923    }
1924
1925    #[test]
1926    fn vec_drain_inclusive_range() {
1927        let mut v = fsdeq!['a', 'b', 'c', 'd', 'e'];
1928        for _ in v.drain(1..=3) {}
1929        assert_eq!(v, &['a', 'e']);
1930
1931        let mut v: FixedSliceDeque<_> = (0..=5).map(|x| x.to_string()).collect();
1932        for _ in v.drain(1..=5) {}
1933        assert_eq!(v, &["0".to_string()]);
1934
1935        let mut v: FixedSliceDeque<String> = (0..=5).map(|x| x.to_string()).collect();
1936        for _ in v.drain(0..=5) {}
1937        assert_eq!(v, FixedSliceDeque::<String>::new(0));
1938
1939        let mut v: FixedSliceDeque<_> = (0..=5).map(|x| x.to_string()).collect();
1940        for _ in v.drain(0..=3) {}
1941        assert_eq!(v, &["4".to_string(), "5".to_string()]);
1942
1943        let mut v: FixedSliceDeque<_> = (0..=1).map(|x| x.to_string()).collect();
1944        for _ in v.drain(..=0) {}
1945        assert_eq!(v, &["1".to_string()]);
1946    }
1947
1948    #[test]
1949    #[should_panic]
1950    fn vec_drain_inclusive_out_of_bounds() {
1951        let mut v = fsdeq![1, 2, 3, 4, 5];
1952        v.drain(5..=5);
1953    }
1954
1955    #[test]
1956    fn vec_append() {
1957        let mut deq = fsdeq![1, 2, 3];
1958        let mut deq2 = fsdeq![4, 5, 6];
1959        deq.append(&mut deq2);
1960        assert_eq!(deq, [4, 5, 6]);
1961        assert_eq!(deq2, []);
1962    }
1963
1964    #[test]
1965    fn vec_append_small() {
1966        let mut v = FixedSliceDeque::new(10);
1967        let mut deq = fsdeq![1, 2, 3];
1968        let mut deq2 = fsdeq![4, 5, 6];
1969        v.append(&mut deq);
1970        v.append(&mut deq2);
1971        assert_eq!(v, [1, 2, 3, 4, 5, 6]);
1972        assert_eq!(v.capacity(), 10);
1973        assert_eq!(deq, []);
1974        assert_eq!(deq2, []);
1975    }
1976
1977    #[test]
1978    fn vec_into_iter_as_slice() {
1979        let deq = fsdeq!['a', 'b', 'c'];
1980        let mut into_iter = deq.into_iter();
1981        assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
1982        let _ = into_iter.next().unwrap();
1983        assert_eq!(into_iter.as_slice(), &['b', 'c']);
1984        let _ = into_iter.next().unwrap();
1985        let _ = into_iter.next().unwrap();
1986        assert_eq!(into_iter.as_slice(), &[]);
1987    }
1988
1989    #[test]
1990    fn vec_into_iter_as_mut_slice() {
1991        let deq = fsdeq!['a', 'b', 'c'];
1992        let mut into_iter = deq.into_iter();
1993        assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
1994        into_iter.as_mut_slice()[0] = 'x';
1995        into_iter.as_mut_slice()[1] = 'y';
1996        assert_eq!(into_iter.next().unwrap(), 'x');
1997        assert_eq!(into_iter.as_slice(), &['y', 'c']);
1998    }
1999
2000    #[test]
2001    fn vec_into_iter_debug() {
2002        let deq = fsdeq!['a', 'b', 'c'];
2003        let into_iter = deq.into_iter();
2004        let debug = format!("{:?}", into_iter);
2005        assert_eq!(debug, "IntoIter(['a', 'b', 'c'])");
2006    }
2007
2008    #[test]
2009    fn vec_into_iter_count() {
2010        assert_eq!(fsdeq![1, 2, 3].into_iter().count(), 3);
2011    }
2012
2013    #[test]
2014    fn vec_into_iter_clone() {
2015        fn iter_equal<I: Iterator<Item = i32>>(it: I, slice: &[i32]) {
2016            let v: FixedSliceDeque<i32> = it.collect();
2017            assert_eq!(&v[..], slice);
2018        }
2019        let deq = fsdeq![1, 2, 3];
2020        let mut it = deq.into_iter();
2021        let it_c = it.clone();
2022        iter_equal(it_c, &[1, 2, 3]);
2023        assert_eq!(it.next(), Some(1));
2024        let mut it = it.rev();
2025        iter_equal(it.clone(), &[3, 2]);
2026        assert_eq!(it.next(), Some(3));
2027        iter_equal(it.clone(), &[2]);
2028        assert_eq!(it.next(), Some(2));
2029        iter_equal(it.clone(), &[]);
2030        assert_eq!(it.next(), None);
2031    }
2032
2033    #[test]
2034    fn into_inner() {
2035        let fdeque = fsdeq![1, 2, 3];
2036        let deque = VecDeque::from(vec![1, 2, 3]);
2037        assert_eq!(fdeque.into_inner(), deque);
2038    }
2039
2040    #[test]
2041    fn drain_filter_empty() {
2042        let mut deq: FixedSliceDeque<i32> = fsdeq![];
2043
2044        {
2045            let mut iter = deq.drain_filter(|_| true);
2046            assert_eq!(iter.size_hint(), (0, Some(0)));
2047            assert_eq!(iter.next(), None);
2048            assert_eq!(iter.size_hint(), (0, Some(0)));
2049            assert_eq!(iter.next(), None);
2050            assert_eq!(iter.size_hint(), (0, Some(0)));
2051        }
2052        assert_eq!(deq.len(), 0);
2053        assert_eq!(deq, fsdeq![]);
2054    }
2055
2056    #[test]
2057    fn drain_filter_zst() {
2058        let mut deq = fsdeq![(), (), (), (), ()];
2059        let initial_len = deq.len();
2060        let mut count = 0;
2061        {
2062            let mut iter = deq.drain_filter(|_| true);
2063            assert_eq!(iter.size_hint(), (0, Some(initial_len)));
2064            while let Some(_) = iter.next() {
2065                count += 1;
2066                assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
2067            }
2068            assert_eq!(iter.size_hint(), (0, Some(0)));
2069            assert_eq!(iter.next(), None);
2070            assert_eq!(iter.size_hint(), (0, Some(0)));
2071        }
2072
2073        assert_eq!(count, initial_len);
2074        assert_eq!(deq.len(), 0);
2075        assert_eq!(deq, fsdeq![]);
2076    }
2077
2078    #[test]
2079    fn drain_filter_false() {
2080        let mut deq = fsdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
2081
2082        let initial_len = deq.len();
2083        let mut count = 0;
2084        {
2085            let mut iter = deq.drain_filter(|_| false);
2086            assert_eq!(iter.size_hint(), (0, Some(initial_len)));
2087            for _ in iter.by_ref() {
2088                count += 1;
2089            }
2090            assert_eq!(iter.size_hint(), (0, Some(0)));
2091            assert_eq!(iter.next(), None);
2092            assert_eq!(iter.size_hint(), (0, Some(0)));
2093        }
2094
2095        assert_eq!(count, 0);
2096        assert_eq!(deq.len(), initial_len);
2097        assert_eq!(deq, fsdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
2098    }
2099
2100    #[test]
2101    fn drain_filter_true() {
2102        let mut deq = fsdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
2103
2104        let initial_len = deq.len();
2105        let mut count = 0;
2106        {
2107            let mut iter = deq.drain_filter(|_| true);
2108            assert_eq!(iter.size_hint(), (0, Some(initial_len)));
2109            while let Some(_) = iter.next() {
2110                count += 1;
2111                assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
2112            }
2113            assert_eq!(iter.size_hint(), (0, Some(0)));
2114            assert_eq!(iter.next(), None);
2115            assert_eq!(iter.size_hint(), (0, Some(0)));
2116        }
2117
2118        assert_eq!(count, initial_len);
2119        assert_eq!(deq.len(), 0);
2120        assert_eq!(deq, fsdeq![]);
2121    }
2122
2123    #[test]
2124    fn drain_filter_complex() {
2125        {
2126            //                [+xxx++++++xxxxx++++x+x++]
2127            let mut deq = fsdeq![
2128                1, 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36,
2129                37, 39,
2130            ];
2131
2132            let removed = deq
2133                .drain_filter(|x| *x % 2 == 0)
2134                .collect::<FixedSliceDeque<_>>();
2135            assert_eq!(removed.len(), 10);
2136            assert_eq!(removed, fsdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
2137
2138            assert_eq!(deq.len(), 14);
2139            assert_eq!(
2140                deq,
2141                fsdeq![1, 7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
2142            );
2143        }
2144
2145        {
2146            //                [xxx++++++xxxxx++++x+x++]
2147            let mut deq = fsdeq![
2148                2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36, 37,
2149                39,
2150            ];
2151
2152            let removed = deq
2153                .drain_filter(|x| *x % 2 == 0)
2154                .collect::<FixedSliceDeque<_>>();
2155            assert_eq!(removed.len(), 10);
2156            assert_eq!(removed, fsdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
2157
2158            assert_eq!(deq.len(), 13);
2159            assert_eq!(
2160                deq,
2161                fsdeq![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
2162            );
2163        }
2164
2165        {
2166            //                [xxx++++++xxxxx++++x+x]
2167            let mut deq = fsdeq![
2168                2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36,
2169            ];
2170
2171            let removed = deq
2172                .drain_filter(|x| *x % 2 == 0)
2173                .collect::<FixedSliceDeque<_>>();
2174            assert_eq!(removed.len(), 10);
2175            assert_eq!(removed, fsdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
2176
2177            assert_eq!(deq.len(), 11);
2178            assert_eq!(deq, fsdeq![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35]);
2179        }
2180
2181        {
2182            //                [xxxxxxxxxx+++++++++++]
2183            let mut deq = fsdeq![
2184                2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19,
2185            ];
2186
2187            let removed = deq
2188                .drain_filter(|x| *x % 2 == 0)
2189                .collect::<FixedSliceDeque<_>>();
2190            assert_eq!(removed.len(), 10);
2191            assert_eq!(removed, fsdeq![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
2192
2193            assert_eq!(deq.len(), 10);
2194            assert_eq!(deq, fsdeq![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
2195        }
2196
2197        {
2198            //                [+++++++++++xxxxxxxxxx]
2199            let mut deq = fsdeq![
2200                1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20,
2201            ];
2202
2203            let removed = deq
2204                .drain_filter(|x| *x % 2 == 0)
2205                .collect::<FixedSliceDeque<_>>();
2206            assert_eq!(removed.len(), 10);
2207            assert_eq!(removed, fsdeq![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
2208
2209            assert_eq!(deq.len(), 10);
2210            assert_eq!(deq, fsdeq![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
2211        }
2212    }
2213
2214    #[test]
2215    fn vecdeque_simple() {
2216        let mut d = FixedSliceDeque::new(3);
2217        assert_eq!(d.len(), 0);
2218        assert_eq!(d.capacity(), 3);
2219        d.push_front(17);
2220        d.push_front(42);
2221        d.push_back(137);
2222        assert_eq!(d.len(), 3);
2223        assert_eq!(d.capacity(), 3);
2224        d.push_back(137);
2225        assert_eq!(d.len(), 3);
2226        assert_eq!(*d.front().unwrap(), 17);
2227        assert_eq!(*d.back().unwrap(), 137);
2228        let mut i = d.pop_front();
2229        assert_eq!(i, Some(17));
2230        i = d.pop_back();
2231        assert_eq!(i, Some(137));
2232        i = d.pop_back();
2233        assert_eq!(i, Some(137));
2234        i = d.pop_back();
2235        assert_eq!(i, None);
2236        assert_eq!(d.len(), 0);
2237        assert_eq!(d.capacity(), 3);
2238        d.push_back(3);
2239        assert_eq!(d.len(), 1);
2240        d.push_front(2);
2241        assert_eq!(d.len(), 2);
2242        d.push_back(4);
2243        assert_eq!(d.len(), 3);
2244        d.push_front(1);
2245        assert_eq!(d.len(), 3);
2246        assert_eq!(d[0], 1);
2247        assert_eq!(d[1], 2);
2248        assert_eq!(d[2], 3);
2249    }
2250
2251    #[test]
2252    fn vecdeque_push_front_grow() {
2253        let mut deq = FixedSliceDeque::new(66);
2254        for i in 0..66 {
2255            deq.push_front(i);
2256        }
2257        assert_eq!(deq.len(), 66);
2258
2259        for i in 0..66 {
2260            assert_eq!(deq[i], 65 - i);
2261        }
2262
2263        let mut deq = FixedSliceDeque::new(66);
2264        for i in 0..66 {
2265            deq.push_back(i);
2266        }
2267
2268        for i in 0..66 {
2269            assert_eq!(deq[i], i);
2270        }
2271    }
2272
2273    #[test]
2274    fn vecdeque_index() {
2275        let mut deq = FixedSliceDeque::new(4);
2276        for i in 1..4 {
2277            deq.push_front(i);
2278        }
2279        assert_eq!(deq[1], 2);
2280    }
2281
2282    #[test]
2283    #[should_panic]
2284    fn vecdeque_index_out_of_bounds() {
2285        let mut deq = FixedSliceDeque::new(1);
2286        for i in 1..4 {
2287            deq.push_front(i);
2288        }
2289        #[expect(clippy::no_effect, reason = "This is just to make it panic")]
2290        deq[3];
2291    }
2292
2293    #[test]
2294    fn vecdeque_with_capacity() {
2295        let mut d = FixedSliceDeque::new(0);
2296        d.push_back(1);
2297        assert_eq!(d.len(), 1);
2298        let mut d = FixedSliceDeque::new(50);
2299        d.push_back(1);
2300        assert_eq!(d.len(), 1);
2301    }
2302
2303    #[test]
2304    fn vecdeque_with_capacity_non_power_two() {
2305        let mut d3 = FixedSliceDeque::new(3);
2306        d3.push_back(1);
2307
2308        // X = None, | = lo
2309        // [|1, X, X]
2310        assert_eq!(d3.pop_front(), Some(1));
2311        // [X, |X, X]
2312        assert_eq!(d3.front(), None);
2313
2314        // [X, |3, X]
2315        d3.push_back(3);
2316        // [X, |3, 6]
2317        d3.push_back(6);
2318        // [X, X, |6]
2319        assert_eq!(d3.pop_front(), Some(3));
2320
2321        // Pushing the lo past half way point to trigger
2322        // the 'B' scenario for growth
2323        // [9, X, |6]
2324        d3.push_back(9);
2325        // [9, 12, |6]
2326        d3.push_back(12);
2327
2328        d3.push_back(15);
2329        // There used to be a bug here about how the
2330        // SliceDeque made growth assumptions about the
2331        // underlying Vec which didn't hold and lead
2332        // to corruption.
2333        // (Vec grows to next power of two)
2334        // good- [9, 12, 15, X, X, X, X, |6]
2335        // bug-  [15, 12, X, X, X, |6, X, X]
2336        assert_eq!(d3.pop_front(), Some(9));
2337
2338        // Which leads us to the following state which
2339        // would be a failure case.
2340        // bug-  [15, 12, X, X, X, X, |X, X]
2341        assert_eq!(d3.front(), Some(&12));
2342        assert_eq!(d3.capacity(), 3);
2343    }
2344
2345    #[test]
2346    fn vecdeque_iter() {
2347        let mut d = FixedSliceDeque::new(10);
2348        assert_eq!(d.iter().next(), None);
2349        assert_eq!(d.iter().size_hint(), (0, Some(0)));
2350
2351        for i in 0..5 {
2352            d.push_back(i);
2353        }
2354        {
2355            let b: &[_] = &[&0, &1, &2, &3, &4];
2356            assert_eq!(d.iter().collect::<Vec<_>>(), b);
2357        }
2358
2359        for i in 6..9 {
2360            d.push_front(i);
2361        }
2362        {
2363            let b: &[_] = &[&8, &7, &6, &0, &1, &2, &3, &4];
2364            assert_eq!(d.iter().collect::<Vec<_>>(), b);
2365        }
2366
2367        let mut it = d.iter();
2368        let mut len = d.len();
2369        loop {
2370            match it.next() {
2371                None => break,
2372                _ => {
2373                    len -= 1;
2374                    assert_eq!(it.size_hint(), (len, Some(len)))
2375                }
2376            }
2377        }
2378    }
2379
2380    #[test]
2381    fn vecdeque_rev_iter() {
2382        let mut d = FixedSliceDeque::new(10);
2383        assert_eq!(d.iter().next_back(), None);
2384
2385        for i in 0..5 {
2386            d.push_back(i);
2387        }
2388        {
2389            let b: &[_] = &[&4, &3, &2, &1, &0];
2390            assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
2391        }
2392
2393        for i in 6..9 {
2394            d.push_front(i);
2395        }
2396        let b: &[_] = &[&4, &3, &2, &1, &0, &6, &7, &8];
2397        assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
2398    }
2399
2400    #[test]
2401    fn vecdeque_mut_rev_iter_wrap() {
2402        let mut d = FixedSliceDeque::new(3);
2403        assert!(d.iter_mut().next_back().is_none());
2404
2405        d.push_back(1);
2406        d.push_back(2);
2407        d.push_back(3);
2408        assert_eq!(d.pop_front(), Some(1));
2409        d.push_back(4);
2410
2411        assert_eq!(
2412            d.iter_mut().rev().map(|x| *x).collect::<Vec<_>>(),
2413            vec![4, 3, 2]
2414        );
2415    }
2416
2417    #[test]
2418    fn vecdeque_mut_iter() {
2419        let mut d = FixedSliceDeque::new(3);
2420        assert!(d.iter_mut().next().is_none());
2421
2422        for i in 0..3 {
2423            d.push_front(i);
2424        }
2425
2426        for (i, elt) in d.iter_mut().enumerate() {
2427            assert_eq!(*elt, 2 - i);
2428            *elt = i;
2429        }
2430
2431        {
2432            let mut it = d.iter_mut();
2433            assert_eq!(*it.next().unwrap(), 0);
2434            assert_eq!(*it.next().unwrap(), 1);
2435            assert_eq!(*it.next().unwrap(), 2);
2436            assert!(it.next().is_none());
2437        }
2438    }
2439
2440    #[test]
2441    fn vecdeque_mut_rev_iter() {
2442        let mut d = FixedSliceDeque::new(3);
2443        assert!(d.iter_mut().next_back().is_none());
2444
2445        for i in 0..3 {
2446            d.push_front(i);
2447        }
2448
2449        for (i, elt) in d.iter_mut().rev().enumerate() {
2450            assert_eq!(*elt, i);
2451            *elt = i;
2452        }
2453
2454        {
2455            let mut it = d.iter_mut().rev();
2456            assert_eq!(*it.next().unwrap(), 0);
2457            assert_eq!(*it.next().unwrap(), 1);
2458            assert_eq!(*it.next().unwrap(), 2);
2459            assert!(it.next().is_none());
2460        }
2461    }
2462
2463    #[test]
2464    fn vecdeque_into_iter() {
2465        // Empty iter
2466        {
2467            let d: FixedSliceDeque<i32> = FixedSliceDeque::new(0);
2468            let mut iter = d.into_iter();
2469
2470            assert_eq!(iter.size_hint(), (0, Some(0)));
2471            assert_eq!(iter.next(), None);
2472            assert_eq!(iter.size_hint(), (0, Some(0)));
2473        }
2474
2475        // simple iter
2476        {
2477            let mut d = FixedSliceDeque::new(5);
2478            for i in 0..5 {
2479                d.push_back(i);
2480            }
2481
2482            let b = vec![0, 1, 2, 3, 4];
2483            assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
2484        }
2485
2486        // wrapped iter
2487        {
2488            let mut d = FixedSliceDeque::new(10);
2489            for i in 0..5 {
2490                d.push_back(i);
2491            }
2492            for i in 6..9 {
2493                d.push_front(i);
2494            }
2495
2496            let b = vec![8, 7, 6, 0, 1, 2, 3, 4];
2497            assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
2498        }
2499
2500        // partially used
2501        {
2502            let mut d = FixedSliceDeque::new(10);
2503            for i in 0..5 {
2504                d.push_back(i);
2505            }
2506            for i in 6..9 {
2507                d.push_front(i);
2508            }
2509
2510            let mut it = d.into_iter();
2511            assert_eq!(it.size_hint(), (8, Some(8)));
2512            assert_eq!(it.next(), Some(8));
2513            assert_eq!(it.size_hint(), (7, Some(7)));
2514            assert_eq!(it.next_back(), Some(4));
2515            assert_eq!(it.size_hint(), (6, Some(6)));
2516            assert_eq!(it.next(), Some(7));
2517            assert_eq!(it.size_hint(), (5, Some(5)));
2518        }
2519    }
2520
2521    #[test]
2522    fn vecdeque_drain() {
2523        // Empty iter
2524        {
2525            let mut d: FixedSliceDeque<i32> = FixedSliceDeque::new(0);
2526
2527            {
2528                let mut iter = d.drain(..);
2529
2530                assert_eq!(iter.size_hint(), (0, Some(0)));
2531                assert_eq!(iter.next(), None);
2532                assert_eq!(iter.size_hint(), (0, Some(0)));
2533            }
2534
2535            assert!(d.is_empty());
2536        }
2537
2538        // simple iter
2539        {
2540            let mut d = FixedSliceDeque::new(5);
2541            for i in 0..5 {
2542                d.push_back(i);
2543            }
2544
2545            assert_eq!(d.drain(..).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
2546            assert!(d.is_empty());
2547        }
2548
2549        // wrapped iter
2550        {
2551            let mut d = FixedSliceDeque::new(10);
2552            for i in 0..5 {
2553                d.push_back(i);
2554            }
2555            for i in 6..9 {
2556                d.push_front(i);
2557            }
2558
2559            assert_eq!(d.drain(..).collect::<Vec<_>>(), [8, 7, 6, 0, 1, 2, 3, 4]);
2560            assert!(d.is_empty());
2561        }
2562
2563        // partially used
2564        {
2565            let mut d: FixedSliceDeque<_> = FixedSliceDeque::new(10);
2566            for i in 0..5 {
2567                d.push_back(i);
2568            }
2569            for i in 6..9 {
2570                d.push_front(i);
2571            }
2572
2573            {
2574                let mut it = d.drain(..);
2575                assert_eq!(it.size_hint(), (8, Some(8)));
2576                assert_eq!(it.next(), Some(8));
2577                assert_eq!(it.size_hint(), (7, Some(7)));
2578                assert_eq!(it.next_back(), Some(4));
2579                assert_eq!(it.size_hint(), (6, Some(6)));
2580                assert_eq!(it.next(), Some(7));
2581                assert_eq!(it.size_hint(), (5, Some(5)));
2582            }
2583            assert!(d.is_empty());
2584        }
2585    }
2586
2587    #[test]
2588    fn deref_slice_size() {
2589        let mut deq = fsdeq![1, 2, 3, 4, 5];
2590        assert_eq!(deq.as_slice().len(), 5);
2591        assert_eq!(deq.as_mut_slice().len(), 5);
2592    }
2593}