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