slice_deque/
lib.rs

1//! A double-ended queue that `Deref`s into a slice.
2//!
3//! The double-ended queue in the standard library ([`VecDeque`]) is
4//! implemented using a growable ring buffer (`0` represents uninitialized
5//! memory, and `T` represents one element in the queue):
6//!
7//! ```rust
8//! // [ 0 | 0 | 0 | T | T | T | 0 ]
9//! //               ^:head  ^:tail
10//! ```
11//!
12//! When the queue grows beyond the end of the allocated buffer, its tail wraps
13//! around:
14//!
15//! ```rust
16//! // [ T | T | 0 | T | T | T | T ]
17//! //       ^:tail  ^:head
18//! ```
19//!
20//! As a consequence, [`VecDeque`] cannot `Deref` into a slice, since its
21//! elements do not, in general, occupy a contiguous memory region. This
22//! complicates the implementation and its interface (for example, there is no
23//! `as_slice` method, but [`as_slices`] returns a pair of slices) and has
24//! negative performance consequences (e.g. need to account for wrap around
25//! while iterating over the elements).
26//!
27//! This crates provides [`SliceDeque`], a double-ended queue implemented with
28//! a growable *virtual* ring-buffer.
29//!
30//! A virtual ring-buffer implementation is very similar to the one used in
31//! `VecDeque`. The main difference is that a virtual ring-buffer maps two
32//! adjacent regions of virtual memory to the same region of physical memory:
33//!
34//! ```rust
35//! // Virtual memory:
36//! //
37//! //  __________region_0_________ __________region_1_________
38//! // [ 0 | 0 | 0 | T | T | T | 0 | 0 | 0 | 0 | T | T | T | 0 ]
39//! //               ^:head  ^:tail
40//! //
41//! // Physical memory:
42//! //
43//! // [ 0 | 0 | 0 | T | T | T | 0 ]
44//! //               ^:head  ^:tail
45//! ```
46//!
47//! That is, both the virtual memory regions `0` and `1` above (top) map to
48//! the same physical memory (bottom). Just like `VecDeque`, when the queue
49//! grows beyond the end of the allocated physical memory region, the queue
50//! wraps around, and new elements continue to be appended at the beginning of
51//! the queue. However, because `SliceDeque` maps the physical memory to two
52//! adjacent memory regions, in virtual memory space the queue maintais the
53//! ilusion of a contiguous memory layout:
54//!
55//! ```rust
56//! // Virtual memory:
57//! //
58//! //  __________region_0_________ __________region_1_________
59//! // [ T | T | 0 | T | T | T | T | T | T | 0 | T | T | T | T ]
60//! //               ^:head              ^:tail
61//! //
62//! // Physical memory:
63//! //
64//! // [ T | T | 0 | T | T | T | T ]
65//! //       ^:tail  ^:head
66//! ```
67//!
68//! Since processes in many Operating Systems only deal with virtual memory
69//! addresses, leaving the mapping to physical memory to the CPU Memory
70//! Management Unit (MMU), [`SliceDeque`] is able to `Deref`s into a slice in
71//! those systems.
72//!
73//! This simplifies [`SliceDeque`]'s API and implementation, giving it a
74//! performance advantage over [`VecDeque`] in some situations.
75//!
76//! In general, you can think of [`SliceDeque`] as a `Vec` with `O(1)`
77//! `pop_front` and amortized `O(1)` `push_front` methods.
78//!
79//! The main drawbacks of [`SliceDeque`] are:
80//!
81//! * constrained platform support: by necessity [`SliceDeque`] must use the
82//! platform-specific virtual memory facilities of the underlying operating
83//! system. While [`SliceDeque`] can work on all major operating systems,
84//! currently only `MacOS X` is supported.
85//!
86//! * no global allocator support: since the `Alloc`ator API does not support
87//! virtual memory, to use platform-specific virtual memory support
88//! [`SliceDeque`] must bypass the global allocator and talk directly to the
89//! operating system. This can have negative performance consequences since
90//! growing [`SliceDeque`] is always going to incur the cost of some system
91//! calls.
92//!
93//! * capacity constrained by virtual memory facilities: [`SliceDeque`] must
94//! allocate two adjacent memory regions that map to the same region of
95//! physical memory. Most operating systems allow this operation to be
96//! performed exclusively on memory pages (or memory allocations that are
97//! multiples of a memory page). As a consequence, the smalles [`SliceDeque`]
98//! that can be created has typically a capacity of 2 memory pages, and it can
99//! grow only to capacities that are a multiple of a memory page.
100//!
101//! The main advantages of [`SliceDeque`] are:
102//!
103//! * nicer API: since it `Deref`s to a slice, all operations that work on
104//! slices are available for `SliceDeque`.
105//!
106//! * efficient iteration: as efficient as for slices.
107//!
108//! * simpler serialization: since one can just serialize/deserialize a single
109//! slice.
110//!
111//! All in all, if your double-ended queues are small (smaller than a memory
112//! page) or they get resized very often, `VecDeque` can perform better than
113//! [`SliceDeque`]. Otherwise, [`SliceDeque`] typically performs better (see
114//! the benchmarks), but platform support and global allocator bypass are two
115//! reasons to weight in against its usage.
116//!
117//! [`VecDeque`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html
118//! [`as_slices`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.as_slices
119//! [`SliceDeque`]: struct.SliceDeque.html
120
121#![cfg_attr(
122    feature = "unstable",
123    feature(
124        core_intrinsics,
125        exact_size_is_empty,
126        dropck_eyepatch,
127        trusted_len,
128        ptr_wrapping_offset_from,
129        specialization,
130    )
131)]
132#![cfg_attr(all(test, feature = "unstable"), feature(box_syntax))]
133#![allow(
134    clippy::len_without_is_empty,
135    clippy::shadow_reuse,
136    clippy::cast_possible_wrap,
137    clippy::cast_sign_loss,
138    clippy::cast_possible_truncation,
139    clippy::inline_always,
140    clippy::indexing_slicing
141)]
142#![cfg_attr(not(any(feature = "use_std", test)), no_std)]
143
144#[macro_use]
145mod macros;
146
147#[cfg(any(feature = "use_std", test))]
148extern crate core;
149
150#[cfg(all(
151    any(target_os = "macos", target_os = "ios"),
152    not(feature = "unix_sysv")
153))]
154extern crate mach;
155
156#[cfg(unix)]
157extern crate libc;
158
159#[cfg(target_os = "windows")]
160extern crate winapi;
161
162#[cfg(all(feature = "bytes_buf", feature = "use_std"))]
163extern crate bytes;
164
165mod mirrored;
166pub use mirrored::{AllocError, Buffer};
167
168#[cfg(all(feature = "bytes_buf", feature = "use_std"))]
169use std::io;
170
171use core::{cmp, convert, fmt, hash, iter, mem, ops, ptr, slice, str};
172
173use core::ptr::NonNull;
174
175#[cfg(feature = "unstable")]
176use core::intrinsics;
177
178/// A stable version of the `core::intrinsics` module.
179#[cfg(not(feature = "unstable"))]
180mod intrinsics {
181    /// Like `core::intrinsics::unlikely` but does nothing.
182    #[inline(always)]
183    pub unsafe fn unlikely<T>(x: T) -> T {
184        x
185    }
186
187    /// Like `core::intrinsics::assume` but does nothing.
188    #[inline(always)]
189    pub unsafe fn assume<T>(x: T) -> T {
190        x
191    }
192
193    /// Like `core::intrinsics::arith_offset` but doing pointer to integer
194    /// conversions.
195    #[inline(always)]
196    pub unsafe fn arith_offset<T>(dst: *const T, offset: isize) -> *const T {
197        let r = if offset >= 0 {
198            (dst as usize).wrapping_add(offset as usize)
199        } else {
200            (dst as usize).wrapping_sub((-offset) as usize)
201        };
202        r as *const T
203    }
204}
205
206/// Stable implementation of `.wrapping_offset_from` for pointers.
207trait WrappingOffsetFrom {
208    /// Stable implementation of `.wrapping_offset_from` for pointers.
209    fn wrapping_offset_from_(self, other: Self) -> Option<isize>;
210}
211
212#[cfg(not(feature = "unstable"))]
213impl<T: Sized> WrappingOffsetFrom for *const T {
214    #[inline(always)]
215    fn wrapping_offset_from_(self, other: Self) -> Option<isize>
216    where
217        T: Sized,
218    {
219        let size = mem::size_of::<T>();
220        if size == 0 {
221            None
222        } else {
223            let diff = (other as isize).wrapping_sub(self as isize);
224            Some(diff / size as isize)
225        }
226    }
227}
228
229#[cfg(feature = "unstable")]
230impl<T: Sized> WrappingOffsetFrom for *const T {
231    #[inline(always)]
232    fn wrapping_offset_from_(self, other: Self) -> Option<isize>
233    where
234        T: Sized,
235    {
236        let size = mem::size_of::<T>();
237        if size == 0 {
238            None
239        } else {
240            Some(other.wrapping_offset_from(self))
241        }
242    }
243}
244
245/// Is `p` in bounds of `s` ?
246///
247/// Does it point to an element of `s` ? That is, one past the end of `s` is
248/// not in bounds.
249fn in_bounds<T>(s: &[T], p: *mut T) -> bool {
250    let p = p as usize;
251    let s_begin = s.as_ptr() as usize;
252    let s_end = s_begin + mem::size_of::<T>() * s.len();
253    s_begin <= p && p < s_end
254}
255
256unsafe fn nonnull_raw_slice<T>(ptr: *mut T, len: usize) -> NonNull<[T]> {
257    NonNull::new_unchecked(slice::from_raw_parts_mut(ptr, len))
258}
259
260/// A double-ended queue that derefs into a slice.
261///
262/// It is implemented with a growable virtual ring buffer.
263pub struct SliceDeque<T> {
264    /// Elements in the queue.
265    elems_: NonNull<[T]>,
266    /// Mirrored memory buffer.
267    buf: Buffer<T>,
268}
269
270// Safe because it is possible to free this from a different thread
271unsafe impl<T> Send for SliceDeque<T> where T: Send {}
272// Safe because this doesn't use any kind of interior mutability.
273unsafe impl<T> Sync for SliceDeque<T> where T: Sync {}
274
275/// Implementation detail of the sdeq! macro.
276#[doc(hidden)]
277pub use mem::forget as __mem_forget;
278
279/// Creates a [`SliceDeque`] containing the arguments.
280///
281/// `sdeq!` allows `SliceDeque`s to be defined with the same syntax as array
282/// expressions. There are two forms of this macro:
283///
284/// - Create a [`SliceDeque`] containing a given list of elements:
285///
286/// ```
287/// # #[macro_use] extern crate slice_deque;
288/// # use slice_deque::SliceDeque;
289/// # fn main() {
290/// let v: SliceDeque<i32> = sdeq![1, 2, 3];
291/// assert_eq!(v[0], 1);
292/// assert_eq!(v[1], 2);
293/// assert_eq!(v[2], 3);
294/// # }
295/// ```
296///
297/// - Create a [`SliceDeque`] from a given element and size:
298///
299/// ```
300/// # #[macro_use] extern crate slice_deque;
301/// # use slice_deque::SliceDeque;
302/// # fn main() {
303/// let v = sdeq![7; 3];
304/// assert_eq!(v, [7, 7, 7]);
305/// # }
306/// ```
307///
308/// Note that unlike array expressions this syntax supports all elements
309/// which implement `Clone` and the number of elements doesn't have to be
310/// a constant.
311///
312/// This will use `clone` to duplicate an expression, so one should be careful
313/// using this with types having a nonstandard `Clone` implementation. For
314/// example, `sdeq![Rc::new(1); 5]` will create a deque of five references
315/// to the same boxed integer value, not five references pointing to
316/// independently boxed integers.
317///
318/// ```
319/// # #[macro_use] extern crate slice_deque;
320/// # use slice_deque::SliceDeque;
321/// # use std::rc::Rc;
322/// # fn main() {
323/// let v = sdeq![Rc::new(1_i32); 5];
324/// let ptr: *const i32 = &*v[0] as *const i32;
325/// for i in v.iter() {
326///     assert_eq!(Rc::into_raw(i.clone()), ptr);
327/// }
328/// # }
329/// ```
330///
331/// [`SliceDeque`]: struct.SliceDeque.html
332#[macro_export]
333macro_rules! sdeq {
334    ($elem:expr; $n:expr) => (
335        {
336            let mut deq = $crate::SliceDeque::with_capacity($n);
337            deq.resize($n, $elem);
338            deq
339        }
340    );
341    () => ( $crate::SliceDeque::new() );
342    ($($x:expr),*) => (
343        {
344            unsafe {
345                let array = [$($x),*];
346                let deq = $crate::SliceDeque::steal_from_slice(&array);
347                #[allow(clippy::forget_copy)]
348                $crate::__mem_forget(array);
349                deq
350            }
351        }
352    );
353    ($($x:expr,)*) => (sdeq![$($x),*])
354}
355
356impl<T> SliceDeque<T> {
357    /// Creates a new empty deque.
358    ///
359    /// # Examples
360    ///
361    /// ```rust
362    /// # use slice_deque::SliceDeque;
363    /// let deq = SliceDeque::new();
364    /// # let o: SliceDeque<u32> = deq;
365    /// ```
366    #[inline]
367    pub fn new() -> Self {
368        unsafe {
369            let buf = Buffer::new();
370            Self {
371                elems_: nonnull_raw_slice(buf.ptr(), 0),
372                buf,
373            }
374        }
375    }
376
377    /// Creates a SliceDeque from its raw components.
378    ///
379    /// The `ptr` must be a pointer to the beginning of the memory buffer from
380    /// another `SliceDeque`, `capacity` the capacity of this `SliceDeque`, and
381    /// `elems` the elements of this `SliceDeque`.
382    #[inline]
383    pub unsafe fn from_raw_parts(
384        ptr: *mut T, capacity: usize, elems: &mut [T],
385    ) -> Self {
386        let begin = elems.as_mut_ptr();
387        debug_assert!(in_bounds(slice::from_raw_parts(ptr, capacity), begin));
388        debug_assert!(elems.len() < capacity);
389
390        Self {
391            elems_: NonNull::new_unchecked(elems),
392            buf: Buffer::from_raw_parts(ptr, capacity * 2),
393        }
394    }
395
396    /// Create an empty deque with capacity to hold `n` elements.
397    ///
398    /// # Examples
399    ///
400    /// ```rust
401    /// # use slice_deque::SliceDeque;
402    /// let deq = SliceDeque::with_capacity(10);
403    /// # let o: SliceDeque<u32> = deq;
404    /// ```
405    #[inline]
406    pub fn with_capacity(n: usize) -> Self {
407        unsafe {
408            let buf = Buffer::uninitialized(2 * n).unwrap_or_else(|e| {
409                let s = tiny_str!(
410                    "failed to allocate a buffer with capacity \"{}\" due to \"{:?}\"",
411                    n, e
412                );
413                panic!("{}", s.as_str())
414            });
415            Self {
416                elems_: nonnull_raw_slice(buf.ptr(), 0),
417                buf,
418            }
419        }
420    }
421
422    /// Returns the number of elements that the deque can hold without
423    /// reallocating.
424    ///
425    /// # Examples
426    ///
427    /// ```rust
428    /// # use slice_deque::SliceDeque;
429    /// let deq = SliceDeque::with_capacity(10);
430    /// assert!(deq.capacity() >= 10);
431    /// # let o: SliceDeque<u32> = deq;
432    /// ```
433    #[inline]
434    pub fn capacity(&self) -> usize {
435        // Note: the buffer length is not necessarily a power of two
436        // debug_assert!(self.buf.len() % 2 == 0);
437        self.buf.len() / 2
438    }
439
440    /// Number of elements in the ring buffer.
441    ///
442    /// # Examples
443    ///
444    /// ```rust
445    /// # use slice_deque::SliceDeque;
446    /// let mut deq = SliceDeque::with_capacity(10);
447    /// assert!(deq.len() == 0);
448    /// deq.push_back(3);
449    /// assert!(deq.len() == 1);
450    /// ```
451    #[inline]
452    pub fn len(&self) -> usize {
453        let l = self.as_slice().len();
454        debug_assert!(l <= self.capacity());
455        l
456    }
457
458    /// Is the ring buffer full ?
459    ///
460    /// # Examples
461    ///
462    /// ```rust
463    /// # use slice_deque::SliceDeque;
464    /// let mut deq = SliceDeque::with_capacity(10);
465    /// assert!(!deq.is_full());
466    /// # let o: SliceDeque<u32> = deq;
467    /// ```
468    #[inline]
469    pub fn is_full(&self) -> bool {
470        self.len() == self.capacity()
471    }
472
473    /// Extracts a slice containing the entire deque.
474    #[inline]
475    pub fn as_slice(&self) -> &[T] {
476        unsafe { self.elems_.as_ref() }
477    }
478
479    /// Extracts a mutable slice containing the entire deque.
480    #[inline]
481    pub fn as_mut_slice(&mut self) -> &mut [T] {
482        unsafe { self.elems_.as_mut() }
483    }
484
485    /// Returns a pair of slices, where the first slice contains the contents
486    /// of the deque and the second one is empty.
487    #[inline]
488    pub fn as_slices(&self) -> (&[T], &[T]) {
489        unsafe {
490            let left = self.as_slice();
491            let right =
492                slice::from_raw_parts(usize::max_value() as *const _, 0);
493            (left, right)
494        }
495    }
496
497    /// Returns a pair of slices, where the first slice contains the contents
498    /// of the deque and the second one is empty.
499    #[inline]
500    pub fn as_mut_slices(&mut self) -> (&mut [T], &mut [T]) {
501        unsafe {
502            let left = self.as_mut_slice();
503            let right =
504                slice::from_raw_parts_mut(usize::max_value() as *mut _, 0);
505            (left, right)
506        }
507    }
508
509    /// Returns the slice of uninitialized memory between the `tail` and the
510    /// `begin`.
511    ///
512    /// # Examples
513    ///
514    /// ```
515    /// # #[macro_use] extern crate slice_deque;
516    /// # fn main() {
517    /// let mut d = sdeq![1, 2, 3];
518    /// let cap = d.capacity();
519    /// let len = d.len();
520    /// unsafe {
521    ///     {
522    ///         // This slice contains the uninitialized elements in
523    ///         // the deque:
524    ///         let mut s = d.tail_head_slice();
525    ///         assert_eq!(s.len(), cap - len);
526    ///         // We can write to them and for example bump the tail of
527    ///         // the deque:
528    ///         s[0] = 4;
529    ///         s[1] = 5;
530    ///     }
531    ///     d.move_tail(2);
532    /// }
533    /// assert_eq!(d, sdeq![1, 2, 3, 4, 5]);
534    /// # }
535    /// ```
536    pub unsafe fn tail_head_slice(&mut self) -> &mut [T] {
537        let ptr = self.as_mut_slice().as_mut_ptr().add(self.len());
538        slice::from_raw_parts_mut(ptr, self.capacity() - self.len())
539    }
540
541    /// Attempts to reserve capacity for inserting at least `additional`
542    /// elements without reallocating. Does nothing if the capacity is already
543    /// sufficient.
544    ///
545    /// The collection always reserves memory in multiples of the page size.
546    ///
547    /// # Panics
548    ///
549    /// Panics if the new capacity overflows `usize`.
550    #[inline]
551    pub fn try_reserve(
552        &mut self, additional: usize,
553    ) -> Result<(), AllocError> {
554        let old_len = self.len();
555        let new_cap = self.grow_policy(additional);
556        self.reserve_capacity(new_cap)?;
557        debug_assert!(self.capacity() >= old_len + additional);
558        Ok(())
559    }
560
561    /// Reserves capacity for inserting at least `additional` elements without
562    /// reallocating. Does nothing if the capacity is already sufficient.
563    ///
564    /// The collection always reserves memory in multiples of the page size.
565    ///
566    /// # Panics
567    ///
568    /// Panics if the new capacity overflows `usize` or on OOM.
569    #[inline]
570    pub fn reserve(&mut self, additional: usize) {
571        self.try_reserve(additional).unwrap();
572    }
573
574    /// Attempts to reserve capacity for `new_capacity` elements. Does nothing
575    /// if the capacity is already sufficient.
576    #[inline]
577    fn reserve_capacity(
578        &mut self, new_capacity: usize,
579    ) -> Result<(), AllocError> {
580        unsafe {
581            if new_capacity <= self.capacity() {
582                return Ok(());
583            }
584
585            let mut new_buffer = Buffer::uninitialized(2 * new_capacity)?;
586            debug_assert!(new_buffer.len() >= 2 * new_capacity);
587
588            let len = self.len();
589            // Move the elements from the current buffer
590            // to the beginning of the new buffer:
591            {
592                let from_ptr = self.as_mut_ptr();
593                let to_ptr = new_buffer.as_mut_slice().as_mut_ptr();
594                crate::ptr::copy_nonoverlapping(from_ptr, to_ptr, len);
595            }
596
597            // Exchange buffers
598            crate::mem::swap(&mut self.buf, &mut new_buffer);
599
600            // Correct the slice - we copied to the
601            // beginning of the of the new buffer:
602            self.elems_ = nonnull_raw_slice(self.buf.ptr(), len);
603            Ok(())
604        }
605    }
606
607    /// Reserves the minimum capacity for exactly `additional` more elements to
608    /// be inserted in the given `SliceDeq<T>`. After calling `reserve_exact`,
609    /// capacity will be greater than or equal to `self.len() + additional`.
610    /// Does nothing if the capacity is already sufficient.
611    ///
612    /// Note that the allocator may give the collection more space than it
613    /// requests. Therefore capacity can not be relied upon to be precisely
614    /// minimal. Prefer `reserve` if future insertions are expected.
615    ///
616    /// # Panics
617    ///
618    /// Panics if the new capacity overflows `usize`.
619    ///
620    /// # Examples
621    ///
622    /// ```
623    /// # #[macro_use] extern crate slice_deque;
624    /// # fn main() {
625    /// let mut deq = sdeq![1];
626    /// deq.reserve_exact(10);
627    /// assert!(deq.capacity() >= 11);
628    /// # }
629    /// ```
630    #[inline]
631    pub fn reserve_exact(&mut self, additional: usize) {
632        let old_len = self.len();
633        let new_cap = old_len.checked_add(additional).expect("overflow");
634        self.reserve_capacity(new_cap).unwrap();
635        debug_assert!(self.capacity() >= old_len + additional);
636    }
637
638    /// Growth policy of the deque. The capacity is going to be a multiple of
639    /// the page-size anyways, so we just double capacity when needed.
640    #[inline]
641    fn grow_policy(&self, additional: usize) -> usize {
642        let cur_cap = self.capacity();
643        let old_len = self.len();
644        let req_cap = old_len.checked_add(additional).expect("overflow");
645        if req_cap > cur_cap {
646            let dbl_cap = cur_cap.saturating_mul(2);
647            cmp::max(req_cap, dbl_cap)
648        } else {
649            req_cap
650        }
651    }
652
653    /// Moves the deque head by `x`.
654    ///
655    /// # Panics
656    ///
657    /// If the head wraps over the tail the behavior is undefined, that is,
658    /// if `x` is out-of-range `[-(capacity() - len()), len()]`.
659    ///
660    /// If `-C debug-assertions=1` violating this pre-condition `panic!`s.
661    ///
662    /// # Unsafe
663    ///
664    /// It does not `drop` nor initialize elements, it just moves where the
665    /// tail of the deque points to within the allocated buffer.
666    #[inline]
667    pub unsafe fn move_head_unchecked(&mut self, x: isize) {
668        let cap = self.capacity();
669        let len = self.len();
670        // Make sure that the begin does not wrap over the end:
671        debug_assert!(x >= -((cap - len) as isize));
672        debug_assert!(x <= len as isize);
673
674        // Obtain the begin of the slice and offset it by x:
675        let mut new_begin = self.as_mut_ptr().offset(x) as usize;
676
677        // Compute the boundaries of the first and second memory regions:
678        let first_region_begin = self.buf.ptr() as usize;
679        let region_size = Buffer::<T>::size_in_bytes(self.buf.len()) / 2;
680        debug_assert!(cap * mem::size_of::<T>() <= region_size);
681        let second_region_begin = first_region_begin + region_size;
682
683        // If the new begin is not inside the first memory region, we shift it
684        // by the region size into it:
685        if new_begin < first_region_begin {
686            new_begin += region_size;
687        } else if new_begin >= second_region_begin {
688            // Should be within the second region:
689            debug_assert!(new_begin < second_region_begin + region_size);
690            new_begin -= region_size;
691        }
692        debug_assert!(new_begin >= first_region_begin);
693        debug_assert!(new_begin < second_region_begin);
694
695        // The new begin is now in the first memory region:
696        let new_begin = new_begin as *mut T;
697        debug_assert!(in_bounds(
698            slice::from_raw_parts(self.buf.ptr() as *mut u8, region_size),
699            new_begin as *mut u8
700        ));
701
702        let new_len = len as isize - x;
703        debug_assert!(
704            new_len >= 0,
705            "len = {}, x = {}, new_len = {}",
706            len,
707            x,
708            new_len
709        );
710        debug_assert!(new_len <= cap as isize);
711        self.elems_ = nonnull_raw_slice(new_begin, new_len as usize);
712    }
713
714    /// Moves the deque head by `x`.
715    ///
716    /// # Panics
717    ///
718    /// If the `head` wraps over the `tail`, that is, if `x` is out-of-range
719    /// `[-(capacity() - len()), len()]`.
720    ///
721    /// # Unsafe
722    ///
723    /// It does not `drop` nor initialize elements, it just moves where the
724    /// tail of the deque points to within the allocated buffer.
725    #[inline]
726    pub unsafe fn move_head(&mut self, x: isize) {
727        assert!(
728            x >= -((self.capacity() - self.len()) as isize)
729                && x <= self.len() as isize
730        );
731        self.move_head_unchecked(x)
732    }
733
734    /// Moves the deque tail by `x`.
735    ///
736    /// # Panics
737    ///
738    /// If the `tail` wraps over the `head` the behavior is undefined, that is,
739    /// if `x` is out-of-range `[-len(), capacity() - len()]`.
740    ///
741    /// If `-C debug-assertions=1` violating this pre-condition `panic!`s.
742    ///
743    /// # Unsafe
744    ///
745    /// It does not `drop` nor initialize elements, it just moves where the
746    /// tail of the deque points to within the allocated buffer.
747    #[inline]
748    pub unsafe fn move_tail_unchecked(&mut self, x: isize) {
749        // Make sure that the end does not wrap over the begin:
750        let len = self.len();
751        let cap = self.capacity();
752        debug_assert!(x >= -(len as isize));
753        debug_assert!(x <= (cap - len) as isize);
754
755        let new_len = len as isize + x;
756        debug_assert!(new_len >= 0);
757        debug_assert!(new_len <= cap as isize);
758
759        self.elems_ = nonnull_raw_slice(self.as_mut_ptr(), new_len as usize);
760    }
761
762    /// Moves the deque tail by `x`.
763    ///
764    /// # Panics
765    ///
766    /// If the `tail` wraps over the `head`, that is, if `x` is out-of-range
767    /// `[-len(), capacity() - len()]`.
768    ///
769    /// # Unsafe
770    ///
771    /// It does not `drop` nor initialize elements, it just moves where the
772    /// tail of the deque points to within the allocated buffer.
773    #[inline]
774    pub unsafe fn move_tail(&mut self, x: isize) {
775        assert!(
776            x >= -(self.len() as isize)
777                && x <= (self.capacity() - self.len()) as isize
778        );
779        self.move_tail_unchecked(x);
780    }
781
782    /// Appends elements to `self` from `other`.
783    #[inline]
784    unsafe fn append_elements(&mut self, other: *const [T]) {
785        let count = (*other).len();
786        self.reserve(count);
787        let len = self.len();
788        ptr::copy_nonoverlapping(
789            other as *const T,
790            self.get_unchecked_mut(len),
791            count,
792        );
793        self.move_tail_unchecked(count as isize);
794    }
795
796    /// Steal the elements from the slice `s`. You should `mem::forget` the
797    /// slice afterwards.
798    pub unsafe fn steal_from_slice(s: &[T]) -> Self {
799        let mut deq = Self::new();
800        deq.append_elements(s as *const _);
801        deq
802    }
803
804    /// Moves all the elements of `other` into `Self`, leaving `other` empty.
805    ///
806    /// # Panics
807    ///
808    /// Panics if the number of elements in the deque overflows a `isize`.
809    ///
810    /// # Examples
811    ///
812    /// ```
813    /// # #[macro_use] extern crate slice_deque;
814    /// # use slice_deque::SliceDeque;
815    /// # fn main() {
816    /// let mut deq = sdeq![1, 2, 3];
817    /// let mut deq2 = sdeq![4, 5, 6];
818    /// deq.append(&mut deq2);
819    /// assert_eq!(deq, [1, 2, 3, 4, 5, 6]);
820    /// assert_eq!(deq2, []);
821    /// # }
822    /// ```
823    #[inline]
824    pub fn append(&mut self, other: &mut Self) {
825        unsafe {
826            self.append_elements(other.as_slice() as _);
827            other.elems_ = nonnull_raw_slice(other.buf.ptr(), 0);
828        }
829    }
830
831    /// Provides a reference to the first element, or `None` if the deque is
832    /// empty.
833    ///
834    /// # Examples
835    ///
836    /// ```
837    /// # use slice_deque::SliceDeque;
838    /// let mut deq = SliceDeque::new();
839    /// assert_eq!(deq.front(), None);
840    ///
841    /// deq.push_back(1);
842    /// deq.push_back(2);
843    /// assert_eq!(deq.front(), Some(&1));
844    /// deq.push_front(3);
845    /// assert_eq!(deq.front(), Some(&3));
846    /// ```
847    #[inline]
848    pub fn front(&self) -> Option<&T> {
849        self.get(0)
850    }
851
852    /// Provides a mutable reference to the first element, or `None` if the
853    /// deque is empty.
854    ///
855    /// # Examples
856    ///
857    /// ```
858    /// # use slice_deque::SliceDeque;
859    /// let mut deq = SliceDeque::new();
860    /// assert_eq!(deq.front(), None);
861    ///
862    /// deq.push_back(1);
863    /// deq.push_back(2);
864    /// assert_eq!(deq.front(), Some(&1));
865    /// (*deq.front_mut().unwrap()) = 3;
866    /// assert_eq!(deq.front(), Some(&3));
867    /// ```
868    #[inline]
869    pub fn front_mut(&mut self) -> Option<&mut T> {
870        self.get_mut(0)
871    }
872
873    /// Provides a reference to the last element, or `None` if the deque is
874    /// empty.
875    ///
876    /// # Examples
877    ///
878    /// ```
879    /// # use slice_deque::SliceDeque;
880    /// let mut deq = SliceDeque::new();
881    /// assert_eq!(deq.back(), None);
882    ///
883    /// deq.push_back(1);
884    /// deq.push_back(2);
885    /// assert_eq!(deq.back(), Some(&2));
886    /// deq.push_front(3);
887    /// assert_eq!(deq.back(), Some(&2));
888    /// ```
889    #[inline]
890    pub fn back(&self) -> Option<&T> {
891        let last_idx = self.len().wrapping_sub(1);
892        self.get(last_idx)
893    }
894
895    /// Provides a mutable reference to the last element, or `None` if the
896    /// deque is empty.
897    ///
898    /// # Examples
899    ///
900    /// ```
901    /// # use slice_deque::SliceDeque;
902    /// let mut deq = SliceDeque::new();
903    /// assert_eq!(deq.front(), None);
904    ///
905    /// deq.push_back(1);
906    /// deq.push_back(2);
907    /// assert_eq!(deq.back(), Some(&2));
908    /// (*deq.back_mut().unwrap()) = 3;
909    /// assert_eq!(deq.back(), Some(&3));
910    /// ```
911    #[inline]
912    pub fn back_mut(&mut self) -> Option<&mut T> {
913        let last_idx = self.len().wrapping_sub(1);
914        self.get_mut(last_idx)
915    }
916
917    /// Attempts to prepend `value` to the deque.
918    ///
919    /// # Examples
920    ///
921    /// ```rust
922    /// # use slice_deque::SliceDeque;
923    /// let mut deq = SliceDeque::new();
924    /// deq.try_push_front(1).unwrap();
925    /// deq.try_push_front(2).unwrap();
926    /// assert_eq!(deq.front(), Some(&2));
927    /// ```
928    #[inline]
929    pub fn try_push_front(&mut self, value: T) -> Result<(), (T, AllocError)> {
930        unsafe {
931            if intrinsics::unlikely(self.is_full()) {
932                if let Err(e) = self.try_reserve(1) {
933                    return Err((value, e));
934                }
935            }
936
937            self.move_head_unchecked(-1);
938            ptr::write(self.get_mut(0).unwrap(), value);
939            Ok(())
940        }
941    }
942
943    /// Prepends `value` to the deque.
944    ///
945    /// # Panics
946    ///
947    /// On OOM.
948    ///
949    /// # Examples
950    ///
951    /// ```rust
952    /// # use slice_deque::SliceDeque;
953    /// let mut deq = SliceDeque::new();
954    /// deq.push_front(1);
955    /// deq.push_front(2);
956    /// assert_eq!(deq.front(), Some(&2));
957    /// ```
958    #[inline]
959    pub fn push_front(&mut self, value: T) {
960        if let Err(e) = self.try_push_front(value) {
961            panic!("{:?}", e.1);
962        }
963    }
964
965    /// Attempts to appends `value` to the deque.
966    ///
967    /// # Examples
968    ///
969    /// ```rust
970    /// # use slice_deque::SliceDeque;
971    /// let mut deq = SliceDeque::new();
972    /// deq.try_push_back(1).unwrap();
973    /// deq.try_push_back(3).unwrap();
974    /// assert_eq!(deq.back(), Some(&3));
975    /// ```
976    #[inline]
977    pub fn try_push_back(&mut self, value: T) -> Result<(), (T, AllocError)> {
978        unsafe {
979            if intrinsics::unlikely(self.is_full()) {
980                if let Err(e) = self.try_reserve(1) {
981                    return Err((value, e));
982                }
983            }
984            self.move_tail_unchecked(1);
985            let len = self.len();
986            ptr::write(self.get_mut(len - 1).unwrap(), value);
987            Ok(())
988        }
989    }
990
991    /// Appends `value` to the deque.
992    ///
993    /// # Panics
994    ///
995    /// On OOM.
996    ///
997    /// # Examples
998    ///
999    /// ```rust
1000    /// # use slice_deque::SliceDeque;
1001    /// let mut deq = SliceDeque::new();
1002    /// deq.push_back(1);
1003    /// deq.push_back(3);
1004    /// assert_eq!(deq.back(), Some(&3));
1005    /// ```
1006    #[inline]
1007    pub fn push_back(&mut self, value: T) {
1008        if let Err(e) = self.try_push_back(value) {
1009            panic!("{:?}", e.1);
1010        }
1011    }
1012
1013    /// Removes the first element and returns it, or `None` if the deque is
1014    /// empty.
1015    ///
1016    /// # Examples
1017    ///
1018    /// ```
1019    /// # use slice_deque::SliceDeque;
1020    /// let mut deq = SliceDeque::new();
1021    /// assert_eq!(deq.pop_front(), None);
1022    ///
1023    /// deq.push_back(1);
1024    /// deq.push_back(2);
1025    ///
1026    /// assert_eq!(deq.pop_front(), Some(1));
1027    /// assert_eq!(deq.pop_front(), Some(2));
1028    /// assert_eq!(deq.pop_front(), None);
1029    /// ```
1030    #[inline]
1031    pub fn pop_front(&mut self) -> Option<T> {
1032        unsafe {
1033            let v = match self.get_mut(0) {
1034                None => return None,
1035                Some(v) => ptr::read(v),
1036            };
1037            self.move_head_unchecked(1);
1038            Some(v)
1039        }
1040    }
1041
1042    /// Removes the last element from the deque and returns it, or `None` if it
1043    /// is empty.
1044    ///
1045    /// # Examples
1046    ///
1047    /// ```
1048    /// # use slice_deque::SliceDeque;
1049    /// let mut deq = SliceDeque::new();
1050    /// assert_eq!(deq.pop_back(), None);
1051    ///
1052    /// deq.push_back(1);
1053    /// deq.push_back(3);
1054    ///
1055    /// assert_eq!(deq.pop_back(), Some(3));
1056    /// assert_eq!(deq.pop_back(), Some(1));
1057    /// assert_eq!(deq.pop_back(), None);
1058    /// ```
1059    #[inline]
1060    pub fn pop_back(&mut self) -> Option<T> {
1061        unsafe {
1062            let len = self.len();
1063            let v = match self.get_mut(len.wrapping_sub(1)) {
1064                None => return None,
1065                Some(v) => ptr::read(v),
1066            };
1067            self.move_tail_unchecked(-1);
1068            Some(v)
1069        }
1070    }
1071
1072    /// Shrinks the capacity of the deque as much as possible.
1073    ///
1074    /// It will drop down as close as possible to the length, but because
1075    /// `SliceDeque` allocates memory in multiples of the page size the deque
1076    /// might still have capacity for inserting new elements without
1077    /// reallocating.
1078    ///
1079    /// # Examples
1080    ///
1081    /// ```rust
1082    /// # use slice_deque::SliceDeque;
1083    /// let mut deq = SliceDeque::with_capacity(15);
1084    /// deq.extend(0..4);
1085    /// assert!(deq.capacity() >= 15);
1086    /// deq.shrink_to_fit();
1087    /// assert!(deq.capacity() >= 4);
1088    /// # let o: SliceDeque<u32> = deq;
1089    /// ```
1090    #[inline]
1091    pub fn shrink_to_fit(&mut self) {
1092        if unsafe { intrinsics::unlikely(self.is_empty()) } {
1093            return;
1094        }
1095
1096        // FIXME: we should compute the capacity and only allocate a shrunk
1097        // deque if that's worth it.
1098        let mut new_sdeq = Self::with_capacity(self.len());
1099        if new_sdeq.capacity() < self.capacity() {
1100            unsafe {
1101                crate::ptr::copy_nonoverlapping(
1102                    self.as_mut_ptr(),
1103                    new_sdeq.as_mut_ptr(),
1104                    self.len(),
1105                );
1106                new_sdeq.elems_ =
1107                    nonnull_raw_slice(new_sdeq.buf.ptr(), self.len());
1108                mem::swap(self, &mut new_sdeq);
1109            }
1110        }
1111    }
1112
1113    /// Shortens the deque by removing excess elements from the back.
1114    ///
1115    /// If `len` is greater than the SliceDeque's current length, this has no
1116    /// effect.
1117    ///
1118    /// # Examples
1119    ///
1120    /// ```rust
1121    /// # #[macro_use] extern crate slice_deque;
1122    /// # use slice_deque::SliceDeque;
1123    /// # fn main() {
1124    /// let mut deq = sdeq![5, 10, 15];
1125    /// assert_eq!(deq, [5, 10, 15]);
1126    /// deq.truncate_back(1);
1127    /// assert_eq!(deq, [5]);
1128    /// # }
1129    /// ```
1130    #[inline]
1131    pub fn truncate_back(&mut self, len: usize) {
1132        unsafe {
1133            if len >= self.len() {
1134                return;
1135            }
1136
1137            let diff = self.len() - len;
1138            let s = &mut self[len..] as *mut [_];
1139            // decrement tail before the drop_in_place(), so a panic on
1140            // Drop doesn't re-drop the just-failed value.
1141            self.move_tail(-(diff as isize));
1142            ptr::drop_in_place(&mut *s);
1143            debug_assert_eq!(self.len(), len);
1144        }
1145    }
1146
1147    /// Shortens the deque by removing excess elements from the back.
1148    ///
1149    /// If `len` is greater than the SliceDeque's current length, this has no
1150    /// effect. See `truncate_back` for examples.
1151    #[inline]
1152    pub fn truncate(&mut self, len: usize) {
1153        self.truncate_back(len);
1154    }
1155
1156    /// Shortens the deque by removing excess elements from the front.
1157    ///
1158    /// If `len` is greater than the SliceDeque's current length, this has no
1159    /// effect.
1160    ///
1161    /// # Examples
1162    ///
1163    /// ```rust
1164    /// # #[macro_use] extern crate slice_deque;
1165    /// # use slice_deque::SliceDeque;
1166    /// # fn main() {
1167    /// let mut deq = sdeq![5, 10, 15];
1168    /// assert_eq!(deq, [5, 10, 15]);
1169    /// deq.truncate_front(1);
1170    /// assert_eq!(deq, [15]);
1171    /// # }
1172    /// ```
1173    #[inline]
1174    pub fn truncate_front(&mut self, len: usize) {
1175        unsafe {
1176            if len >= self.len() {
1177                return;
1178            }
1179
1180            let diff = self.len() - len;
1181            let s = &mut self[..diff] as *mut [_];
1182            // increment head before the drop_in_place(), so a panic on
1183            // Drop doesn't re-drop the just-failed value.
1184            self.move_head(diff as isize);
1185            ptr::drop_in_place(&mut *s);
1186            debug_assert_eq!(self.len(), len);
1187        }
1188    }
1189
1190    /// Creates a draining iterator that removes the specified range in the
1191    /// deque and yields the removed items.
1192    ///
1193    /// Note 1: The element range is removed even if the iterator is only
1194    /// partially consumed or not consumed at all.
1195    ///
1196    /// Note 2: It is unspecified how many elements are removed from the deque
1197    /// if the `Drain` value is leaked.
1198    ///
1199    /// # Panics
1200    ///
1201    /// Panics if the starting point is greater than the end point or if
1202    /// the end point is greater than the length of the deque.
1203    ///
1204    /// # Examples
1205    ///
1206    /// ```
1207    /// # #[macro_use] extern crate slice_deque;
1208    /// # use slice_deque::SliceDeque;
1209    /// # fn main() {
1210    /// let mut deq = sdeq![1, 2, 3];
1211    /// let u: Vec<_> = deq.drain(1..).collect();
1212    /// assert_eq!(deq, &[1]);
1213    /// assert_eq!(u, &[2, 3]);
1214    ///
1215    /// // A full range clears the deque
1216    /// deq.drain(..);
1217    /// assert_eq!(deq, &[]);
1218    /// # }
1219    /// ```
1220    #[inline]
1221    #[allow(clippy::needless_pass_by_value)]
1222    pub fn drain<R>(&mut self, range: R) -> Drain<T>
1223    where
1224        R: ops::RangeBounds<usize>,
1225    {
1226        use ops::Bound::{Excluded, Included, Unbounded};
1227        // Memory safety
1228        //
1229        // When the Drain is first created, it shortens the length of
1230        // the source deque to make sure no uninitalized or moved-from
1231        // elements are accessible at all if the Drain's destructor
1232        // never gets to run.
1233        //
1234        // Drain will ptr::read out the values to remove.
1235        // When finished, remaining tail of the deque is copied back to cover
1236        // the hole, and the deque length is restored to the new length.
1237        //
1238        let len = self.len();
1239        let start = match range.start_bound() {
1240            Included(&n) => n,
1241            Excluded(&n) => n + 1,
1242            Unbounded => 0,
1243        };
1244        let end = match range.end_bound() {
1245            Included(&n) => n + 1,
1246            Excluded(&n) => n,
1247            Unbounded => len,
1248        };
1249        assert!(start <= end);
1250        assert!(end <= len);
1251
1252        unsafe {
1253            // set self.deq length's to start, to be safe in case Drain is
1254            // leaked
1255            self.elems_ = nonnull_raw_slice(self.as_mut_ptr(), start);
1256            // Use the borrow in the IterMut to indicate borrowing behavior of
1257            // the whole Drain iterator (like &mut T).
1258            let range_slice = slice::from_raw_parts_mut(
1259                if mem::size_of::<T>() == 0 {
1260                    intrinsics::arith_offset(
1261                        self.as_mut_ptr() as *mut i8,
1262                        start as _,
1263                    ) as *mut _
1264                } else {
1265                    self.as_mut_ptr().add(start)
1266                },
1267                end - start,
1268            );
1269            Drain {
1270                tail_start: end,
1271                tail_len: len - end,
1272                iter: range_slice.iter(),
1273                deq: NonNull::from(self),
1274            }
1275        }
1276    }
1277
1278    /// Removes all values from the deque.
1279    ///
1280    /// # Examples
1281    ///
1282    /// ```rust
1283    /// # #[macro_use] extern crate slice_deque;
1284    /// # use slice_deque::SliceDeque;
1285    /// # fn main() {
1286    /// let mut deq = sdeq![1];
1287    /// assert!(!deq.is_empty());
1288    /// deq.clear();
1289    /// assert!(deq.is_empty());
1290    /// # }
1291    /// ```
1292    #[inline]
1293    pub fn clear(&mut self) {
1294        self.truncate(0);
1295    }
1296
1297    /// Removes the element at `index` and return it in `O(1)` by swapping the
1298    /// last element into its place.
1299    ///
1300    /// # Examples
1301    ///
1302    /// ```rust
1303    /// # use slice_deque::SliceDeque;
1304    /// let mut deq = SliceDeque::new();
1305    /// assert_eq!(deq.swap_remove_back(0), None);
1306    /// deq.extend(1..4);
1307    /// assert_eq!(deq, [1, 2, 3]);
1308    ///
1309    /// assert_eq!(deq.swap_remove_back(0), Some(1));
1310    /// assert_eq!(deq, [3, 2]);
1311    /// ```
1312    #[inline]
1313    pub fn swap_remove_back(&mut self, index: usize) -> Option<T> {
1314        let len = self.len();
1315        if self.is_empty() {
1316            None
1317        } else {
1318            self.swap(index, len - 1);
1319            self.pop_back()
1320        }
1321    }
1322
1323    /// Removes the element at `index` and returns it in `O(1)` by swapping the
1324    /// first element into its place.
1325    ///
1326    /// # Examples
1327    ///
1328    /// ```
1329    /// # use slice_deque::SliceDeque;
1330    /// let mut deq = SliceDeque::new();
1331    /// assert_eq!(deq.swap_remove_front(0), None);
1332    /// deq.extend(1..4);
1333    /// assert_eq!(deq, [1, 2, 3]);
1334    ///
1335    /// assert_eq!(deq.swap_remove_front(2), Some(3));
1336    /// assert_eq!(deq, [2, 1]);
1337    /// ```
1338    #[inline]
1339    pub fn swap_remove_front(&mut self, index: usize) -> Option<T> {
1340        if self.is_empty() {
1341            None
1342        } else {
1343            self.swap(index, 0);
1344            self.pop_front()
1345        }
1346    }
1347
1348    /// Inserts an `element` at `index` within the deque, shifting all elements
1349    /// with indices greater than or equal to `index` towards the back.
1350    ///
1351    /// Element at index 0 is the front of the queue.
1352    ///
1353    /// # Panics
1354    ///
1355    /// Panics if `index` is greater than deque's length
1356    ///
1357    /// # Examples
1358    ///
1359    /// ```
1360    /// # #[macro_use] extern crate slice_deque;
1361    /// # use slice_deque::SliceDeque;
1362    /// # fn main() {
1363    /// let mut deq = sdeq!['a', 'b', 'c'];
1364    /// assert_eq!(deq, &['a', 'b', 'c']);
1365    ///
1366    /// deq.insert(1, 'd');
1367    /// assert_eq!(deq, &['a', 'd', 'b', 'c']);
1368    /// # }
1369    /// ```
1370    #[inline]
1371    pub fn insert(&mut self, index: usize, element: T) {
1372        unsafe {
1373            let len = self.len();
1374            assert!(index <= len);
1375
1376            if intrinsics::unlikely(self.is_full()) {
1377                self.reserve(1);
1378                // TODO: when the deque needs to grow, reserve should
1379                // copy the memory to the new storage leaving a whole
1380                // at the index where the new elements are to be inserted
1381                // to avoid having to copy the memory again
1382            }
1383
1384            let p = if index > self.len() / 2 {
1385                let p = self.as_mut_ptr().add(index);
1386                // Shift elements towards the back
1387                ptr::copy(p, p.add(1), len - index);
1388                self.move_tail_unchecked(1);
1389                p
1390            } else {
1391                // Shift elements towards the front
1392                self.move_head_unchecked(-1);
1393                let p = self.as_mut_ptr().add(index);
1394                ptr::copy(p, p.sub(1), index);
1395                p
1396            };
1397            ptr::write(p, element); // Overwritte
1398        }
1399    }
1400
1401    /// Removes and returns the element at position `index` within the deque.
1402    ///
1403    /// # Panics
1404    ///
1405    /// Panics if `index` is out of bounds.
1406    ///
1407    /// # Examples
1408    ///
1409    /// ```
1410    /// # #[macro_use] extern crate slice_deque;
1411    /// # use slice_deque::SliceDeque;
1412    /// # fn main() {
1413    /// let mut deq = sdeq![1, 2, 3, 4, 5];
1414    /// assert_eq!(deq.remove(1), 2);
1415    /// assert_eq!(deq, [1, 3, 4, 5]);
1416    /// # }
1417    /// ```
1418    #[inline]
1419    #[allow(clippy::shadow_unrelated)] // FIXME: bug in clippy due to ptr
1420    pub fn remove(&mut self, index: usize) -> T {
1421        let len = self.len();
1422        assert!(index < len);
1423        unsafe {
1424            // copy element at pointer:
1425            let ptr = self.as_mut_ptr().add(index);
1426            let ret = ptr::read(ptr);
1427            if index > self.len() / 2 {
1428                // If the index is close to the back, shift elements from the
1429                // back towards the front
1430                ptr::copy(ptr.add(1), ptr, len - index - 1);
1431                self.move_tail_unchecked(-1);
1432            } else {
1433                // If the index is close to the front, shift elements from the
1434                // front towards the back
1435                let ptr = self.as_mut_ptr();
1436                ptr::copy(ptr, ptr.add(1), index);
1437                self.move_head_unchecked(1);
1438            }
1439
1440            ret
1441        }
1442    }
1443
1444    /// Splits the collection into two at the given index.
1445    ///
1446    /// Returns a newly allocated `Self`. `self` contains elements `[0, at)`,
1447    /// and the returned `Self` contains elements `[at, len)`.
1448    ///
1449    /// Note that the capacity of `self` does not change.
1450    ///
1451    /// # Panics
1452    ///
1453    /// Panics if `at > len`.
1454    ///
1455    /// # Examples
1456    ///
1457    /// ```rust
1458    /// # #[macro_use] extern crate slice_deque;
1459    /// # use slice_deque::SliceDeque;
1460    /// # fn main() {
1461    /// let mut deq = sdeq![1, 2, 3];
1462    /// let deq2 = deq.split_off(1);
1463    /// assert_eq!(deq, [1]);
1464    /// assert_eq!(deq2, [2, 3]);
1465    /// # }
1466    /// ```
1467    #[inline]
1468    pub fn split_off(&mut self, at: usize) -> Self {
1469        assert!(at <= self.len(), "`at` out of bounds");
1470
1471        let other_len = self.len() - at;
1472        let mut other = Self::with_capacity(other_len);
1473
1474        unsafe {
1475            self.move_tail_unchecked(-(other_len as isize));
1476            other.move_tail_unchecked(other_len as isize);
1477
1478            ptr::copy_nonoverlapping(
1479                self.as_ptr().add(at),
1480                other.as_mut_ptr(),
1481                other.len(),
1482            );
1483        }
1484        other
1485    }
1486
1487    /// Retains only the elements specified by the predicate.
1488    ///
1489    /// That is, remove all elements `e` such that `f(&e)` returns `false`.
1490    /// This method operates in place and preserves the order of the
1491    /// retained elements.
1492    ///
1493    /// # Examples
1494    ///
1495    /// ```
1496    /// # #[macro_use] extern crate slice_deque;
1497    /// # use slice_deque::SliceDeque;
1498    /// # fn main() {
1499    /// let mut deq = sdeq![1, 2, 3, 4];
1500    /// deq.retain(|&x| x % 2 == 0);
1501    /// assert_eq!(deq, [2, 4]);
1502    /// # }
1503    /// ```
1504    #[inline]
1505    pub fn retain<F>(&mut self, mut f: F)
1506    where
1507        F: FnMut(&T) -> bool,
1508    {
1509        let len = self.len();
1510        let mut del = 0;
1511        {
1512            let v = &mut **self;
1513
1514            for i in 0..len {
1515                if !f(&v[i]) {
1516                    del += 1;
1517                } else if del > 0 {
1518                    v.swap(i - del, i);
1519                }
1520            }
1521        }
1522        if del > 0 {
1523            self.truncate(len - del);
1524        }
1525    }
1526
1527    /// Removes all but the first of consecutive elements in the deque that
1528    /// resolve to the same key.
1529    ///
1530    /// If the deque is sorted, this removes all duplicates.
1531    ///
1532    /// # Examples
1533    ///
1534    /// ```
1535    /// # #[macro_use] extern crate slice_deque;
1536    /// # use slice_deque::SliceDeque;
1537    /// # fn main() {
1538    /// let mut deq = sdeq![10, 20, 21, 30, 20];
1539    ///
1540    /// deq.dedup_by_key(|i| *i / 10);
1541    /// assert_eq!(deq, [10, 20, 30, 20]);
1542    /// # }
1543    /// ```
1544    #[inline]
1545    pub fn dedup_by_key<F, K>(&mut self, mut key: F)
1546    where
1547        F: FnMut(&mut T) -> K,
1548        K: PartialEq,
1549    {
1550        self.dedup_by(|a, b| key(a) == key(b))
1551    }
1552
1553    /// Removes all but the first of consecutive elements in the deque
1554    /// satisfying a given equality relation.
1555    ///
1556    /// The `same_bucket` function is passed references to two elements from
1557    /// the deque, and returns `true` if the elements compare equal, or
1558    /// `false` if they do not. The elements are passed in opposite order
1559    /// from their order in the deque, so if `same_bucket(a, b)` returns
1560    /// `true`, `a` is removed.
1561    ///
1562    /// If the deque is sorted, this removes all duplicates.
1563    ///
1564    /// # Examples
1565    ///
1566    /// ```
1567    /// # #[macro_use] extern crate slice_deque;
1568    /// # use slice_deque::SliceDeque;
1569    /// # fn main() {
1570    /// let mut deq = sdeq!["foo", "bar", "Bar", "baz", "bar"];
1571    ///
1572    /// deq.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
1573    ///
1574    /// assert_eq!(deq, ["foo", "bar", "baz", "bar"]);
1575    /// # }
1576    /// ```
1577    #[inline]
1578    pub fn dedup_by<F>(&mut self, mut same_bucket: F)
1579    where
1580        F: FnMut(&mut T, &mut T) -> bool,
1581    {
1582        unsafe {
1583            // Although we have a mutable reference to `self`, we cannot make
1584            // *arbitrary* changes. The `same_bucket` calls could panic, so we
1585            // must ensure that the deque is in a valid state at all time.
1586            //
1587            // The way that we handle this is by using swaps; we iterate
1588            // over all the elements, swapping as we go so that at the end
1589            // the elements we wish to keep are in the front, and those we
1590            // wish to reject are at the back. We can then truncate the
1591            // deque. This operation is still O(n).
1592            //
1593            // Example: We start in this state, where `r` represents "next
1594            // read" and `w` represents "next_write`.
1595            //
1596            //           r
1597            //     +---+---+---+---+---+---+
1598            //     | 0 | 1 | 1 | 2 | 3 | 3 |
1599            //     +---+---+---+---+---+---+
1600            //           w
1601            //
1602            // Comparing self[r] against self[w-1], this is not a duplicate, so
1603            // we swap self[r] and self[w] (no effect as r==w) and then
1604            // increment both r and w, leaving us with:
1605            //
1606            //               r
1607            //     +---+---+---+---+---+---+
1608            //     | 0 | 1 | 1 | 2 | 3 | 3 |
1609            //     +---+---+---+---+---+---+
1610            //               w
1611            //
1612            // Comparing self[r] against self[w-1], this value is a duplicate,
1613            // so we increment `r` but leave everything else unchanged:
1614            //
1615            //                   r
1616            //     +---+---+---+---+---+---+
1617            //     | 0 | 1 | 1 | 2 | 3 | 3 |
1618            //     +---+---+---+---+---+---+
1619            //               w
1620            //
1621            // Comparing self[r] against self[w-1], this is not a duplicate,
1622            // so swap self[r] and self[w] and advance r and w:
1623            //
1624            //                       r
1625            //     +---+---+---+---+---+---+
1626            //     | 0 | 1 | 2 | 1 | 3 | 3 |
1627            //     +---+---+---+---+---+---+
1628            //                   w
1629            //
1630            // Not a duplicate, repeat:
1631            //
1632            //                           r
1633            //     +---+---+---+---+---+---+
1634            //     | 0 | 1 | 2 | 3 | 1 | 3 |
1635            //     +---+---+---+---+---+---+
1636            //                       w
1637            //
1638            // Duplicate, advance r. End of deque. Truncate to w.
1639
1640            let ln = self.len();
1641            if intrinsics::unlikely(ln <= 1) {
1642                return;
1643            }
1644
1645            // Avoid bounds checks by using raw pointers.
1646            let p = self.as_mut_ptr();
1647            let mut r: usize = 1;
1648            let mut w: usize = 1;
1649
1650            while r < ln {
1651                let p_r = p.add(r);
1652                let p_wm1 = p.add(w - 1);
1653                if !same_bucket(&mut *p_r, &mut *p_wm1) {
1654                    if r != w {
1655                        let p_w = p_wm1.add(1);
1656                        mem::swap(&mut *p_r, &mut *p_w);
1657                    }
1658                    w += 1;
1659                }
1660                r += 1;
1661            }
1662
1663            self.truncate(w);
1664        }
1665    }
1666
1667    /// Extend the `SliceDeque` by `n` values, using the given generator.
1668    #[inline]
1669    fn extend_with<E: ExtendWith<T>>(&mut self, n: usize, value: E) {
1670        self.reserve(n);
1671
1672        unsafe {
1673            let mut ptr = self.as_mut_ptr().add(self.len());
1674
1675            // Write all elements except the last one
1676            for _ in 1..n {
1677                ptr::write(ptr, value.next());
1678                ptr = ptr.add(1);
1679                // Increment the length in every step in case next() panics
1680                self.move_tail_unchecked(1);
1681            }
1682
1683            if n > 0 {
1684                // We can write the last element directly without cloning
1685                // needlessly
1686                ptr::write(ptr, value.last());
1687                self.move_tail_unchecked(1);
1688            }
1689
1690            // len set by scope guard
1691        }
1692    }
1693
1694    /// Extend for a general iterator.
1695    ///
1696    /// This function should be the moral equivalent of:
1697    ///
1698    /// >  for item in iterator {
1699    /// >      self.push_back(item);
1700    /// >  }
1701    #[inline]
1702    fn extend_desugared<I: Iterator<Item = T>>(&mut self, mut iterator: I) {
1703        #[allow(clippy::while_let_on_iterator)]
1704        while let Some(element) = iterator.next() {
1705            let len = self.len();
1706            let cap = self.capacity();
1707            if len == cap {
1708                let (lower, upper) = iterator.size_hint();
1709                let additional_cap = if let Some(upper) = upper {
1710                    upper
1711                } else {
1712                    lower
1713                }
1714                .checked_add(1)
1715                .expect("overflow");
1716                self.reserve(additional_cap);
1717            }
1718            debug_assert!(self.len() < self.capacity());
1719            unsafe {
1720                ptr::write(self.get_unchecked_mut(len), element);
1721                // NB can't overflow since we would have had to alloc the
1722                // address space
1723                self.move_tail_unchecked(1);
1724            }
1725        }
1726    }
1727
1728    /// Creates a splicing iterator that replaces the specified range in the
1729    /// deque with the given `replace_with` iterator and yields the
1730    /// removed items. `replace_with` does not need to be the same length
1731    /// as `range`.
1732    ///
1733    /// Note 1: The element range is removed even if the iterator is not
1734    /// consumed until the end.
1735    ///
1736    /// Note 2: It is unspecified how many elements are removed from the deque,
1737    /// if the `Splice` value is leaked.
1738    ///
1739    /// Note 3: The input iterator `replace_with` is only consumed
1740    /// when the `Splice` value is dropped.
1741    ///
1742    /// Note 4: This is optimal if:
1743    ///
1744    /// * The tail (elements in the deque after `range`) is empty,
1745    /// * or `replace_with` yields fewer elements than `range`’s length
1746    /// * or the lower bound of its `size_hint()` is exact.
1747    ///
1748    /// Otherwise, a temporary deque is allocated and the tail is moved twice.
1749    ///
1750    /// # Panics
1751    ///
1752    /// Panics if the starting point is greater than the end point or if
1753    /// the end point is greater than the length of the deque.
1754    ///
1755    /// # Examples
1756    ///
1757    /// ```
1758    /// # #[macro_use] extern crate slice_deque;
1759    /// # use slice_deque::SliceDeque;
1760    /// # fn main() {
1761    /// let mut deq = sdeq![1, 2, 3];
1762    /// let new = [7, 8];
1763    /// let u: SliceDeque<_> = deq.splice(..2, new.iter().cloned()).collect();
1764    /// assert_eq!(deq, &[7, 8, 3]);
1765    /// assert_eq!(u, &[1, 2]);
1766    /// # }
1767    /// ```
1768    #[inline]
1769    pub fn splice<R, I>(
1770        &mut self, range: R, replace_with: I,
1771    ) -> Splice<I::IntoIter>
1772    where
1773        R: ops::RangeBounds<usize>,
1774        I: IntoIterator<Item = T>,
1775    {
1776        Splice {
1777            drain: self.drain(range),
1778            replace_with: replace_with.into_iter(),
1779        }
1780    }
1781
1782    /// Creates an iterator which uses a closure to determine if an element
1783    /// should be removed.
1784    ///
1785    /// If the closure returns `true`, then the element is removed and yielded.
1786    /// If the closure returns `false`, it will try again, and call the closure
1787    /// on the next element, seeing if it passes the test.
1788    ///
1789    /// Using this method is equivalent to the following code:
1790    ///
1791    /// ```
1792    /// # #[macro_use] extern crate slice_deque;
1793    /// # use slice_deque::SliceDeque;
1794    /// # fn main() {
1795    /// # let some_predicate = |x: &mut i32| { *x == 2 || *x == 3 || *x == 6
1796    /// # };
1797    /// let mut deq = SliceDeque::new();
1798    /// deq.extend(1..7);
1799    /// let mut i = 0;
1800    /// while i != deq.len() {
1801    ///     if some_predicate(&mut deq[i]) {
1802    ///         let val = deq.remove(i);
1803    ///     // your code here
1804    ///     } else {
1805    ///         i += 1;
1806    ///     }
1807    /// }
1808    /// # let mut expected = sdeq![1, 4, 5];
1809    /// # assert_eq!(deq, expected);
1810    /// # }
1811    /// ```
1812    ///
1813    /// But `drain_filter` is easier to use. `drain_filter` is also more
1814    /// efficient, because it can backshift the elements of the deque in
1815    /// bulk.
1816    ///
1817    /// Note that `drain_filter` also lets you mutate every element in the
1818    /// filter closure, regardless of whether you choose to keep or remove
1819    /// it.
1820    ///
1821    ///
1822    /// # Examples
1823    ///
1824    /// Splitting a deque into evens and odds, reusing the original allocation:
1825    ///
1826    /// ```
1827    /// # #[macro_use] extern crate slice_deque;
1828    /// # use slice_deque::SliceDeque;
1829    /// # fn main() {
1830    /// let mut numbers = sdeq![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];
1831    ///
1832    /// let evens = numbers
1833    ///     .drain_filter(|x| *x % 2 == 0)
1834    ///     .collect::<SliceDeque<_>>();
1835    /// let odds = numbers;
1836    ///
1837    /// assert_eq!(sdeq![2, 4, 6, 8, 14], evens);
1838    /// assert_eq!(odds, sdeq![1, 3, 5, 9, 11, 13, 15]);
1839    /// # }
1840    /// ```
1841    #[inline]
1842    pub fn drain_filter<F>(&mut self, filter: F) -> DrainFilter<T, F>
1843    where
1844        F: FnMut(&mut T) -> bool,
1845    {
1846        let old_len = self.len();
1847
1848        // Guard against us getting leaked (leak amplification)
1849        unsafe {
1850            self.move_tail_unchecked(-(old_len as isize));
1851        }
1852
1853        DrainFilter {
1854            deq: self,
1855            idx: 0,
1856            del: 0,
1857            old_len,
1858            pred: filter,
1859        }
1860    }
1861}
1862
1863impl<T> SliceDeque<T>
1864where
1865    T: Clone,
1866{
1867    /// Clones and appends all elements in a slice to the `SliceDeque`.
1868    ///
1869    /// Iterates over the slice `other`, clones each element, and then appends
1870    /// it to this `SliceDeque`. The `other` slice is traversed in-order.
1871    ///
1872    /// Note that this function is same as `extend` except that it is
1873    /// specialized to work with slices instead. If and when Rust gets
1874    /// specialization this function will likely be deprecated (but still
1875    /// available).
1876    ///
1877    /// # Examples
1878    ///
1879    /// ```
1880    /// # use slice_deque::SliceDeque;
1881    /// let mut deq = SliceDeque::new();
1882    /// deq.push_back(1);
1883    /// deq.extend_from_slice(&[2, 3, 4]);
1884    /// assert_eq!(deq, [1, 2, 3, 4]);
1885    /// ```
1886    #[inline]
1887    pub fn extend_from_slice(&mut self, other: &[T]) {
1888        #[cfg(feature = "unstable")]
1889        {
1890            self.spec_extend(other.iter())
1891        }
1892        #[cfg(not(feature = "unstable"))]
1893        {
1894            self.reserve(other.len());
1895            unsafe {
1896                let len = self.len();
1897                self.move_tail_unchecked(other.len() as isize);
1898                self.get_unchecked_mut(len..).clone_from_slice(other);
1899            }
1900        }
1901    }
1902
1903    /// Modifies the `SliceDeque` in-place so that `len()` is equal to
1904    /// `new_len`, either by removing excess elements or by appending clones of
1905    /// `value` to the back.
1906    ///
1907    /// # Examples
1908    ///
1909    /// ```
1910    /// # #[macro_use] extern crate slice_deque;
1911    /// # use slice_deque::SliceDeque;
1912    /// # fn main() {
1913    /// let mut deq = sdeq![5, 10, 15];
1914    /// assert_eq!(deq, [5, 10, 15]);
1915    ///
1916    /// deq.resize(2, 0);
1917    /// assert_eq!(deq, [5, 10]);
1918    ///
1919    /// deq.resize(5, 20);
1920    /// assert_eq!(deq, [5, 10, 20, 20, 20]);
1921    /// # }
1922    /// ```
1923    #[inline]
1924    pub fn resize(&mut self, new_len: usize, value: T) {
1925        let len = self.len();
1926
1927        if new_len > len {
1928            self.reserve(new_len - len);
1929            while self.len() < new_len {
1930                self.push_back(value.clone());
1931            }
1932        } else {
1933            self.truncate(new_len);
1934        }
1935        debug_assert!(self.len() == new_len);
1936    }
1937}
1938
1939impl<T: Default> SliceDeque<T> {
1940    /// Resizes the `SliceDeque` in-place so that `len` is equal to `new_len`.
1941    ///
1942    /// If `new_len` is greater than `len`, the `SliceDeque` is extended by the
1943    /// difference, with each additional slot filled with `Default::default()`.
1944    /// If `new_len` is less than `len`, the `SliceDeque` is simply truncated.
1945    ///
1946    /// This method uses `Default` to create new values on every push. If
1947    /// you'd rather `Clone` a given value, use [`resize`].
1948    ///
1949    ///
1950    /// # Examples
1951    ///
1952    /// ```
1953    /// # #[macro_use] extern crate slice_deque;
1954    /// # use slice_deque::SliceDeque;
1955    /// # fn main() {
1956    /// let mut deq = sdeq![1, 2, 3];
1957    /// deq.resize_default(5);
1958    /// assert_eq!(deq, [1, 2, 3, 0, 0]);
1959    ///
1960    /// deq.resize_default(2);
1961    /// assert_eq!(deq, [1, 2]);
1962    /// # }
1963    /// ```
1964    ///
1965    /// [`resize`]: #method.resize
1966    #[inline]
1967    pub fn resize_default(&mut self, new_len: usize) {
1968        let len = self.len();
1969
1970        if new_len > len {
1971            self.extend_with(new_len - len, ExtendDefault);
1972        } else {
1973            self.truncate(new_len);
1974        }
1975    }
1976}
1977
1978impl<T: PartialEq> SliceDeque<T> {
1979    /// Removes consecutive repeated elements in the deque.
1980    ///
1981    /// If the deque is sorted, this removes all duplicates.
1982    ///
1983    /// # Examples
1984    ///
1985    /// ```
1986    /// # #[macro_use] extern crate slice_deque;
1987    /// # use slice_deque::SliceDeque;
1988    /// # fn main() {
1989    /// let mut deq = sdeq![1, 2, 2, 3, 2];
1990    ///
1991    /// deq.dedup();
1992    /// assert_eq!(deq, [1, 2, 3, 2]);
1993    ///
1994    /// deq.sort();
1995    /// assert_eq!(deq, [1, 2, 2, 3]);
1996    ///
1997    /// deq.dedup();
1998    /// assert_eq!(deq, [1, 2, 3]);
1999    /// # }
2000    /// ```
2001    #[inline]
2002    pub fn dedup(&mut self) {
2003        self.dedup_by(|a, b| a == b)
2004    }
2005
2006    /// Removes the first instance of `item` from the deque if the item exists.
2007    ///
2008    /// # Examples
2009    ///
2010    /// ```
2011    /// # #[macro_use] extern crate slice_deque;
2012    /// # use slice_deque::SliceDeque;
2013    /// # fn main() {
2014    /// let mut deq = sdeq![1, 2, 3, 1];
2015    ///
2016    /// deq.remove_item(&1);
2017    /// assert_eq!(deq, &[2, 3, 1]);
2018    /// deq.remove_item(&1);
2019    /// assert_eq!(deq, &[2, 3]);
2020    /// # }
2021    /// ```
2022    #[inline]
2023    pub fn remove_item(&mut self, item: &T) -> Option<T> {
2024        let pos = match self.iter().position(|x| *x == *item) {
2025            Some(x) => x,
2026            None => return None,
2027        };
2028        Some(self.remove(pos))
2029    }
2030}
2031
2032impl<T: fmt::Debug> fmt::Debug for SliceDeque<T> {
2033    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
2034        write!(f, "{:?}", self.as_slice())
2035        /*
2036         write!(
2037             f,
2038             // TODO: "SliceDeque({:?})",
2039             "SliceDeque(len: {}, cap: {}, head: {}, tail: {}, elems: {:?})",
2040             self.len(),
2041             self.capacity(),
2042             self.head(),
2043             self.tail(),
2044             self.as_slice()
2045         )
2046        */
2047    }
2048}
2049
2050impl<T> Drop for SliceDeque<T> {
2051    #[inline]
2052    fn drop(&mut self) {
2053        // In Rust, if Drop::drop panics, the value must be leaked,
2054        // therefore we don't need to make sure that we handle that case
2055        // here:
2056        unsafe {
2057            // use drop for [T]
2058            ptr::drop_in_place(&mut self[..]);
2059        }
2060        // Buffer handles deallocation
2061    }
2062}
2063
2064impl<T> ops::Deref for SliceDeque<T> {
2065    type Target = [T];
2066    #[inline]
2067    fn deref(&self) -> &Self::Target {
2068        self.as_slice()
2069    }
2070}
2071
2072impl<T> ops::DerefMut for SliceDeque<T> {
2073    #[inline]
2074    fn deref_mut(&mut self) -> &mut Self::Target {
2075        self.as_mut_slice()
2076    }
2077}
2078
2079impl<T> Default for SliceDeque<T> {
2080    #[inline]
2081    fn default() -> Self {
2082        Self::new()
2083    }
2084}
2085
2086impl<T: Clone> Clone for SliceDeque<T> {
2087    #[inline]
2088    fn clone(&self) -> Self {
2089        let mut new = Self::with_capacity(self.len());
2090        for i in self.iter() {
2091            new.push_back(i.clone());
2092        }
2093        new
2094    }
2095    #[inline]
2096    fn clone_from(&mut self, other: &Self) {
2097        self.clear();
2098        for i in other.iter() {
2099            self.push_back(i.clone());
2100        }
2101    }
2102}
2103
2104impl<'a, T: Clone> From<&'a [T]> for SliceDeque<T> {
2105    #[inline]
2106    fn from(s: &'a [T]) -> Self {
2107        let mut new = Self::with_capacity(s.len());
2108        for i in s {
2109            new.push_back(i.clone());
2110        }
2111        new
2112    }
2113}
2114
2115impl<'a, T: Clone> From<&'a mut [T]> for SliceDeque<T> {
2116    #[inline]
2117    fn from(s: &'a mut [T]) -> Self {
2118        let mut new = Self::with_capacity(s.len());
2119        for i in s {
2120            new.push_back(i.clone());
2121        }
2122        new
2123    }
2124}
2125
2126impl<T: hash::Hash> hash::Hash for SliceDeque<T> {
2127    #[inline]
2128    fn hash<H: hash::Hasher>(&self, state: &mut H) {
2129        hash::Hash::hash(&**self, state)
2130    }
2131}
2132
2133///////////////////////////////////////////////////////////////////////////////
2134// PartialEq implementations:
2135
2136macro_rules! __impl_slice_eq1 {
2137    ($Lhs:ty, $Rhs:ty) => {
2138        __impl_slice_eq1! { $Lhs, $Rhs, Sized }
2139    };
2140    ($Lhs:ty, $Rhs:ty, $Bound:ident) => {
2141        impl<'a, 'b, A: $Bound, B> PartialEq<$Rhs> for $Lhs
2142        where
2143            A: PartialEq<B>,
2144        {
2145            #[inline]
2146            fn eq(&self, other: &$Rhs) -> bool {
2147                self[..] == other[..]
2148            }
2149        }
2150    };
2151}
2152
2153__impl_slice_eq1! { SliceDeque<A>, SliceDeque<B> }
2154__impl_slice_eq1! { SliceDeque<A>, &'b [B] }
2155__impl_slice_eq1! { SliceDeque<A>, &'b mut [B] }
2156
2157#[cfg(feature = "use_std")]
2158__impl_slice_eq1! { SliceDeque<A>, Vec<B> }
2159
2160macro_rules! array_impls {
2161    ($($N: expr)+) => {
2162        $(
2163            // NOTE: some less important impls are omitted to reduce code bloat
2164            __impl_slice_eq1! { SliceDeque<A>, [B; $N] }
2165            __impl_slice_eq1! { SliceDeque<A>, &'b [B; $N] }
2166        )+
2167    }
2168}
2169
2170array_impls! {
2171    0  1  2  3  4  5  6  7  8  9
2172        10 11 12 13 14 15 16 17 18 19
2173        20 21 22 23 24 25 26 27 28 29
2174        30 31 32
2175}
2176
2177///////////////////////////////////////////////////////////////////////////////
2178
2179impl<T: Eq> Eq for SliceDeque<T> {}
2180
2181impl<T: PartialOrd> PartialOrd for SliceDeque<T> {
2182    #[inline]
2183    fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
2184        PartialOrd::partial_cmp(&**self, &**other)
2185    }
2186}
2187
2188impl<'a, T: PartialOrd> PartialOrd<&'a [T]> for SliceDeque<T> {
2189    #[inline]
2190    fn partial_cmp(&self, other: &&'a [T]) -> Option<cmp::Ordering> {
2191        PartialOrd::partial_cmp(&**self, other)
2192    }
2193}
2194
2195/// A draining iterator for `SliceDeque<T>`.
2196///
2197/// This `struct` is created by the [`drain`] method on [`SliceDeque`].
2198///
2199/// [`drain`]: struct.SliceDeque.html#method.drain
2200/// [`SliceDeque`]: struct.SliceDeque.html
2201pub struct Drain<'a, T: 'a> {
2202    /// Index of tail to preserve
2203    tail_start: usize,
2204    /// Length of tail
2205    tail_len: usize,
2206    /// Current remaining range to remove
2207    iter: slice::Iter<'a, T>,
2208    /// A shared mutable pointer to the deque (with shared ownership).
2209    deq: NonNull<SliceDeque<T>>,
2210}
2211
2212impl<'a, T: 'a + fmt::Debug> fmt::Debug for Drain<'a, T> {
2213    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2214        f.debug_tuple("Drain").field(&self.iter.as_slice()).finish()
2215    }
2216}
2217
2218unsafe impl<'a, T: Sync> Sync for Drain<'a, T> {}
2219unsafe impl<'a, T: Send> Send for Drain<'a, T> {}
2220
2221impl<'a, T> Iterator for Drain<'a, T> {
2222    type Item = T;
2223
2224    #[inline]
2225    fn next(&mut self) -> Option<T> {
2226        self.iter
2227            .next()
2228            .map(|elt| unsafe { ptr::read(elt as *const _) })
2229    }
2230    #[inline]
2231    fn size_hint(&self) -> (usize, Option<usize>) {
2232        self.iter.size_hint()
2233    }
2234}
2235
2236impl<'a, T> DoubleEndedIterator for Drain<'a, T> {
2237    #[inline]
2238    fn next_back(&mut self) -> Option<T> {
2239        self.iter
2240            .next_back()
2241            .map(|elt| unsafe { ptr::read(elt as *const _) })
2242    }
2243}
2244
2245impl<'a, T> Drop for Drain<'a, T> {
2246    #[inline]
2247    fn drop(&mut self) {
2248        // exhaust self first
2249        self.for_each(|_| {});
2250
2251        if self.tail_len > 0 {
2252            unsafe {
2253                let source_deq = self.deq.as_mut();
2254                // memmove back untouched tail, update to new length
2255                let start = source_deq.len();
2256                let tail = self.tail_start;
2257                let src = source_deq.as_ptr().add(tail);
2258                let dst = source_deq.as_mut_ptr().add(start);
2259                ptr::copy(src, dst, self.tail_len);
2260                source_deq.move_tail_unchecked(self.tail_len as isize);
2261            }
2262        }
2263    }
2264}
2265
2266#[cfg(feature = "unstable")]
2267impl<'a, T> ExactSizeIterator for Drain<'a, T> {
2268    #[inline]
2269    fn is_empty(&self) -> bool {
2270        self.iter.is_empty()
2271    }
2272}
2273
2274#[cfg(feature = "unstable")]
2275impl<'a, T> iter::FusedIterator for Drain<'a, T> {}
2276
2277/// An iterator that moves out of a deque.
2278///
2279/// This `struct` is created by the `into_iter` method on
2280/// [`SliceDeque`][`SliceDeque`] (provided by the [`IntoIterator`] trait).
2281///
2282/// [`SliceDeque`]: struct.SliceDeque.html
2283/// [`IntoIterator`]: ../../std/iter/trait.IntoIterator.html
2284pub struct IntoIter<T> {
2285    /// NonNull pointer to the buffer
2286    buf: NonNull<T>,
2287    /// Capacity of the buffer.
2288    cap: usize,
2289    /// Pointer to the first element.
2290    ptr: *const T,
2291    /// Pointer to one-past-the-end.
2292    end: *const T,
2293}
2294
2295impl<T: fmt::Debug> fmt::Debug for IntoIter<T> {
2296    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2297        f.debug_tuple("IntoIter").field(&self.as_slice()).finish()
2298    }
2299}
2300
2301impl<T> IntoIter<T> {
2302    /// Returns the element slice
2303    #[cfg(feature = "unstable")]
2304    #[allow(clippy::option_unwrap_used)]
2305    #[inline]
2306    fn elems(&mut self) -> &mut [T] {
2307        unsafe {
2308            slice::from_raw_parts_mut(
2309                self.ptr as *mut _,
2310                (self.end as usize - self.ptr as usize) / mem::size_of::<T>(),
2311            )
2312        }
2313    }
2314
2315    /// Returns the remaining items of this iterator as a slice.
2316    ///
2317    /// # Examples
2318    ///
2319    /// ```
2320    /// # #[macro_use] extern crate slice_deque;
2321    /// # use slice_deque::SliceDeque;
2322    /// # fn main() {
2323    /// let mut deq = sdeq!['a', 'b', 'c'];
2324    /// let mut into_iter = deq.into_iter();
2325    /// assert_eq!(into_iter.as_slice(), ['a', 'b', 'c']);
2326    /// let _ = into_iter.next().unwrap();
2327    /// assert_eq!(into_iter.as_slice(), ['b', 'c']);
2328    /// # }
2329    /// ```
2330    #[inline]
2331    pub fn as_slice(&self) -> &[T] {
2332        unsafe { slice::from_raw_parts(self.ptr, self.size_hint().0) }
2333    }
2334
2335    /// Returns the remaining items of this iterator as a mutable slice.
2336    ///
2337    /// # Examples
2338    ///
2339    /// ```
2340    /// # #[macro_use] extern crate slice_deque;
2341    /// # use slice_deque::SliceDeque;
2342    /// # fn main() {
2343    /// let mut deq = sdeq!['a', 'b', 'c'];
2344    /// let mut into_iter = deq.into_iter();
2345    /// assert_eq!(into_iter.as_slice(), ['a', 'b', 'c']);
2346    /// into_iter.as_mut_slice()[2] = 'z';
2347    /// assert_eq!(into_iter.next().unwrap(), 'a');
2348    /// assert_eq!(into_iter.next().unwrap(), 'b');
2349    /// assert_eq!(into_iter.next().unwrap(), 'z');
2350    /// # }
2351    /// ```
2352    #[inline]
2353    pub fn as_mut_slice(&mut self) -> &mut [T] {
2354        unsafe {
2355            slice::from_raw_parts_mut(self.ptr as *mut T, self.size_hint().0)
2356        }
2357    }
2358}
2359
2360unsafe impl<T: Send> Send for IntoIter<T> {}
2361unsafe impl<T: Sync> Sync for IntoIter<T> {}
2362
2363impl<T> Iterator for IntoIter<T> {
2364    type Item = T;
2365
2366    #[inline]
2367    fn next(&mut self) -> Option<T> {
2368        unsafe {
2369            if self.ptr as *const _ == self.end {
2370                None
2371            } else if mem::size_of::<T>() == 0 {
2372                // purposefully don't use 'ptr.offset' because for
2373                // deques with 0-size elements this would return the
2374                // same pointer.
2375                self.ptr = intrinsics::arith_offset(self.ptr as *const i8, 1)
2376                    as *mut T;
2377
2378                // Use a non-null pointer value
2379                // (self.ptr might be null because of wrapping)
2380                Some(ptr::read(1 as *mut T))
2381            } else {
2382                let old = self.ptr;
2383                self.ptr = self.ptr.add(1);
2384
2385                Some(ptr::read(old))
2386            }
2387        }
2388    }
2389
2390    #[inline]
2391    fn size_hint(&self) -> (usize, Option<usize>) {
2392        let exact = match self.ptr.wrapping_offset_from_(self.end) {
2393            Some(x) => x as usize,
2394            None => (self.end as usize).wrapping_sub(self.ptr as usize),
2395        };
2396        (exact, Some(exact))
2397    }
2398
2399    #[inline]
2400    fn count(self) -> usize {
2401        self.size_hint().0
2402    }
2403}
2404
2405impl<T> DoubleEndedIterator for IntoIter<T> {
2406    #[inline]
2407    fn next_back(&mut self) -> Option<T> {
2408        unsafe {
2409            if self.end == self.ptr {
2410                None
2411            } else if mem::size_of::<T>() == 0 {
2412                // See above for why 'ptr.offset' isn't used
2413                self.end = intrinsics::arith_offset(self.end as *const i8, -1)
2414                    as *mut T;
2415
2416                // Use a non-null pointer value
2417                // (self.end might be null because of wrapping)
2418                Some(ptr::read(1 as *mut T))
2419            } else {
2420                self.end = self.end.offset(-1);
2421
2422                Some(ptr::read(self.end))
2423            }
2424        }
2425    }
2426}
2427
2428#[cfg(feature = "unstable")]
2429impl<T> ExactSizeIterator for IntoIter<T> {
2430    #[inline]
2431    fn is_empty(&self) -> bool {
2432        self.ptr == self.end
2433    }
2434}
2435
2436#[cfg(feature = "unstable")]
2437impl<T> iter::FusedIterator for IntoIter<T> {}
2438
2439#[cfg(feature = "unstable")]
2440unsafe impl<T> iter::TrustedLen for IntoIter<T> {}
2441
2442impl<T: Clone> Clone for IntoIter<T> {
2443    #[inline]
2444    fn clone(&self) -> Self {
2445        let mut deq = SliceDeque::<T>::with_capacity(self.size_hint().0);
2446        unsafe {
2447            deq.append_elements(self.as_slice());
2448        }
2449        deq.into_iter()
2450    }
2451}
2452
2453#[cfg(feature = "unstable")]
2454unsafe impl<#[may_dangle] T> Drop for IntoIter<T> {
2455    #[inline]
2456    fn drop(&mut self) {
2457        // destroy the remaining elements
2458        for _x in self.by_ref() {}
2459
2460        // Buffer handles deallocation
2461        let _ =
2462            unsafe { Buffer::from_raw_parts(self.buf.as_ptr(), 2 * self.cap) };
2463    }
2464}
2465
2466#[cfg(not(feature = "unstable"))]
2467impl<T> Drop for IntoIter<T> {
2468    #[inline]
2469    fn drop(&mut self) {
2470        // destroy the remaining elements
2471        for _x in self.by_ref() {}
2472
2473        // Buffer handles deallocation
2474        let _ =
2475            unsafe { Buffer::from_raw_parts(self.buf.as_ptr(), 2 * self.cap) };
2476    }
2477}
2478
2479impl<T> IntoIterator for SliceDeque<T> {
2480    type Item = T;
2481    type IntoIter = IntoIter<T>;
2482
2483    /// Creates a consuming iterator, that is, one that moves each value out of
2484    /// the deque (from start to end). The deque cannot be used after calling
2485    /// this.
2486    ///
2487    /// # Examples
2488    ///
2489    /// ```
2490    /// # #[macro_use] extern crate slice_deque;
2491    /// # use slice_deque::SliceDeque;
2492    /// # fn main() {
2493    /// let mut deq = sdeq!["a".to_string(), "b".to_string()];
2494    /// let expected = ["a".to_string(), "b".to_string()];
2495    /// for (i, s) in deq.into_iter().enumerate() {
2496    ///     // s has type String, not &String
2497    ///     println!("{}", s);
2498    ///     assert_eq!(s, expected[i]);
2499    /// }
2500    /// # }
2501    /// ```
2502    #[inline]
2503    fn into_iter(self) -> IntoIter<T> {
2504        unsafe {
2505            let buf_ptr = self.buf.ptr();
2506            intrinsics::assume(!buf_ptr.is_null());
2507            let begin = self.as_ptr();
2508            let end = if mem::size_of::<T>() == 0 {
2509                intrinsics::arith_offset(begin as *const i8, self.len() as _)
2510                    as *const _
2511            } else {
2512                begin.add(self.len())
2513            };
2514            assert!(begin as usize <= end as usize);
2515            let it = IntoIter {
2516                buf: NonNull::new_unchecked(buf_ptr),
2517                cap: self.capacity(),
2518                ptr: begin,
2519                end,
2520            };
2521            debug_assert_eq!(self.len(), it.size_hint().0);
2522            #[allow(clippy::mem_forget)]
2523            mem::forget(self);
2524            it
2525        }
2526    }
2527}
2528
2529impl<'a, T> IntoIterator for &'a SliceDeque<T> {
2530    type Item = &'a T;
2531    type IntoIter = slice::Iter<'a, T>;
2532    #[inline]
2533    fn into_iter(self) -> slice::Iter<'a, T> {
2534        self.iter()
2535    }
2536}
2537
2538impl<'a, T> IntoIterator for &'a mut SliceDeque<T> {
2539    type Item = &'a mut T;
2540    type IntoIter = slice::IterMut<'a, T>;
2541    #[inline]
2542    fn into_iter(self) -> slice::IterMut<'a, T> {
2543        self.iter_mut()
2544    }
2545}
2546
2547impl<T> Extend<T> for SliceDeque<T> {
2548    #[inline]
2549    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
2550        <Self as SpecExtend<T, I::IntoIter>>::spec_extend(
2551            self,
2552            iter.into_iter(),
2553        )
2554    }
2555}
2556
2557/// Specialization trait used for `SliceDeque::from_iter` and
2558/// `SliceDeque::extend`.
2559trait SpecExtend<T, I> {
2560    /// Specialization for `SliceDeque::from_iter`.
2561    fn from_iter(iter: I) -> Self;
2562    /// Specialization for `SliceDeque::extend`.
2563    fn spec_extend(&mut self, iter: I);
2564}
2565
2566/// Default implementation of `SpecExtend::from_iter`.
2567#[inline(always)]
2568fn from_iter_default<T, I: Iterator<Item = T>>(
2569    mut iterator: I,
2570) -> SliceDeque<T> {
2571    // Unroll the first iteration, as the deque is going to be
2572    // expanded on this iteration in every case when the iterable is not
2573    // empty, but the loop in extend_desugared() is not going to see the
2574    // deque being full in the few subsequent loop iterations.
2575    // So we get better branch prediction.
2576    let mut deque = match iterator.next() {
2577        None => return SliceDeque::<T>::new(),
2578        Some(element) => {
2579            let (lower, _) = iterator.size_hint();
2580            let mut deque =
2581                SliceDeque::<T>::with_capacity(lower.saturating_add(1));
2582            unsafe {
2583                ptr::write(deque.get_unchecked_mut(0), element);
2584                deque.move_tail_unchecked(1);
2585            }
2586            deque
2587        }
2588    };
2589    <SliceDeque<T> as SpecExtend<T, I>>::spec_extend(&mut deque, iterator);
2590    deque
2591}
2592
2593impl<T, I> SpecExtend<T, I> for SliceDeque<T>
2594where
2595    I: Iterator<Item = T>,
2596{
2597    #[cfg(feature = "unstable")]
2598    default fn from_iter(iterator: I) -> Self {
2599        from_iter_default(iterator)
2600    }
2601
2602    #[cfg(feature = "unstable")]
2603    default fn spec_extend(&mut self, iter: I) {
2604        self.extend_desugared(iter)
2605    }
2606
2607    #[cfg(not(feature = "unstable"))]
2608    fn from_iter(iterator: I) -> Self {
2609        from_iter_default(iterator)
2610    }
2611
2612    #[cfg(not(feature = "unstable"))]
2613    fn spec_extend(&mut self, iter: I) {
2614        self.extend_desugared(iter)
2615    }
2616}
2617
2618#[cfg(feature = "unstable")]
2619impl<T, I> SpecExtend<T, I> for SliceDeque<T>
2620where
2621    I: iter::TrustedLen<Item = T>,
2622{
2623    default fn from_iter(iterator: I) -> Self {
2624        let mut deque = Self::new();
2625        <Self as SpecExtend<T, I>>::spec_extend(&mut deque, iterator);
2626        deque
2627    }
2628
2629    #[allow(clippy::use_debug)]
2630    default fn spec_extend(&mut self, iterator: I) {
2631        // This is the case for a TrustedLen iterator.
2632        let (low, high) = iterator.size_hint();
2633        if let Some(high_value) = high {
2634            debug_assert_eq!(
2635                low,
2636                high_value,
2637                "TrustedLen iterator's size hint is not exact: {:?}",
2638                (low, high)
2639            );
2640        }
2641        if let Some(additional) = high {
2642            self.reserve(additional);
2643            unsafe {
2644                let mut ptr = self.as_mut_ptr().add(self.len());
2645                for element in iterator {
2646                    ptr::write(ptr, element);
2647                    ptr = ptr.add(1);
2648                    // NB can't overflow since we would have had to alloc the
2649                    // address space
2650                    self.move_tail_unchecked(1);
2651                }
2652            }
2653        } else {
2654            self.extend_desugared(iterator)
2655        }
2656    }
2657}
2658
2659#[cfg(feature = "unstable")]
2660impl<T> SpecExtend<T, IntoIter<T>> for SliceDeque<T> {
2661    fn from_iter(mut iterator: IntoIter<T>) -> Self {
2662        // A common case is passing a deque into a function which immediately
2663        // re-collects into a deque. We can short circuit this if the IntoIter
2664        // has not been advanced at all.
2665        if iterator.buf.as_ptr() as *const _ == iterator.ptr {
2666            unsafe {
2667                let deq = Self::from_raw_parts(
2668                    iterator.buf.as_ptr(),
2669                    iterator.cap,
2670                    iterator.elems(),
2671                );
2672                #[allow(clippy::mem_forget)]
2673                mem::forget(iterator);
2674                deq
2675            }
2676        } else {
2677            let mut deque = Self::new();
2678            deque.spec_extend(iterator);
2679            deque
2680        }
2681    }
2682
2683    fn spec_extend(&mut self, mut iterator: IntoIter<T>) {
2684        unsafe {
2685            self.append_elements(iterator.as_slice() as _);
2686        }
2687        iterator.ptr = iterator.end;
2688    }
2689}
2690
2691#[cfg(not(feature = "unstable"))]
2692impl<'a, T: 'a, I> SpecExtend<&'a T, I> for SliceDeque<T>
2693where
2694    I: Iterator<Item = &'a T>,
2695    T: Clone,
2696{
2697    fn from_iter(iterator: I) -> Self {
2698        SpecExtend::from_iter(iterator.cloned())
2699    }
2700
2701    fn spec_extend(&mut self, iterator: I) {
2702        self.spec_extend(iterator.cloned())
2703    }
2704}
2705
2706#[cfg(feature = "unstable")]
2707impl<'a, T: 'a, I> SpecExtend<&'a T, I> for SliceDeque<T>
2708where
2709    I: Iterator<Item = &'a T>,
2710    T: Clone,
2711{
2712    default fn from_iter(iterator: I) -> Self {
2713        SpecExtend::from_iter(iterator.cloned())
2714    }
2715
2716    default fn spec_extend(&mut self, iterator: I) {
2717        self.spec_extend(iterator.cloned())
2718    }
2719}
2720
2721#[cfg(feature = "unstable")]
2722impl<'a, T: 'a> SpecExtend<&'a T, slice::Iter<'a, T>> for SliceDeque<T>
2723where
2724    T: Copy,
2725{
2726    fn spec_extend(&mut self, iterator: slice::Iter<'a, T>) {
2727        let slice = iterator.as_slice();
2728        self.reserve(slice.len());
2729        unsafe {
2730            let len = self.len();
2731            self.move_tail_unchecked(slice.len() as isize);
2732            self.get_unchecked_mut(len..).copy_from_slice(slice);
2733        }
2734    }
2735}
2736
2737impl<T> iter::FromIterator<T> for SliceDeque<T> {
2738    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
2739        <Self as SpecExtend<T, I::IntoIter>>::from_iter(iter.into_iter())
2740    }
2741}
2742
2743/// This code generalises `extend_with_{element,default}`.
2744trait ExtendWith<T> {
2745    /// TODO: docs
2746    fn next(&self) -> T;
2747    /// TODO: docs
2748    fn last(self) -> T;
2749}
2750
2751/// TODO: docs
2752struct ExtendElement<T>(T);
2753impl<T: Clone> ExtendWith<T> for ExtendElement<T> {
2754    fn next(&self) -> T {
2755        self.0.clone()
2756    }
2757    fn last(self) -> T {
2758        self.0
2759    }
2760}
2761
2762/// TODO: docs
2763struct ExtendDefault;
2764impl<T: Default> ExtendWith<T> for ExtendDefault {
2765    fn next(&self) -> T {
2766        Default::default()
2767    }
2768    fn last(self) -> T {
2769        Default::default()
2770    }
2771}
2772
2773/// TODO: docs
2774/// FIXME: not used, this should be used by the sdeq! macro? Remove this maybe.
2775#[doc(hidden)]
2776pub fn from_elem<T: Clone>(elem: T, n: usize) -> SliceDeque<T> {
2777    <T as SpecFromElem>::from_elem(elem, n)
2778}
2779
2780/// Specialization trait used for `SliceDeque::from_elem`.
2781trait SpecFromElem: Sized {
2782    /// TODO: docs
2783    fn from_elem(elem: Self, n: usize) -> SliceDeque<Self>;
2784}
2785
2786impl<T: Clone> SpecFromElem for T {
2787    #[cfg(feature = "unstable")]
2788    default fn from_elem(elem: Self, n: usize) -> SliceDeque<Self> {
2789        let mut v = SliceDeque::with_capacity(n);
2790        v.extend_with(n, ExtendElement(elem));
2791        v
2792    }
2793
2794    #[cfg(not(feature = "unstable"))]
2795    fn from_elem(elem: Self, n: usize) -> SliceDeque<Self> {
2796        let mut v = SliceDeque::with_capacity(n);
2797        v.extend_with(n, ExtendElement(elem));
2798        v
2799    }
2800}
2801
2802#[cfg(feature = "unstable")]
2803impl SpecFromElem for u8 {
2804    #[inline]
2805    fn from_elem(elem: Self, n: usize) -> SliceDeque<Self> {
2806        unsafe {
2807            let mut v = SliceDeque::with_capacity(n);
2808            ptr::write_bytes(v.as_mut_ptr(), elem, n);
2809            v.move_tail_unchecked(n as isize);
2810            v
2811        }
2812    }
2813}
2814
2815macro_rules! impl_spec_from_elem {
2816    ($t:ty, $is_zero:expr) => {
2817        #[cfg(feature = "unstable")]
2818        impl SpecFromElem for $t {
2819            #[inline]
2820            fn from_elem(elem: Self, n: usize) -> SliceDeque<Self> {
2821                let mut v = SliceDeque::with_capacity(n);
2822                v.extend_with(n, ExtendElement(elem));
2823                v
2824            }
2825        }
2826    };
2827}
2828
2829impl_spec_from_elem!(i8, |x| x == 0);
2830impl_spec_from_elem!(i16, |x| x == 0);
2831impl_spec_from_elem!(i32, |x| x == 0);
2832impl_spec_from_elem!(i64, |x| x == 0);
2833#[cfg(feature = "unstable")]
2834impl_spec_from_elem!(i128, |x| x == 0);
2835impl_spec_from_elem!(isize, |x| x == 0);
2836
2837impl_spec_from_elem!(u16, |x| x == 0);
2838impl_spec_from_elem!(u32, |x| x == 0);
2839impl_spec_from_elem!(u64, |x| x == 0);
2840#[cfg(feature = "unstable")]
2841impl_spec_from_elem!(u128, |x| x == 0);
2842impl_spec_from_elem!(usize, |x| x == 0);
2843
2844impl_spec_from_elem!(f32, |x: f32| x == 0. && x.is_sign_positive());
2845impl_spec_from_elem!(f64, |x: f64| x == 0. && x.is_sign_positive());
2846
2847/// Extend implementation that copies elements out of references before
2848/// pushing them onto the `SliceDeque`.
2849///
2850/// This implementation is specialized for slice iterators, where it uses
2851/// [`copy_from_slice`] to append the entire slice at once.
2852///
2853/// [`copy_from_slice`]: ../../std/primitive.slice.html#method.copy_from_slice
2854impl<'a, T: 'a + Copy> Extend<&'a T> for SliceDeque<T> {
2855    fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
2856        self.spec_extend(iter.into_iter())
2857    }
2858}
2859
2860/// A splicing iterator for `SliceDeque`.
2861///
2862/// This struct is created by the [`splice()`] method on [`SliceDeque`]. See
2863/// its documentation for more.
2864///
2865/// [`splice()`]: struct.SliceDeque.html#method.splice
2866/// [`SliceDeque`]: struct.SliceDeque.html
2867#[derive(Debug)]
2868pub struct Splice<'a, I: Iterator + 'a> {
2869    /// TODO: docs
2870    drain: Drain<'a, I::Item>,
2871    /// TODO: docs
2872    replace_with: I,
2873}
2874
2875impl<'a, I: Iterator> Iterator for Splice<'a, I> {
2876    type Item = I::Item;
2877    #[inline]
2878    fn next(&mut self) -> Option<Self::Item> {
2879        self.drain.next()
2880    }
2881    #[inline]
2882    fn size_hint(&self) -> (usize, Option<usize>) {
2883        self.drain.size_hint()
2884    }
2885}
2886
2887impl<'a, I: Iterator> DoubleEndedIterator for Splice<'a, I> {
2888    #[inline]
2889    fn next_back(&mut self) -> Option<Self::Item> {
2890        self.drain.next_back()
2891    }
2892}
2893
2894#[cfg(feature = "unstable")]
2895impl<'a, I: Iterator> ExactSizeIterator for Splice<'a, I> {}
2896
2897// TODO: re-evaluate this
2898#[cfg(feature = "unstable")]
2899impl<'a, I: Iterator> iter::FusedIterator for Splice<'a, I> {}
2900
2901impl<'a, I: Iterator> Drop for Splice<'a, I> {
2902    fn drop(&mut self) {
2903        // exhaust drain first
2904        while let Some(_) = self.drain.next() {}
2905
2906        unsafe {
2907            if self.drain.tail_len == 0 {
2908                self.drain.deq.as_mut().extend(self.replace_with.by_ref());
2909                return;
2910            }
2911
2912            // First fill the range left by drain().
2913            if !self.drain.fill(&mut self.replace_with) {
2914                return;
2915            }
2916
2917            // There may be more elements. Use the lower bound as an estimate.
2918            // FIXME: Is the upper bound a better guess? Or something else?
2919            let (lower_bound, _upper_bound) = self.replace_with.size_hint();
2920            if lower_bound > 0 {
2921                self.drain.move_tail_unchecked(lower_bound);
2922                if !self.drain.fill(&mut self.replace_with) {
2923                    return;
2924                }
2925            }
2926
2927            // Collect any remaining elements.
2928            // This is a zero-length deque which does not allocate if
2929            // `lower_bound` was exact.
2930            let mut collected = self
2931                .replace_with
2932                .by_ref()
2933                .collect::<SliceDeque<I::Item>>()
2934                .into_iter();
2935            // Now we have an exact count.
2936            if collected.size_hint().0 > 0 {
2937                self.drain.move_tail_unchecked(collected.size_hint().0);
2938                let filled = self.drain.fill(&mut collected);
2939                debug_assert!(filled);
2940                debug_assert_eq!(collected.size_hint().0, 0);
2941            }
2942        }
2943        // Let `Drain::drop` move the tail back if necessary and restore
2944        // `deq.tail`.
2945    }
2946}
2947
2948/// Private helper methods for `Splice::drop`
2949impl<'a, T> Drain<'a, T> {
2950    /// The range from `self.deq.tail` to `self.tail()_start` contains elements
2951    /// that have been moved out.
2952    /// Fill that range as much as possible with new elements from the
2953    /// `replace_with` iterator. Return whether we filled the entire
2954    /// range. (`replace_with.next()` didn’t return `None`.)
2955    unsafe fn fill<I: Iterator<Item = T>>(
2956        &mut self, replace_with: &mut I,
2957    ) -> bool {
2958        let deq = self.deq.as_mut();
2959        let range_start = deq.len();
2960        let range_end = self.tail_start;
2961        let range_slice = slice::from_raw_parts_mut(
2962            deq.as_mut_ptr().add(range_start),
2963            range_end - range_start,
2964        );
2965
2966        for place in range_slice {
2967            if let Some(new_item) = replace_with.next() {
2968                ptr::write(place, new_item);
2969                deq.move_tail_unchecked(1);
2970            } else {
2971                return false;
2972            }
2973        }
2974        true
2975    }
2976
2977    /// Make room for inserting more elements before the tail.
2978    unsafe fn move_tail_unchecked(&mut self, extra_capacity: usize) {
2979        let deq = self.deq.as_mut();
2980        let used_capacity = self.tail_start + self.tail_len;
2981        deq.reserve_capacity(used_capacity + extra_capacity)
2982            .expect("oom");
2983
2984        let new_tail_start = self.tail_start + extra_capacity;
2985        let src = deq.as_ptr().add(self.tail_start);
2986        let dst = deq.as_mut_ptr().add(new_tail_start);
2987        ptr::copy(src, dst, self.tail_len);
2988        self.tail_start = new_tail_start;
2989    }
2990}
2991
2992/// An iterator produced by calling `drain_filter` on `SliceDeque`.
2993#[derive(Debug)]
2994pub struct DrainFilter<'a, T: 'a, F>
2995where
2996    F: FnMut(&mut T) -> bool,
2997{
2998    /// TODO: docs
2999    deq: &'a mut SliceDeque<T>,
3000    /// TODO: docs
3001    idx: usize,
3002    /// TODO: docs
3003    del: usize,
3004    /// TODO: docs
3005    old_len: usize,
3006    /// TODO: docs
3007    pred: F,
3008}
3009
3010impl<'a, T, F> Iterator for DrainFilter<'a, T, F>
3011where
3012    F: FnMut(&mut T) -> bool,
3013{
3014    type Item = T;
3015
3016    fn next(&mut self) -> Option<T> {
3017        unsafe {
3018            while self.idx != self.old_len {
3019                let i = self.idx;
3020                self.idx += 1;
3021                let v = slice::from_raw_parts_mut(
3022                    self.deq.as_mut_ptr(),
3023                    self.old_len,
3024                );
3025                if (self.pred)(&mut v[i]) {
3026                    self.del += 1;
3027                    return Some(ptr::read(&v[i]));
3028                } else if self.del > 0 {
3029                    let del = self.del;
3030                    let src: *const T = &v[i];
3031                    let dst: *mut T = &mut v[i - del];
3032                    // This is safe because self.deq has length 0
3033                    // thus its elements will not have Drop::drop
3034                    // called on them in the event of a panic.
3035                    ptr::copy_nonoverlapping(src, dst, 1);
3036                }
3037            }
3038            None
3039        }
3040    }
3041
3042    fn size_hint(&self) -> (usize, Option<usize>) {
3043        (0, Some(self.old_len - self.idx))
3044    }
3045}
3046
3047impl<'a, T, F> Drop for DrainFilter<'a, T, F>
3048where
3049    F: FnMut(&mut T) -> bool,
3050{
3051    fn drop(&mut self) {
3052        for _ in self.by_ref() {}
3053
3054        unsafe {
3055            let new_len = self.old_len - self.del;
3056            self.deq.move_tail_unchecked(new_len as isize);
3057        }
3058    }
3059}
3060
3061impl<T> convert::AsRef<[T]> for SliceDeque<T> {
3062    fn as_ref(&self) -> &[T] {
3063        &*self
3064    }
3065}
3066
3067impl<T> convert::AsMut<[T]> for SliceDeque<T> {
3068    fn as_mut(&mut self) -> &mut [T] {
3069        &mut *self
3070    }
3071}
3072
3073#[cfg(all(feature = "bytes_buf", feature = "use_std"))]
3074impl ::bytes::BufMut for SliceDeque<u8> {
3075    #[inline]
3076    fn remaining_mut(&self) -> usize {
3077        usize::max_value() - self.len()
3078    }
3079    #[inline]
3080    unsafe fn bytes_mut(&mut self) -> &mut [u8] {
3081        if self.capacity() == self.len() {
3082            self.reserve(64); // Grow the deque
3083        }
3084
3085        let cap = self.capacity();
3086        let len = self.len();
3087
3088        let ptr = self.as_mut_ptr();
3089        &mut slice::from_raw_parts_mut(ptr, cap)[len..]
3090    }
3091    #[inline]
3092    unsafe fn advance_mut(&mut self, cnt: usize) {
3093        let len = self.len();
3094        let remaining = self.capacity() - len;
3095        if cnt > remaining {
3096            // Reserve additional capacity, and ensure that the total length
3097            // will not overflow usize.
3098            self.reserve(cnt);
3099        }
3100
3101        self.move_tail_unchecked(cnt as isize);
3102    }
3103}
3104
3105#[cfg(all(feature = "bytes_buf", feature = "use_std"))]
3106impl ::bytes::IntoBuf for SliceDeque<u8> {
3107    type Buf = io::Cursor<SliceDeque<u8>>;
3108
3109    fn into_buf(self) -> Self::Buf {
3110        io::Cursor::new(self)
3111    }
3112}
3113
3114#[cfg(all(feature = "bytes_buf", feature = "use_std"))]
3115impl<'a> ::bytes::IntoBuf for &'a SliceDeque<u8> {
3116    type Buf = io::Cursor<&'a [u8]>;
3117
3118    fn into_buf(self) -> Self::Buf {
3119        io::Cursor::new(&self[..])
3120    }
3121}
3122
3123#[cfg(all(feature = "bytes_buf", feature = "use_std"))]
3124impl ::bytes::buf::FromBuf for SliceDeque<u8> {
3125    fn from_buf<T>(buf: T) -> Self
3126    where
3127        T: ::bytes::IntoBuf,
3128    {
3129        use bytes::{Buf, BufMut};
3130        let buf = buf.into_buf();
3131        let mut ret = SliceDeque::with_capacity(buf.remaining());
3132        ret.put(buf);
3133        ret
3134    }
3135}
3136
3137#[cfg(test)]
3138mod tests {
3139    use self::collections::HashMap;
3140    use super::SliceDeque;
3141    use std::cell::RefCell;
3142    use std::rc::Rc;
3143    use std::{collections, fmt, hash, mem};
3144
3145    #[derive(Clone, Debug)]
3146    struct WithDrop {
3147        counter: Rc<RefCell<usize>>,
3148    }
3149
3150    impl Drop for WithDrop {
3151        fn drop(&mut self) {
3152            *self.counter.borrow_mut() += 1;
3153        }
3154    }
3155
3156    fn sizes_to_test() -> Vec<usize> {
3157        let sample = vec![
3158            /* powers of 2 */ 2, 4, 8, 16, 32, 64,
3159            128, /*
3160                256,
3161                512,
3162                1024,
3163                2048,
3164                4096,
3165                8192, 16_384, 32_768,  65_536, 131_072, 262_144,
3166                */
3167                /*
3168                // powers of 2 - 1 or primes
3169                1, 3, 7, 13, 17, 31, 61, 127, 257, 509, 1021, 2039, 4093,
3170                8191, 16_381, 32_749,  65_537, 131_071, 262_143, 4_194_301,
3171                // powers of 10
3172                10, 100, 1000, 10_000, 100_000, 1_000_000_usize,*/
3173        ];
3174        sample.into_iter().collect()
3175    }
3176
3177    fn linear_usize_deque(size: usize) -> SliceDeque<usize> {
3178        let mut v: SliceDeque<usize> = SliceDeque::new();
3179        for i in 0..size {
3180            v.push_back(i);
3181            assert_eq!(v.len(), i + 1);
3182            for j in 0..v.len() {
3183                assert_eq!(*v.get(j).unwrap(), j);
3184            }
3185        }
3186        assert_eq!(v.len(), size);
3187        for i in 0..size {
3188            assert_eq!(*v.get(i).unwrap(), i);
3189        }
3190        v
3191    }
3192
3193    fn constant_deque<T: Clone + fmt::Debug>(
3194        size: usize, val: &T,
3195    ) -> SliceDeque<T> {
3196        let mut v: SliceDeque<T> = SliceDeque::with_capacity(size);
3197        for i in 0..size {
3198            let copy = val.clone();
3199            v.push_back(copy);
3200            assert_eq!(v.len(), i + 1);
3201        }
3202        assert_eq!(v.len(), size);
3203        v
3204    }
3205
3206    #[test]
3207    fn get() {
3208        let mut deq = SliceDeque::new();
3209        deq.push_back(3);
3210        deq.push_back(4);
3211        deq.push_back(5);
3212        assert_eq!(deq.get(1), Some(&4));
3213    }
3214
3215    #[test]
3216    fn get_mut() {
3217        let mut deq = SliceDeque::new();
3218        deq.push_back(3);
3219        deq.push_back(4);
3220        deq.push_back(5);
3221        assert_eq!(deq.get(1), Some(&4));
3222        if let Some(elem) = deq.get_mut(1) {
3223            *elem = 7;
3224        }
3225        assert_eq!(deq[1], 7);
3226    }
3227
3228    #[test]
3229    fn is_empty() {
3230        let mut deq = SliceDeque::new();
3231        assert!(deq.is_empty());
3232        deq.push_back(4);
3233        assert!(!deq.is_empty());
3234        deq.pop_front();
3235        assert!(deq.is_empty());
3236    }
3237
3238    #[test]
3239    fn push_pop_front() {
3240        for size in sizes_to_test() {
3241            let mut v: SliceDeque<usize> = SliceDeque::new();
3242            for i in 0..size {
3243                v.push_front(i);
3244                assert_eq!(v.len(), i + 1);
3245                for j in 0..v.len() {
3246                    assert_eq!(*v.get(v.len() - j - 1).unwrap(), j);
3247                }
3248            }
3249            assert_eq!(v.len(), size);
3250            for i in 0..size {
3251                assert_eq!(*v.get(i).unwrap(), size - i - 1);
3252            }
3253            for i in 0..size {
3254                assert_eq!(v.len(), size - i);
3255                v.pop_front();
3256                for j in 0..v.len() {
3257                    assert_eq!(*v.get(v.len() - j - 1).unwrap(), j);
3258                }
3259            }
3260            assert_eq!(v.len(), 0);
3261        }
3262    }
3263
3264    #[test]
3265    fn push_pop_back() {
3266        for size in sizes_to_test() {
3267            let mut v = linear_usize_deque(size);
3268            for i in 0..size {
3269                assert_eq!(v.len(), size - i);
3270                v.pop_back();
3271                for j in 0..v.len() {
3272                    assert_eq!(*v.get(j).unwrap(), j);
3273                }
3274            }
3275            assert_eq!(v.len(), 0);
3276        }
3277    }
3278
3279    #[test]
3280    fn all_head_tails() {
3281        for size in sizes_to_test() {
3282            let mut v = linear_usize_deque(size);
3283            let permutations = 6 * v.capacity();
3284
3285            // rotate from left to right
3286            for _ in 0..permutations {
3287                v.push_back(0);
3288                for j in (0..v.len() - 1).rev() {
3289                    *v.get_mut(j + 1).unwrap() = *v.get(j).unwrap();
3290                }
3291                v.pop_front();
3292                assert_eq!(v.len(), size);
3293                for k in 0..size {
3294                    assert_eq!(*v.get(k).unwrap(), k);
3295                }
3296            }
3297
3298            // rotate from right to left
3299            for _ in 0..permutations {
3300                v.push_front(0);
3301                for j in 0..v.len() - 1 {
3302                    *v.get_mut(j).unwrap() = *v.get(j + 1).unwrap()
3303                }
3304                v.pop_back();
3305                assert_eq!(v.len(), size);
3306                for k in 0..size {
3307                    assert_eq!(*v.get(k).unwrap(), k);
3308                }
3309            }
3310        }
3311    }
3312
3313    #[test]
3314    fn drop() {
3315        for size in sizes_to_test() {
3316            let counter = Rc::new(RefCell::new(0));
3317            let val = WithDrop {
3318                counter: counter.clone(),
3319            };
3320            {
3321                let _v = constant_deque(size, &val);
3322            }
3323            assert_eq!(*counter.borrow(), size);
3324        }
3325    }
3326
3327    #[test]
3328    fn clear() {
3329        for size in sizes_to_test() {
3330            let counter = Rc::new(RefCell::new(0));
3331            let val = WithDrop {
3332                counter: counter.clone(),
3333            };
3334            assert_eq!(*counter.borrow(), 0);
3335            let mut v = constant_deque(size, &val);
3336            assert_eq!(*counter.borrow(), 0);
3337            v.clear();
3338            assert_eq!(*counter.borrow(), size);
3339            assert_eq!(v.len(), 0);
3340        }
3341    }
3342
3343    #[test]
3344    fn reserve_no_cap_change() {
3345        let mut slice = SliceDeque::<u8>::with_capacity(4096);
3346        let cap = slice.capacity();
3347        assert!(cap >= 4096);
3348        slice.reserve(cap);
3349        // capacity should not change if the existing capacity is already
3350        // sufficient.
3351        assert_eq!(slice.capacity(), cap);
3352    }
3353
3354    #[test]
3355    fn resize() {
3356        for size in sizes_to_test() {
3357            let mut v = linear_usize_deque(size);
3358            let mut v_ref = linear_usize_deque(size / 2);
3359            v.resize(size / 2, 0);
3360            assert_eq!(v.len(), size / 2);
3361            assert_eq!(v.as_slice(), v_ref.as_slice());
3362            while v_ref.len() < size {
3363                v_ref.push_back(3);
3364            }
3365            v.resize(size, 3);
3366            assert_eq!(v.len(), size);
3367            assert_eq!(v_ref.len(), size);
3368            assert_eq!(v.as_slice(), v_ref.as_slice());
3369
3370            v.resize(0, 3);
3371            assert_eq!(v.len(), 0);
3372
3373            v.resize(size, 3);
3374            let v_ref = constant_deque(size, &3);
3375            assert_eq!(v.len(), size);
3376            assert_eq!(v_ref.len(), size);
3377            assert_eq!(v.as_slice(), v_ref.as_slice());
3378        }
3379    }
3380
3381    #[test]
3382    fn default() {
3383        let d = SliceDeque::<u8>::default();
3384        let r = SliceDeque::<u8>::new();
3385        assert_eq!(d.as_slice(), r.as_slice());
3386    }
3387
3388    #[test]
3389    fn shrink_to_fit() {
3390        let page_size = 4096;
3391        for size in sizes_to_test() {
3392            let mut deq = constant_deque(size, &(3 as u8));
3393            let old_cap = deq.capacity();
3394            deq.resize(size / 4, 3);
3395            deq.shrink_to_fit();
3396            if size <= page_size {
3397                assert_eq!(deq.capacity(), old_cap);
3398            } else {
3399                assert!(deq.capacity() < old_cap);
3400            }
3401        }
3402    }
3403
3404    #[test]
3405    fn iter() {
3406        let mut deq = SliceDeque::new();
3407        deq.push_back(5);
3408        deq.push_back(3);
3409        deq.push_back(4);
3410        let b: &[_] = &[&5, &3, &4];
3411        let c: Vec<&i32> = deq.iter().collect();
3412        assert_eq!(&c[..], b);
3413    }
3414
3415    #[test]
3416    fn iter_mut() {
3417        let mut deq = SliceDeque::new();
3418        deq.push_back(5);
3419        deq.push_back(3);
3420        deq.push_back(4);
3421        for num in deq.iter_mut() {
3422            *num = *num - 2;
3423        }
3424        let b: &[_] = &[&mut 3, &mut 1, &mut 2];
3425        assert_eq!(&deq.iter_mut().collect::<Vec<&mut i32>>()[..], b);
3426    }
3427
3428    #[test]
3429    fn hash_map() {
3430        let mut hm: HashMap<SliceDeque<u32>, u32> = HashMap::new();
3431        let mut a = SliceDeque::new();
3432        a.push_back(1);
3433        a.push_back(2);
3434        hm.insert(a.clone(), 3);
3435        let b = SliceDeque::new();
3436        assert_eq!(hm.get(&a), Some(&3));
3437        assert_eq!(hm.get(&b), None);
3438    }
3439
3440    #[test]
3441    fn partial_ord_eq() {
3442        let mut a = SliceDeque::new();
3443        a.push_back(1);
3444        a.push_back(2);
3445        a.push_back(3);
3446        assert!(a == a);
3447        assert!(!(a != a));
3448
3449        let mut b = SliceDeque::new();
3450        b.push_back(1);
3451        b.push_back(3);
3452        b.push_back(2);
3453        assert!(a < b);
3454        assert!(b > a);
3455        assert!(a != b);
3456
3457        let mut c = SliceDeque::new();
3458        c.push_back(2);
3459        assert!(c > a);
3460        assert!(a < c);
3461    }
3462
3463    struct DropCounter<'a> {
3464        count: &'a mut u32,
3465    }
3466
3467    impl<'a> Drop for DropCounter<'a> {
3468        fn drop(&mut self) {
3469            *self.count += 1;
3470        }
3471    }
3472
3473    #[test]
3474    fn vec_double_drop() {
3475        struct TwoSliceDeque<T> {
3476            x: SliceDeque<T>,
3477            y: SliceDeque<T>,
3478        }
3479
3480        let (mut count_x, mut count_y) = (0, 0);
3481        {
3482            let mut tv = TwoSliceDeque {
3483                x: SliceDeque::new(),
3484                y: SliceDeque::new(),
3485            };
3486            tv.x.push_back(DropCounter {
3487                count: &mut count_x,
3488            });
3489            tv.y.push_back(DropCounter {
3490                count: &mut count_y,
3491            });
3492
3493            // If SliceDeque had a drop flag, here is where it would be zeroed.
3494            // Instead, it should rely on its internal state to prevent
3495            // doing anything significant when dropped multiple times.
3496            mem::drop(tv.x);
3497
3498            // Here tv goes out of scope, tv.y should be dropped, but not tv.x.
3499        }
3500
3501        assert_eq!(count_x, 1);
3502        assert_eq!(count_y, 1);
3503    }
3504
3505    #[test]
3506    fn vec_reserve() {
3507        let mut v = SliceDeque::new();
3508        assert_eq!(v.capacity(), 0);
3509
3510        v.reserve(2);
3511        assert!(v.capacity() >= 2);
3512
3513        for i in 0..16 {
3514            v.push_back(i);
3515        }
3516
3517        assert!(v.capacity() >= 16);
3518        v.reserve(16);
3519        assert!(v.capacity() >= 32);
3520
3521        v.push_back(16);
3522
3523        v.reserve(16);
3524        assert!(v.capacity() >= 33)
3525    }
3526
3527    #[test]
3528    fn vec_extend() {
3529        let mut v = SliceDeque::new();
3530        let mut w = SliceDeque::new();
3531
3532        v.extend(w.clone());
3533        assert_eq!(v, &[]);
3534
3535        v.extend(0..3);
3536        for i in 0..3 {
3537            w.push_back(i)
3538        }
3539
3540        assert_eq!(v, w);
3541
3542        v.extend(3..10);
3543        for i in 3..10 {
3544            w.push_back(i)
3545        }
3546
3547        assert_eq!(v, w);
3548
3549        v.extend(w.clone()); // specializes to `append`
3550        assert!(v.iter().eq(w.iter().chain(w.iter())));
3551
3552        // Double drop
3553        let mut count_x = 0;
3554        {
3555            let mut x = SliceDeque::new();
3556            let mut y = SliceDeque::new();
3557            y.push_back(DropCounter {
3558                count: &mut count_x,
3559            });
3560            x.extend(y);
3561        }
3562        assert_eq!(count_x, 1);
3563    }
3564
3565    #[test]
3566    fn vec_extend_zst() {
3567        // Zero sized types
3568        #[derive(PartialEq, Debug)]
3569        struct Foo;
3570
3571        let mut a = SliceDeque::new();
3572        let b = sdeq![Foo, Foo];
3573
3574        a.extend(b);
3575        assert_eq!(a, &[Foo, Foo]);
3576    }
3577
3578    #[test]
3579    fn vec_extend_ref() {
3580        let mut v = SliceDeque::new();
3581        for &i in &[1, 2] {
3582            v.push_back(i);
3583        }
3584        v.extend(&[3, 4, 5]);
3585
3586        assert_eq!(v.len(), 5);
3587        assert_eq!(v, [1, 2, 3, 4, 5]);
3588
3589        let mut w = SliceDeque::new();
3590        for &i in &[6, 7] {
3591            w.push_back(i);
3592        }
3593        v.extend(&w);
3594
3595        assert_eq!(v.len(), 7);
3596        assert_eq!(v, [1, 2, 3, 4, 5, 6, 7]);
3597    }
3598
3599    #[test]
3600    fn vec_slice_from_mut() {
3601        let mut values = sdeq![1, 2, 3, 4, 5];
3602        {
3603            let slice = &mut values[2..];
3604            assert!(slice == [3, 4, 5]);
3605            for p in slice {
3606                *p += 2;
3607            }
3608        }
3609
3610        assert!(values == [1, 2, 5, 6, 7]);
3611    }
3612
3613    #[test]
3614    fn vec_slice_to_mut() {
3615        let mut values = sdeq![1, 2, 3, 4, 5];
3616        {
3617            let slice = &mut values[..2];
3618            assert!(slice == [1, 2]);
3619            for p in slice {
3620                *p += 1;
3621            }
3622        }
3623
3624        assert!(values == [2, 3, 3, 4, 5]);
3625    }
3626
3627    #[test]
3628    fn vec_split_at_mut() {
3629        let mut values = sdeq![1, 2, 3, 4, 5];
3630        {
3631            let (left, right) = values.split_at_mut(2);
3632            {
3633                let left: &[_] = left;
3634                assert!(&left[..left.len()] == &[1, 2]);
3635            }
3636            for p in left {
3637                *p += 1;
3638            }
3639
3640            {
3641                let right: &[_] = right;
3642                assert!(&right[..right.len()] == &[3, 4, 5]);
3643            }
3644            for p in right {
3645                *p += 2;
3646            }
3647        }
3648
3649        assert_eq!(values, [2, 3, 5, 6, 7]);
3650    }
3651
3652    #[test]
3653    fn vec_clone() {
3654        let v: SliceDeque<i32> = sdeq![];
3655        let w = sdeq![1, 2, 3];
3656
3657        assert_eq!(v, v.clone());
3658
3659        let z = w.clone();
3660        assert_eq!(w, z);
3661        // they should be disjoint in memory.
3662        assert!(w.as_ptr() != z.as_ptr())
3663    }
3664
3665    #[cfg(feature = "unstable")]
3666    #[test]
3667    fn vec_clone_from() {
3668        let mut v = sdeq![];
3669        let three: SliceDeque<Box<_>> = sdeq![box 1, box 2, box 3];
3670        let two: SliceDeque<Box<_>> = sdeq![box 4, box 5];
3671
3672        // zero, long
3673        v.clone_from(&three);
3674        assert_eq!(v, three);
3675
3676        // equal
3677        v.clone_from(&three);
3678        assert_eq!(v, three);
3679
3680        // long, short
3681        v.clone_from(&two);
3682        assert_eq!(v, two);
3683
3684        // short, long
3685        v.clone_from(&three);
3686        assert_eq!(v, three)
3687    }
3688
3689    #[test]
3690    fn vec_retain() {
3691        let mut deq = sdeq![1, 2, 3, 4];
3692        deq.retain(|&x| x % 2 == 0);
3693        assert_eq!(deq, [2, 4]);
3694    }
3695
3696    #[test]
3697    fn vec_dedup() {
3698        fn case(a: SliceDeque<i32>, b: SliceDeque<i32>) {
3699            let mut v = a;
3700            v.dedup();
3701            assert_eq!(v, b);
3702        }
3703        case(sdeq![], sdeq![]);
3704        case(sdeq![1], sdeq![1]);
3705        case(sdeq![1, 1], sdeq![1]);
3706        case(sdeq![1, 2, 3], sdeq![1, 2, 3]);
3707        case(sdeq![1, 1, 2, 3], sdeq![1, 2, 3]);
3708        case(sdeq![1, 2, 2, 3], sdeq![1, 2, 3]);
3709        case(sdeq![1, 2, 3, 3], sdeq![1, 2, 3]);
3710        case(sdeq![1, 1, 2, 2, 2, 3, 3], sdeq![1, 2, 3]);
3711    }
3712
3713    #[test]
3714    fn vec_dedup_by_key() {
3715        fn case(a: SliceDeque<i32>, b: SliceDeque<i32>) {
3716            let mut v = a;
3717            v.dedup_by_key(|i| *i / 10);
3718            assert_eq!(v, b);
3719        }
3720        case(sdeq![], sdeq![]);
3721        case(sdeq![10], sdeq![10]);
3722        case(sdeq![10, 11], sdeq![10]);
3723        case(sdeq![10, 20, 30], sdeq![10, 20, 30]);
3724        case(sdeq![10, 11, 20, 30], sdeq![10, 20, 30]);
3725        case(sdeq![10, 20, 21, 30], sdeq![10, 20, 30]);
3726        case(sdeq![10, 20, 30, 31], sdeq![10, 20, 30]);
3727        case(sdeq![10, 11, 20, 21, 22, 30, 31], sdeq![10, 20, 30]);
3728    }
3729
3730    #[test]
3731    fn vec_dedup_by() {
3732        let mut deq = sdeq!["foo", "bar", "Bar", "baz", "bar"];
3733        deq.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
3734
3735        assert_eq!(deq, ["foo", "bar", "baz", "bar"]);
3736
3737        let mut deq: SliceDeque<(&'static str, i32)> =
3738            sdeq![("foo", 1), ("foo", 2), ("bar", 3), ("bar", 4), ("bar", 5)];
3739        deq.dedup_by(|a, b| {
3740            a.0 == b.0 && {
3741                b.1 += a.1;
3742                true
3743            }
3744        });
3745
3746        assert_eq!(deq, [("foo", 3), ("bar", 12)]);
3747    }
3748
3749    #[cfg(feature = "unstable")]
3750    #[test]
3751    fn vec_dedup_unique() {
3752        let mut v0: SliceDeque<Box<_>> = sdeq![box 1, box 1, box 2, box 3];
3753        v0.dedup();
3754        let mut v1: SliceDeque<Box<_>> = sdeq![box 1, box 2, box 2, box 3];
3755        v1.dedup();
3756        let mut v2: SliceDeque<Box<_>> = sdeq![box 1, box 2, box 3, box 3];
3757        v2.dedup();
3758        // If the boxed pointers were leaked or otherwise misused, valgrind
3759        // and/or rt should raise errors.
3760    }
3761
3762    #[test]
3763    fn zero_sized_values() {
3764        let mut v = SliceDeque::new();
3765        assert_eq!(v.len(), 0);
3766        v.push_back(());
3767        assert_eq!(v.len(), 1);
3768        v.push_back(());
3769        assert_eq!(v.len(), 2);
3770        assert_eq!(v.pop_back(), Some(()));
3771        assert_eq!(v.pop_back(), Some(()));
3772        assert_eq!(v.pop_back(), None);
3773
3774        assert_eq!(v.iter().count(), 0);
3775        v.push_back(());
3776        assert_eq!(v.iter().count(), 1);
3777        v.push_back(());
3778        assert_eq!(v.iter().count(), 2);
3779
3780        for &() in &v {}
3781
3782        assert_eq!(v.iter_mut().count(), 2);
3783        v.push_back(());
3784        assert_eq!(v.iter_mut().count(), 3);
3785        v.push_back(());
3786        assert_eq!(v.iter_mut().count(), 4);
3787
3788        for &mut () in &mut v {}
3789        unsafe {
3790            let len = v.len() as isize;
3791            v.move_tail_unchecked(-len);
3792        }
3793        assert_eq!(v.iter_mut().count(), 0);
3794    }
3795
3796    #[test]
3797    fn vec_partition() {
3798        assert_eq!(
3799            sdeq![].into_iter().partition(|x: &i32| *x < 3),
3800            (sdeq![], sdeq![])
3801        );
3802        assert_eq!(
3803            sdeq![1, 2, 3].into_iter().partition(|x| *x < 4),
3804            (sdeq![1, 2, 3], sdeq![])
3805        );
3806        assert_eq!(
3807            sdeq![1, 2, 3].into_iter().partition(|x| *x < 2),
3808            (sdeq![1], sdeq![2, 3])
3809        );
3810        assert_eq!(
3811            sdeq![1, 2, 3].into_iter().partition(|x| *x < 0),
3812            (sdeq![], sdeq![1, 2, 3])
3813        );
3814    }
3815
3816    #[test]
3817    fn vec_zip_unzip() {
3818        let z1 = sdeq![(1, 4), (2, 5), (3, 6)];
3819
3820        let (left, right): (SliceDeque<_>, SliceDeque<_>) =
3821            z1.iter().cloned().unzip();
3822
3823        assert_eq!((1, 4), (left[0], right[0]));
3824        assert_eq!((2, 5), (left[1], right[1]));
3825        assert_eq!((3, 6), (left[2], right[2]));
3826    }
3827
3828    #[test]
3829    fn vec_vec_truncate_drop() {
3830        static mut DROPS: u32 = 0;
3831        struct Elem(i32);
3832        impl Drop for Elem {
3833            fn drop(&mut self) {
3834                unsafe {
3835                    DROPS += 1;
3836                }
3837            }
3838        }
3839
3840        let mut v = sdeq![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
3841        assert_eq!(unsafe { DROPS }, 0);
3842        v.truncate(3);
3843        assert_eq!(unsafe { DROPS }, 2);
3844        v.truncate(0);
3845        assert_eq!(unsafe { DROPS }, 5);
3846    }
3847
3848    #[test]
3849    fn vec_vec_truncate_front_drop() {
3850        static mut DROPS: u32 = 0;
3851        struct Elem(i32);
3852        impl Drop for Elem {
3853            fn drop(&mut self) {
3854                unsafe {
3855                    DROPS += 1;
3856                }
3857            }
3858        }
3859
3860        let mut v = sdeq![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
3861        assert_eq!(unsafe { DROPS }, 0);
3862        v.truncate_front(3);
3863        assert_eq!(unsafe { DROPS }, 2);
3864        v.truncate_front(0);
3865        assert_eq!(unsafe { DROPS }, 5);
3866    }
3867
3868    #[test]
3869    #[should_panic]
3870    fn vec_vec_truncate_fail() {
3871        struct BadElem(i32);
3872        impl Drop for BadElem {
3873            fn drop(&mut self) {
3874                let BadElem(ref mut x) = *self;
3875                if *x == 0xbadbeef {
3876                    panic!("BadElem panic: 0xbadbeef")
3877                }
3878            }
3879        }
3880
3881        let mut v =
3882            sdeq![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
3883        v.truncate(0);
3884    }
3885
3886    #[test]
3887    fn vec_index() {
3888        let deq = sdeq![1, 2, 3];
3889        assert!(deq[1] == 2);
3890    }
3891
3892    #[test]
3893    #[should_panic]
3894    fn vec_index_out_of_bounds() {
3895        let deq = sdeq![1, 2, 3];
3896        let _ = deq[3];
3897    }
3898
3899    #[test]
3900    #[should_panic]
3901    fn vec_slice_out_of_bounds_1() {
3902        let x = sdeq![1, 2, 3, 4, 5];
3903        &x[!0..];
3904    }
3905
3906    #[test]
3907    #[should_panic]
3908    fn vec_slice_out_of_bounds_2() {
3909        let x = sdeq![1, 2, 3, 4, 5];
3910        &x[..6];
3911    }
3912
3913    #[test]
3914    #[should_panic]
3915    fn vec_slice_out_of_bounds_3() {
3916        let x = sdeq![1, 2, 3, 4, 5];
3917        &x[!0..4];
3918    }
3919
3920    #[test]
3921    #[should_panic]
3922    fn vec_slice_out_of_bounds_4() {
3923        let x = sdeq![1, 2, 3, 4, 5];
3924        &x[1..6];
3925    }
3926
3927    #[test]
3928    #[should_panic]
3929    fn vec_slice_out_of_bounds_5() {
3930        let x = sdeq![1, 2, 3, 4, 5];
3931        &x[3..2];
3932    }
3933
3934    #[test]
3935    fn vec_swap_remove_empty() {
3936        let mut deq = SliceDeque::<i32>::new();
3937        assert_eq!(deq.swap_remove_back(0), None);
3938    }
3939
3940    #[test]
3941    fn vec_move_items() {
3942        let deq = sdeq![1, 2, 3];
3943        let mut deq2 = sdeq![];
3944        for i in deq {
3945            deq2.push_back(i);
3946        }
3947        assert_eq!(deq2, [1, 2, 3]);
3948    }
3949
3950    #[test]
3951    fn vec_move_items_reverse() {
3952        let deq = sdeq![1, 2, 3];
3953        let mut deq2 = sdeq![];
3954        for i in deq.into_iter().rev() {
3955            deq2.push_back(i);
3956        }
3957        assert_eq!(deq2, [3, 2, 1]);
3958    }
3959
3960    #[test]
3961    fn vec_move_items_zero_sized() {
3962        let deq = sdeq![(), (), ()];
3963        let mut deq2 = sdeq![];
3964        for i in deq {
3965            deq2.push_back(i);
3966        }
3967        assert_eq!(deq2, [(), (), ()]);
3968    }
3969
3970    #[test]
3971    fn vec_drain_items() {
3972        let mut deq = sdeq![1, 2, 3];
3973        let mut deq2 = sdeq![];
3974        for i in deq.drain(..) {
3975            deq2.push_back(i);
3976        }
3977        assert_eq!(deq, []);
3978        assert_eq!(deq2, [1, 2, 3]);
3979    }
3980
3981    #[test]
3982    fn vec_drain_items_reverse() {
3983        let mut deq = sdeq![1, 2, 3];
3984        let mut deq2 = sdeq![];
3985        for i in deq.drain(..).rev() {
3986            deq2.push_back(i);
3987        }
3988        assert_eq!(deq, []);
3989        assert_eq!(deq2, [3, 2, 1]);
3990    }
3991
3992    #[test]
3993    fn vec_drain_items_zero_sized() {
3994        let mut deq = sdeq![(), (), ()];
3995        let mut deq2 = sdeq![];
3996        for i in deq.drain(..) {
3997            deq2.push_back(i);
3998        }
3999        assert_eq!(deq, []);
4000        assert_eq!(deq2, [(), (), ()]);
4001    }
4002
4003    #[test]
4004    #[should_panic]
4005    fn vec_drain_out_of_bounds() {
4006        let mut v = sdeq![1, 2, 3, 4, 5];
4007        v.drain(5..6);
4008    }
4009
4010    #[test]
4011    fn vec_drain_range() {
4012        let mut v = sdeq![1, 2, 3, 4, 5];
4013        for _ in v.drain(4..) {}
4014        assert_eq!(v, &[1, 2, 3, 4]);
4015
4016        let mut v: SliceDeque<_> = (1..6).map(|x| x.to_string()).collect();
4017        for _ in v.drain(1..4) {}
4018        assert_eq!(v, &[1.to_string(), 5.to_string()]);
4019
4020        let mut v: SliceDeque<_> = (1..6).map(|x| x.to_string()).collect();
4021        for _ in v.drain(1..4).rev() {}
4022        assert_eq!(v, &[1.to_string(), 5.to_string()]);
4023    }
4024
4025    #[test]
4026    fn vec_drain_range_zst() {
4027        let mut v: SliceDeque<_> = sdeq![(); 5];
4028        for _ in v.drain(1..4).rev() {}
4029        assert_eq!(v, &[(), ()]);
4030    }
4031
4032    #[test]
4033    fn vec_drain_inclusive_range() {
4034        let mut v = sdeq!['a', 'b', 'c', 'd', 'e'];
4035        for _ in v.drain(1..=3) {}
4036        assert_eq!(v, &['a', 'e']);
4037
4038        let mut v: SliceDeque<_> = (0..=5).map(|x| x.to_string()).collect();
4039        for _ in v.drain(1..=5) {}
4040        assert_eq!(v, &["0".to_string()]);
4041
4042        let mut v: SliceDeque<String> =
4043            (0..=5).map(|x| x.to_string()).collect();
4044        for _ in v.drain(0..=5) {}
4045        assert_eq!(v, SliceDeque::<String>::new());
4046
4047        let mut v: SliceDeque<_> = (0..=5).map(|x| x.to_string()).collect();
4048        for _ in v.drain(0..=3) {}
4049        assert_eq!(v, &["4".to_string(), "5".to_string()]);
4050
4051        let mut v: SliceDeque<_> = (0..=1).map(|x| x.to_string()).collect();
4052        for _ in v.drain(..=0) {}
4053        assert_eq!(v, &["1".to_string()]);
4054    }
4055
4056    #[test]
4057    fn vec_drain_max_vec_size() {
4058        const M: usize = isize::max_value() as usize;
4059        let mut v = SliceDeque::<()>::with_capacity(M);
4060        unsafe { v.move_tail_unchecked(M as isize) };
4061        assert_eq!(v.len(), M as usize);
4062        for _ in v.drain(M - 1..) {}
4063        assert_eq!(v.len(), M - 1);
4064
4065        let mut v = SliceDeque::<()>::with_capacity(M);
4066        unsafe { v.move_tail_unchecked(M as isize) };
4067        assert_eq!(v.len(), M as usize);
4068        for _ in v.drain(M - 1..=M - 1) {}
4069        assert_eq!(v.len(), M - 1);
4070    }
4071
4072    #[test]
4073    #[should_panic]
4074    fn vec_drain_inclusive_out_of_bounds() {
4075        let mut v = sdeq![1, 2, 3, 4, 5];
4076        v.drain(5..=5);
4077    }
4078
4079    #[test]
4080    fn vec_splice() {
4081        let mut v = sdeq![1, 2, 3, 4, 5];
4082        let a = [10, 11, 12];
4083        v.splice(2..4, a.iter().cloned());
4084        assert_eq!(v, &[1, 2, 10, 11, 12, 5]);
4085        v.splice(1..3, Some(20));
4086        assert_eq!(v, &[1, 20, 11, 12, 5]);
4087    }
4088
4089    #[test]
4090    fn vec_splice_inclusive_range() {
4091        let mut v = sdeq![1, 2, 3, 4, 5];
4092        let a = [10, 11, 12];
4093        let t1: SliceDeque<_> = v.splice(2..=3, a.iter().cloned()).collect();
4094        assert_eq!(v, &[1, 2, 10, 11, 12, 5]);
4095        assert_eq!(t1, &[3, 4]);
4096        let t2: SliceDeque<_> = v.splice(1..=2, Some(20)).collect();
4097        assert_eq!(v, &[1, 20, 11, 12, 5]);
4098        assert_eq!(t2, &[2, 10]);
4099    }
4100
4101    #[test]
4102    #[should_panic]
4103    fn vec_splice_out_of_bounds() {
4104        let mut v = sdeq![1, 2, 3, 4, 5];
4105        let a = [10, 11, 12];
4106        v.splice(5..6, a.iter().cloned());
4107    }
4108
4109    #[test]
4110    #[should_panic]
4111    fn vec_splice_inclusive_out_of_bounds() {
4112        let mut v = sdeq![1, 2, 3, 4, 5];
4113        let a = [10, 11, 12];
4114        v.splice(5..=5, a.iter().cloned());
4115    }
4116
4117    #[test]
4118    fn vec_splice_items_zero_sized() {
4119        let mut deq = sdeq![(), (), ()];
4120        let deq2 = sdeq![];
4121        let t: SliceDeque<_> =
4122            deq.splice(1..2, deq2.iter().cloned()).collect();
4123        assert_eq!(deq, &[(), ()]);
4124        assert_eq!(t, &[()]);
4125    }
4126
4127    #[test]
4128    fn vec_splice_unbounded() {
4129        let mut deq = sdeq![1, 2, 3, 4, 5];
4130        let t: SliceDeque<_> = deq.splice(.., None).collect();
4131        assert_eq!(deq, &[]);
4132        assert_eq!(t, &[1, 2, 3, 4, 5]);
4133    }
4134
4135    #[test]
4136    fn vec_splice_forget() {
4137        let mut v = sdeq![1, 2, 3, 4, 5];
4138        let a = [10, 11, 12];
4139        mem::forget(v.splice(2..4, a.iter().cloned()));
4140        assert_eq!(v, &[1, 2]);
4141    }
4142
4143    /* into_boxed_slice probably can't be supported portably
4144    #[test]
4145    fn vec_into_boxed_slice() {
4146        let xs = sdeq![1, 2, 3];
4147        let ys = xs.into_boxed_slice();
4148        assert_eq!(&*ys, [1, 2, 3]);
4149    }
4150    */
4151
4152    #[test]
4153    fn vec_append() {
4154        let mut deq = sdeq![1, 2, 3];
4155        let mut deq2 = sdeq![4, 5, 6];
4156        deq.append(&mut deq2);
4157        assert_eq!(deq, [1, 2, 3, 4, 5, 6]);
4158        assert_eq!(deq2, []);
4159    }
4160
4161    #[test]
4162    fn vec_split_off() {
4163        let mut deq = sdeq![1, 2, 3, 4, 5, 6];
4164        let deq2 = deq.split_off(4);
4165        assert_eq!(deq, [1, 2, 3, 4]);
4166        assert_eq!(deq2, [5, 6]);
4167    }
4168
4169    #[test]
4170    fn vec_into_iter_as_slice() {
4171        let deq = sdeq!['a', 'b', 'c'];
4172        let mut into_iter = deq.into_iter();
4173        assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
4174        let _ = into_iter.next().unwrap();
4175        assert_eq!(into_iter.as_slice(), &['b', 'c']);
4176        let _ = into_iter.next().unwrap();
4177        let _ = into_iter.next().unwrap();
4178        assert_eq!(into_iter.as_slice(), &[]);
4179    }
4180
4181    #[test]
4182    fn vec_into_iter_as_mut_slice() {
4183        let deq = sdeq!['a', 'b', 'c'];
4184        let mut into_iter = deq.into_iter();
4185        assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
4186        into_iter.as_mut_slice()[0] = 'x';
4187        into_iter.as_mut_slice()[1] = 'y';
4188        assert_eq!(into_iter.next().unwrap(), 'x');
4189        assert_eq!(into_iter.as_slice(), &['y', 'c']);
4190    }
4191
4192    #[test]
4193    fn vec_into_iter_debug() {
4194        let deq = sdeq!['a', 'b', 'c'];
4195        let into_iter = deq.into_iter();
4196        let debug = format!("{:?}", into_iter);
4197        assert_eq!(debug, "IntoIter(['a', 'b', 'c'])");
4198    }
4199
4200    #[test]
4201    fn vec_into_iter_count() {
4202        assert_eq!(sdeq![1, 2, 3].into_iter().count(), 3);
4203    }
4204
4205    #[test]
4206    fn vec_into_iter_clone() {
4207        fn iter_equal<I: Iterator<Item = i32>>(it: I, slice: &[i32]) {
4208            let v: SliceDeque<i32> = it.collect();
4209            assert_eq!(&v[..], slice);
4210        }
4211        let deq = sdeq![1, 2, 3];
4212        let mut it = deq.into_iter();
4213        let it_c = it.clone();
4214        iter_equal(it_c, &[1, 2, 3]);
4215        assert_eq!(it.next(), Some(1));
4216        let mut it = it.rev();
4217        iter_equal(it.clone(), &[3, 2]);
4218        assert_eq!(it.next(), Some(3));
4219        iter_equal(it.clone(), &[2]);
4220        assert_eq!(it.next(), Some(2));
4221        iter_equal(it.clone(), &[]);
4222        assert_eq!(it.next(), None);
4223    }
4224
4225    /* TODO: Cow support
4226    #[test]
4227        fn vec_cow_from() {
4228            use std::borrow::Cow;
4229        let borrowed: &[_] = &["borrowed", "(slice)"];
4230        let owned = sdeq!["owned", "(vec)"];
4231        match (Cow::from(owned.clone()), Cow::from(borrowed)) {
4232            (Cow::Owned(o), Cow::Borrowed(b)) => assert!(o == owned && b == borrowed),
4233            _ => panic!("invalid `Cow::from`"),
4234        }
4235    }
4236
4237    #[test]
4238        fn vec_from_cow() {
4239            use std::borrow::Cow;
4240        let borrowed: &[_] = &["borrowed", "(slice)"];
4241        let owned = sdeq!["owned", "(vec)"];
4242        assert_eq!(SliceDeque::from(Cow::Borrowed(borrowed)), sdeq!["borrowed", "(slice)"]);
4243        assert_eq!(SliceDeque::from(Cow::Owned(owned)), sdeq!["owned", "(vec)"]);
4244    }
4245         */
4246
4247    /* TODO: covariance
4248    use super::{Drain, IntoIter};
4249
4250    #[allow(dead_code)]
4251    fn assert_covariance() {
4252        fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
4253            d
4254        }
4255        fn into_iter<'new>(i: IntoIter<&'static str>) -> IntoIter<&'new str> {
4256            i
4257        }
4258    }
4259        */
4260
4261    #[test]
4262    fn from_into_inner() {
4263        let deq = sdeq![1, 2, 3];
4264        #[allow(unused_variables)]
4265        let ptr = deq.as_ptr();
4266        let deq = deq.into_iter().collect::<SliceDeque<_>>();
4267        assert_eq!(deq, [1, 2, 3]);
4268        #[cfg(feature = "unstable")]
4269        {
4270            assert_eq!(deq.as_ptr(), ptr);
4271        }
4272
4273        let ptr = &deq[1] as *const _;
4274        let mut it = deq.into_iter();
4275        it.next().unwrap();
4276        let deq = it.collect::<SliceDeque<_>>();
4277        assert_eq!(deq, [2, 3]);
4278        assert!(ptr != deq.as_ptr());
4279    }
4280
4281    #[cfg(feature = "unstable")]
4282    #[test]
4283    fn overaligned_allocations() {
4284        #[repr(align(256))]
4285        struct Foo(usize);
4286        let mut v = sdeq![Foo(273)];
4287        for i in 0..0x1000 {
4288            v.reserve_exact(i);
4289            assert!(v[0].0 == 273);
4290            assert!(v.as_ptr() as usize & 0xff == 0);
4291            v.shrink_to_fit();
4292            assert!(v[0].0 == 273);
4293            assert!(v.as_ptr() as usize & 0xff == 0);
4294        }
4295    }
4296
4297    #[test]
4298    fn drain_filter_empty() {
4299        let mut deq: SliceDeque<i32> = sdeq![];
4300
4301        {
4302            let mut iter = deq.drain_filter(|_| true);
4303            assert_eq!(iter.size_hint(), (0, Some(0)));
4304            assert_eq!(iter.next(), None);
4305            assert_eq!(iter.size_hint(), (0, Some(0)));
4306            assert_eq!(iter.next(), None);
4307            assert_eq!(iter.size_hint(), (0, Some(0)));
4308        }
4309        assert_eq!(deq.len(), 0);
4310        assert_eq!(deq, sdeq![]);
4311    }
4312
4313    #[test]
4314    fn drain_filter_zst() {
4315        let mut deq = sdeq![(), (), (), (), ()];
4316        let initial_len = deq.len();
4317        let mut count = 0;
4318        {
4319            let mut iter = deq.drain_filter(|_| true);
4320            assert_eq!(iter.size_hint(), (0, Some(initial_len)));
4321            while let Some(_) = iter.next() {
4322                count += 1;
4323                assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
4324            }
4325            assert_eq!(iter.size_hint(), (0, Some(0)));
4326            assert_eq!(iter.next(), None);
4327            assert_eq!(iter.size_hint(), (0, Some(0)));
4328        }
4329
4330        assert_eq!(count, initial_len);
4331        assert_eq!(deq.len(), 0);
4332        assert_eq!(deq, sdeq![]);
4333    }
4334
4335    #[test]
4336    fn drain_filter_false() {
4337        let mut deq = sdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
4338
4339        let initial_len = deq.len();
4340        let mut count = 0;
4341        {
4342            let mut iter = deq.drain_filter(|_| false);
4343            assert_eq!(iter.size_hint(), (0, Some(initial_len)));
4344            for _ in iter.by_ref() {
4345                count += 1;
4346            }
4347            assert_eq!(iter.size_hint(), (0, Some(0)));
4348            assert_eq!(iter.next(), None);
4349            assert_eq!(iter.size_hint(), (0, Some(0)));
4350        }
4351
4352        assert_eq!(count, 0);
4353        assert_eq!(deq.len(), initial_len);
4354        assert_eq!(deq, sdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
4355    }
4356
4357    #[test]
4358    fn drain_filter_true() {
4359        let mut deq = sdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
4360
4361        let initial_len = deq.len();
4362        let mut count = 0;
4363        {
4364            let mut iter = deq.drain_filter(|_| true);
4365            assert_eq!(iter.size_hint(), (0, Some(initial_len)));
4366            while let Some(_) = iter.next() {
4367                count += 1;
4368                assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
4369            }
4370            assert_eq!(iter.size_hint(), (0, Some(0)));
4371            assert_eq!(iter.next(), None);
4372            assert_eq!(iter.size_hint(), (0, Some(0)));
4373        }
4374
4375        assert_eq!(count, initial_len);
4376        assert_eq!(deq.len(), 0);
4377        assert_eq!(deq, sdeq![]);
4378    }
4379
4380    #[test]
4381    fn drain_filter_complex() {
4382        {
4383            //                [+xxx++++++xxxxx++++x+x++]
4384            let mut deq = sdeq![
4385                1, 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29,
4386                31, 33, 34, 35, 36, 37, 39,
4387            ];
4388
4389            let removed =
4390                deq.drain_filter(|x| *x % 2 == 0).collect::<SliceDeque<_>>();
4391            assert_eq!(removed.len(), 10);
4392            assert_eq!(removed, sdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
4393
4394            assert_eq!(deq.len(), 14);
4395            assert_eq!(
4396                deq,
4397                sdeq![1, 7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
4398            );
4399        }
4400
4401        {
4402            //                [xxx++++++xxxxx++++x+x++]
4403            let mut deq = sdeq![
4404                2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31,
4405                33, 34, 35, 36, 37, 39,
4406            ];
4407
4408            let removed =
4409                deq.drain_filter(|x| *x % 2 == 0).collect::<SliceDeque<_>>();
4410            assert_eq!(removed.len(), 10);
4411            assert_eq!(removed, sdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
4412
4413            assert_eq!(deq.len(), 13);
4414            assert_eq!(
4415                deq,
4416                sdeq![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
4417            );
4418        }
4419
4420        {
4421            //                [xxx++++++xxxxx++++x+x]
4422            let mut deq = sdeq![
4423                2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31,
4424                33, 34, 35, 36,
4425            ];
4426
4427            let removed =
4428                deq.drain_filter(|x| *x % 2 == 0).collect::<SliceDeque<_>>();
4429            assert_eq!(removed.len(), 10);
4430            assert_eq!(removed, sdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
4431
4432            assert_eq!(deq.len(), 11);
4433            assert_eq!(deq, sdeq![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35]);
4434        }
4435
4436        {
4437            //                [xxxxxxxxxx+++++++++++]
4438            let mut deq = sdeq![
4439                2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 1, 3, 5, 7, 9, 11, 13, 15,
4440                17, 19,
4441            ];
4442
4443            let removed =
4444                deq.drain_filter(|x| *x % 2 == 0).collect::<SliceDeque<_>>();
4445            assert_eq!(removed.len(), 10);
4446            assert_eq!(removed, sdeq![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
4447
4448            assert_eq!(deq.len(), 10);
4449            assert_eq!(deq, sdeq![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
4450        }
4451
4452        {
4453            //                [+++++++++++xxxxxxxxxx]
4454            let mut deq = sdeq![
4455                1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 2, 4, 6, 8, 10, 12, 14, 16,
4456                18, 20,
4457            ];
4458
4459            let removed =
4460                deq.drain_filter(|x| *x % 2 == 0).collect::<SliceDeque<_>>();
4461            assert_eq!(removed.len(), 10);
4462            assert_eq!(removed, sdeq![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
4463
4464            assert_eq!(deq.len(), 10);
4465            assert_eq!(deq, sdeq![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
4466        }
4467    }
4468
4469    #[test]
4470    fn vecdeque_simple() {
4471        let mut d = SliceDeque::new();
4472        assert_eq!(d.len(), 0);
4473        d.push_front(17);
4474        d.push_front(42);
4475        d.push_back(137);
4476        assert_eq!(d.len(), 3);
4477        d.push_back(137);
4478        assert_eq!(d.len(), 4);
4479        assert_eq!(*d.front().unwrap(), 42);
4480        assert_eq!(*d.back().unwrap(), 137);
4481        let mut i = d.pop_front();
4482        assert_eq!(i, Some(42));
4483        i = d.pop_back();
4484        assert_eq!(i, Some(137));
4485        i = d.pop_back();
4486        assert_eq!(i, Some(137));
4487        i = d.pop_back();
4488        assert_eq!(i, Some(17));
4489        assert_eq!(d.len(), 0);
4490        d.push_back(3);
4491        assert_eq!(d.len(), 1);
4492        d.push_front(2);
4493        assert_eq!(d.len(), 2);
4494        d.push_back(4);
4495        assert_eq!(d.len(), 3);
4496        d.push_front(1);
4497        assert_eq!(d.len(), 4);
4498        assert_eq!(d[0], 1);
4499        assert_eq!(d[1], 2);
4500        assert_eq!(d[2], 3);
4501        assert_eq!(d[3], 4);
4502    }
4503
4504    #[cfg(test)]
4505    fn vecdeque_parameterized<T: Clone + PartialEq + fmt::Debug>(
4506        a: T, b: T, c: T, d: T,
4507    ) {
4508        let mut deq = SliceDeque::new();
4509        assert_eq!(deq.len(), 0);
4510        deq.push_front(a.clone());
4511        deq.push_front(b.clone());
4512        deq.push_back(c.clone());
4513        assert_eq!(deq.len(), 3);
4514        deq.push_back(d.clone());
4515        assert_eq!(deq.len(), 4);
4516        assert_eq!((*deq.front().unwrap()).clone(), b.clone());
4517        assert_eq!((*deq.back().unwrap()).clone(), d.clone());
4518        assert_eq!(deq.pop_front().unwrap(), b.clone());
4519        assert_eq!(deq.pop_back().unwrap(), d.clone());
4520        assert_eq!(deq.pop_back().unwrap(), c.clone());
4521        assert_eq!(deq.pop_back().unwrap(), a.clone());
4522        assert_eq!(deq.len(), 0);
4523        deq.push_back(c.clone());
4524        assert_eq!(deq.len(), 1);
4525        deq.push_front(b.clone());
4526        assert_eq!(deq.len(), 2);
4527        deq.push_back(d.clone());
4528        assert_eq!(deq.len(), 3);
4529        deq.push_front(a.clone());
4530        assert_eq!(deq.len(), 4);
4531        assert_eq!(deq[0].clone(), a.clone());
4532        assert_eq!(deq[1].clone(), b.clone());
4533        assert_eq!(deq[2].clone(), c.clone());
4534        assert_eq!(deq[3].clone(), d.clone());
4535    }
4536
4537    #[test]
4538    fn vecdeque_push_front_grow() {
4539        let mut deq = SliceDeque::new();
4540        for i in 0..66 {
4541            deq.push_front(i);
4542        }
4543        assert_eq!(deq.len(), 66);
4544
4545        for i in 0..66 {
4546            assert_eq!(deq[i], 65 - i);
4547        }
4548
4549        let mut deq = SliceDeque::new();
4550        for i in 0..66 {
4551            deq.push_back(i);
4552        }
4553
4554        for i in 0..66 {
4555            assert_eq!(deq[i], i);
4556        }
4557    }
4558
4559    #[test]
4560    fn vecdeque_index() {
4561        let mut deq = SliceDeque::new();
4562        for i in 1..4 {
4563            deq.push_front(i);
4564        }
4565        assert_eq!(deq[1], 2);
4566    }
4567
4568    #[test]
4569    #[should_panic]
4570    fn vecdeque_index_out_of_bounds() {
4571        let mut deq = SliceDeque::new();
4572        for i in 1..4 {
4573            deq.push_front(i);
4574        }
4575        deq[3];
4576    }
4577
4578    #[derive(Clone, PartialEq, Debug)]
4579    enum Taggy {
4580        One(i32),
4581        Two(i32, i32),
4582        Three(i32, i32, i32),
4583    }
4584
4585    #[derive(Clone, PartialEq, Debug)]
4586    enum Taggypar<T> {
4587        Onepar(T),
4588        Twopar(T, T),
4589        Threepar(T, T, T),
4590    }
4591
4592    #[derive(Clone, PartialEq, Debug)]
4593    struct RecCy {
4594        x: i32,
4595        y: i32,
4596        t: Taggy,
4597    }
4598
4599    use self::Taggy::*;
4600    use self::Taggypar::*;
4601
4602    fn hash<T: hash::Hash>(t: &T) -> u64 {
4603        let mut s = collections::hash_map::DefaultHasher::new();
4604        use hash::Hasher;
4605        t.hash(&mut s);
4606        s.finish()
4607    }
4608
4609    #[test]
4610    fn vecdeque_param_int() {
4611        vecdeque_parameterized::<i32>(5, 72, 64, 175);
4612    }
4613
4614    #[test]
4615    fn vecdeque_param_taggy() {
4616        vecdeque_parameterized::<Taggy>(
4617            One(1),
4618            Two(1, 2),
4619            Three(1, 2, 3),
4620            Two(17, 42),
4621        );
4622    }
4623
4624    #[test]
4625    fn vecdeque_param_taggypar() {
4626        vecdeque_parameterized::<Taggypar<i32>>(
4627            Onepar::<i32>(1),
4628            Twopar::<i32>(1, 2),
4629            Threepar::<i32>(1, 2, 3),
4630            Twopar::<i32>(17, 42),
4631        );
4632    }
4633
4634    #[test]
4635    fn vecdeque_param_reccy() {
4636        let reccy1 = RecCy {
4637            x: 1,
4638            y: 2,
4639            t: One(1),
4640        };
4641        let reccy2 = RecCy {
4642            x: 345,
4643            y: 2,
4644            t: Two(1, 2),
4645        };
4646        let reccy3 = RecCy {
4647            x: 1,
4648            y: 777,
4649            t: Three(1, 2, 3),
4650        };
4651        let reccy4 = RecCy {
4652            x: 19,
4653            y: 252,
4654            t: Two(17, 42),
4655        };
4656        vecdeque_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
4657    }
4658
4659    #[test]
4660    fn vecdeque_with_capacity() {
4661        let mut d = SliceDeque::with_capacity(0);
4662        d.push_back(1);
4663        assert_eq!(d.len(), 1);
4664        let mut d = SliceDeque::with_capacity(50);
4665        d.push_back(1);
4666        assert_eq!(d.len(), 1);
4667    }
4668
4669    #[test]
4670    fn vecdeque_with_capacity_non_power_two() {
4671        let mut d3 = SliceDeque::with_capacity(3);
4672        d3.push_back(1);
4673
4674        // X = None, | = lo
4675        // [|1, X, X]
4676        assert_eq!(d3.pop_front(), Some(1));
4677        // [X, |X, X]
4678        assert_eq!(d3.front(), None);
4679
4680        // [X, |3, X]
4681        d3.push_back(3);
4682        // [X, |3, 6]
4683        d3.push_back(6);
4684        // [X, X, |6]
4685        assert_eq!(d3.pop_front(), Some(3));
4686
4687        // Pushing the lo past half way point to trigger
4688        // the 'B' scenario for growth
4689        // [9, X, |6]
4690        d3.push_back(9);
4691        // [9, 12, |6]
4692        d3.push_back(12);
4693
4694        d3.push_back(15);
4695        // There used to be a bug here about how the
4696        // SliceDeque made growth assumptions about the
4697        // underlying Vec which didn't hold and lead
4698        // to corruption.
4699        // (Vec grows to next power of two)
4700        // good- [9, 12, 15, X, X, X, X, |6]
4701        // bug-  [15, 12, X, X, X, |6, X, X]
4702        assert_eq!(d3.pop_front(), Some(6));
4703
4704        // Which leads us to the following state which
4705        // would be a failure case.
4706        // bug-  [15, 12, X, X, X, X, |X, X]
4707        assert_eq!(d3.front(), Some(&9));
4708    }
4709
4710    #[test]
4711    fn vecdeque_reserve_exact() {
4712        let mut d = SliceDeque::new();
4713        d.push_back(0);
4714        d.reserve_exact(50);
4715        assert!(d.capacity() >= 51);
4716    }
4717
4718    #[test]
4719    fn vecdeque_reserve() {
4720        let mut d = SliceDeque::new();
4721        d.push_back(0);
4722        d.reserve(50);
4723        assert!(d.capacity() >= 51);
4724    }
4725
4726    #[test]
4727    fn vecdeque_swap() {
4728        let mut d: SliceDeque<_> = (0..5).collect();
4729        d.pop_front();
4730        d.swap(0, 3);
4731        assert_eq!(d.iter().cloned().collect::<Vec<_>>(), [4, 2, 3, 1]);
4732    }
4733
4734    #[test]
4735    fn vecdeque_iter() {
4736        let mut d = SliceDeque::new();
4737        assert_eq!(d.iter().next(), None);
4738        assert_eq!(d.iter().size_hint(), (0, Some(0)));
4739
4740        for i in 0..5 {
4741            d.push_back(i);
4742        }
4743        {
4744            let b: &[_] = &[&0, &1, &2, &3, &4];
4745            assert_eq!(d.iter().collect::<Vec<_>>(), b);
4746        }
4747
4748        for i in 6..9 {
4749            d.push_front(i);
4750        }
4751        {
4752            let b: &[_] = &[&8, &7, &6, &0, &1, &2, &3, &4];
4753            assert_eq!(d.iter().collect::<Vec<_>>(), b);
4754        }
4755
4756        let mut it = d.iter();
4757        let mut len = d.len();
4758        loop {
4759            match it.next() {
4760                None => break,
4761                _ => {
4762                    len -= 1;
4763                    assert_eq!(it.size_hint(), (len, Some(len)))
4764                }
4765            }
4766        }
4767    }
4768
4769    #[test]
4770    fn vecdeque_rev_iter() {
4771        let mut d = SliceDeque::new();
4772        assert_eq!(d.iter().rev().next(), None);
4773
4774        for i in 0..5 {
4775            d.push_back(i);
4776        }
4777        {
4778            let b: &[_] = &[&4, &3, &2, &1, &0];
4779            assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
4780        }
4781
4782        for i in 6..9 {
4783            d.push_front(i);
4784        }
4785        let b: &[_] = &[&4, &3, &2, &1, &0, &6, &7, &8];
4786        assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
4787    }
4788
4789    #[test]
4790    fn vecdeque_mut_rev_iter_wrap() {
4791        let mut d = SliceDeque::with_capacity(3);
4792        assert!(d.iter_mut().rev().next().is_none());
4793
4794        d.push_back(1);
4795        d.push_back(2);
4796        d.push_back(3);
4797        assert_eq!(d.pop_front(), Some(1));
4798        d.push_back(4);
4799
4800        assert_eq!(
4801            d.iter_mut().rev().map(|x| *x).collect::<Vec<_>>(),
4802            vec![4, 3, 2]
4803        );
4804    }
4805
4806    #[test]
4807    fn vecdeque_mut_iter() {
4808        let mut d = SliceDeque::new();
4809        assert!(d.iter_mut().next().is_none());
4810
4811        for i in 0..3 {
4812            d.push_front(i);
4813        }
4814
4815        for (i, elt) in d.iter_mut().enumerate() {
4816            assert_eq!(*elt, 2 - i);
4817            *elt = i;
4818        }
4819
4820        {
4821            let mut it = d.iter_mut();
4822            assert_eq!(*it.next().unwrap(), 0);
4823            assert_eq!(*it.next().unwrap(), 1);
4824            assert_eq!(*it.next().unwrap(), 2);
4825            assert!(it.next().is_none());
4826        }
4827    }
4828
4829    #[test]
4830    fn vecdeque_mut_rev_iter() {
4831        let mut d = SliceDeque::new();
4832        assert!(d.iter_mut().rev().next().is_none());
4833
4834        for i in 0..3 {
4835            d.push_front(i);
4836        }
4837
4838        for (i, elt) in d.iter_mut().rev().enumerate() {
4839            assert_eq!(*elt, i);
4840            *elt = i;
4841        }
4842
4843        {
4844            let mut it = d.iter_mut().rev();
4845            assert_eq!(*it.next().unwrap(), 0);
4846            assert_eq!(*it.next().unwrap(), 1);
4847            assert_eq!(*it.next().unwrap(), 2);
4848            assert!(it.next().is_none());
4849        }
4850    }
4851
4852    #[test]
4853    fn vecdeque_into_iter() {
4854        // Empty iter
4855        {
4856            let d: SliceDeque<i32> = SliceDeque::new();
4857            let mut iter = d.into_iter();
4858
4859            assert_eq!(iter.size_hint(), (0, Some(0)));
4860            assert_eq!(iter.next(), None);
4861            assert_eq!(iter.size_hint(), (0, Some(0)));
4862        }
4863
4864        // simple iter
4865        {
4866            let mut d = SliceDeque::new();
4867            for i in 0..5 {
4868                d.push_back(i);
4869            }
4870
4871            let b = vec![0, 1, 2, 3, 4];
4872            assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
4873        }
4874
4875        // wrapped iter
4876        {
4877            let mut d = SliceDeque::new();
4878            for i in 0..5 {
4879                d.push_back(i);
4880            }
4881            for i in 6..9 {
4882                d.push_front(i);
4883            }
4884
4885            let b = vec![8, 7, 6, 0, 1, 2, 3, 4];
4886            assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
4887        }
4888
4889        // partially used
4890        {
4891            let mut d = SliceDeque::new();
4892            for i in 0..5 {
4893                d.push_back(i);
4894            }
4895            for i in 6..9 {
4896                d.push_front(i);
4897            }
4898
4899            let mut it = d.into_iter();
4900            assert_eq!(it.size_hint(), (8, Some(8)));
4901            assert_eq!(it.next(), Some(8));
4902            assert_eq!(it.size_hint(), (7, Some(7)));
4903            assert_eq!(it.next_back(), Some(4));
4904            assert_eq!(it.size_hint(), (6, Some(6)));
4905            assert_eq!(it.next(), Some(7));
4906            assert_eq!(it.size_hint(), (5, Some(5)));
4907        }
4908    }
4909
4910    #[test]
4911    fn vecdeque_drain() {
4912        // Empty iter
4913        {
4914            let mut d: SliceDeque<i32> = SliceDeque::new();
4915
4916            {
4917                let mut iter = d.drain(..);
4918
4919                assert_eq!(iter.size_hint(), (0, Some(0)));
4920                assert_eq!(iter.next(), None);
4921                assert_eq!(iter.size_hint(), (0, Some(0)));
4922            }
4923
4924            assert!(d.is_empty());
4925        }
4926
4927        // simple iter
4928        {
4929            let mut d = SliceDeque::new();
4930            for i in 0..5 {
4931                d.push_back(i);
4932            }
4933
4934            assert_eq!(d.drain(..).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
4935            assert!(d.is_empty());
4936        }
4937
4938        // wrapped iter
4939        {
4940            let mut d = SliceDeque::new();
4941            for i in 0..5 {
4942                d.push_back(i);
4943            }
4944            for i in 6..9 {
4945                d.push_front(i);
4946            }
4947
4948            assert_eq!(
4949                d.drain(..).collect::<Vec<_>>(),
4950                [8, 7, 6, 0, 1, 2, 3, 4]
4951            );
4952            assert!(d.is_empty());
4953        }
4954
4955        // partially used
4956        {
4957            let mut d: SliceDeque<_> = SliceDeque::new();
4958            for i in 0..5 {
4959                d.push_back(i);
4960            }
4961            for i in 6..9 {
4962                d.push_front(i);
4963            }
4964
4965            {
4966                let mut it = d.drain(..);
4967                assert_eq!(it.size_hint(), (8, Some(8)));
4968                assert_eq!(it.next(), Some(8));
4969                assert_eq!(it.size_hint(), (7, Some(7)));
4970                assert_eq!(it.next_back(), Some(4));
4971                assert_eq!(it.size_hint(), (6, Some(6)));
4972                assert_eq!(it.next(), Some(7));
4973                assert_eq!(it.size_hint(), (5, Some(5)));
4974            }
4975            assert!(d.is_empty());
4976        }
4977    }
4978
4979    #[cfg(feature = "unstable")]
4980    #[test]
4981    fn vecdeque_from_iter() {
4982        let v = vec![1, 2, 3, 4, 5, 6, 7];
4983        let deq: SliceDeque<_> = v.iter().cloned().collect();
4984        let u: Vec<_> = deq.iter().cloned().collect();
4985        assert_eq!(u, v);
4986
4987        let seq = (0..).step_by(2).take(256);
4988        let deq: SliceDeque<_> = seq.collect();
4989        for (i, &x) in deq.iter().enumerate() {
4990            assert_eq!(2 * i, x);
4991        }
4992        assert_eq!(deq.len(), 256);
4993    }
4994
4995    #[test]
4996    fn vecdeque_clone() {
4997        let mut d = SliceDeque::new();
4998        d.push_front(17);
4999        d.push_front(42);
5000        d.push_back(137);
5001        d.push_back(137);
5002        assert_eq!(d.len(), 4);
5003        let mut e = d.clone();
5004        assert_eq!(e.len(), 4);
5005        while !d.is_empty() {
5006            assert_eq!(d.pop_back(), e.pop_back());
5007        }
5008        assert_eq!(d.len(), 0);
5009        assert_eq!(e.len(), 0);
5010    }
5011
5012    #[test]
5013    fn vecdeque_eq() {
5014        let mut d = SliceDeque::new();
5015        assert!(d == SliceDeque::with_capacity(0));
5016        d.push_front(137);
5017        d.push_front(17);
5018        d.push_front(42);
5019        d.push_back(137);
5020        let mut e = SliceDeque::with_capacity(0);
5021        e.push_back(42);
5022        e.push_back(17);
5023        e.push_back(137);
5024        e.push_back(137);
5025        assert!(&e == &d);
5026        e.pop_back();
5027        e.push_back(0);
5028        assert!(e != d);
5029        e.clear();
5030        assert!(e == SliceDeque::new());
5031    }
5032
5033    #[test]
5034    fn vecdeque_partial_eq_array() {
5035        let d = SliceDeque::<char>::new();
5036        assert!(d == []);
5037
5038        let mut d = SliceDeque::new();
5039        d.push_front('a');
5040        assert!(d == ['a']);
5041
5042        let mut d = SliceDeque::new();
5043        d.push_back('a');
5044        assert!(d == ['a']);
5045
5046        let mut d = SliceDeque::new();
5047        d.push_back('a');
5048        d.push_back('b');
5049        assert!(d == ['a', 'b']);
5050    }
5051
5052    #[test]
5053    fn vecdeque_hash() {
5054        let mut x = SliceDeque::new();
5055        let mut y = SliceDeque::new();
5056
5057        x.push_back(1);
5058        x.push_back(2);
5059        x.push_back(3);
5060
5061        y.push_back(0);
5062        y.push_back(1);
5063        y.pop_front();
5064        y.push_back(2);
5065        y.push_back(3);
5066
5067        assert!(hash(&x) == hash(&y));
5068    }
5069
5070    #[test]
5071    fn vecdeque_hash_after_rotation() {
5072        // test that two deques hash equal even if elements are laid out
5073        // differently
5074        let len = 28;
5075        let mut ring: SliceDeque<i32> = (0..len as i32).collect();
5076        let orig = ring.clone();
5077        for _ in 0..ring.capacity() {
5078            // shift values 1 step to the right by pop, sub one, push
5079            ring.pop_front();
5080            for elt in &mut ring {
5081                *elt -= 1;
5082            }
5083            ring.push_back(len - 1);
5084            assert_eq!(hash(&orig), hash(&ring));
5085            assert_eq!(orig, ring);
5086            assert_eq!(ring, orig);
5087        }
5088    }
5089
5090    #[test]
5091    fn vecdeque_eq_after_rotation() {
5092        // test that two deques are equal even if elements are laid out
5093        // differently
5094        let len = 28;
5095        let mut ring: SliceDeque<i32> = (0..len as i32).collect();
5096        let mut shifted = ring.clone();
5097        for _ in 0..10 {
5098            // shift values 1 step to the right by pop, sub one, push
5099            ring.pop_front();
5100            for elt in &mut ring {
5101                *elt -= 1;
5102            }
5103            ring.push_back(len - 1);
5104        }
5105
5106        // try every shift
5107        for _ in 0..shifted.capacity() {
5108            shifted.pop_front();
5109            for elt in &mut shifted {
5110                *elt -= 1;
5111            }
5112            shifted.push_back(len - 1);
5113            assert_eq!(shifted, ring);
5114            assert_eq!(ring, shifted);
5115        }
5116    }
5117
5118    #[test]
5119    fn vecdeque_ord() {
5120        let x = SliceDeque::new();
5121        let mut y = SliceDeque::new();
5122        y.push_back(1);
5123        y.push_back(2);
5124        y.push_back(3);
5125        assert!(x < y);
5126        assert!(y > x);
5127        assert!(x <= x);
5128        assert!(x >= x);
5129    }
5130
5131    #[test]
5132    fn vecdeque_show() {
5133        let ringbuf: SliceDeque<_> = (0..10).collect();
5134        assert_eq!(format!("{:?}", ringbuf), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
5135
5136        let ringbuf: SliceDeque<_> = vec!["just", "one", "test", "more"]
5137            .iter()
5138            .cloned()
5139            .collect();
5140        assert_eq!(
5141            format!("{:?}", ringbuf),
5142            "[\"just\", \"one\", \"test\", \"more\"]"
5143        );
5144    }
5145
5146    #[test]
5147    fn vecdeque_drop_zst() {
5148        static mut DROPS: i32 = 0;
5149        struct Elem;
5150        impl Drop for Elem {
5151            fn drop(&mut self) {
5152                unsafe {
5153                    DROPS += 1;
5154                }
5155            }
5156        }
5157
5158        let mut ring = SliceDeque::new();
5159        ring.push_back(Elem);
5160        ring.push_front(Elem);
5161        ring.push_back(Elem);
5162        ring.push_front(Elem);
5163        mem::drop(ring);
5164
5165        assert_eq!(unsafe { DROPS }, 4);
5166    }
5167
5168    #[test]
5169    fn vecdeque_drop() {
5170        static mut DROPS: i32 = 0;
5171        #[derive(Clone)]
5172        struct Elem(i32);
5173        impl Drop for Elem {
5174            fn drop(&mut self) {
5175                unsafe {
5176                    DROPS += 1;
5177                }
5178            }
5179        }
5180
5181        let mut ring = SliceDeque::new();
5182        ring.push_back(Elem(0));
5183        ring.push_front(Elem(1));
5184        ring.push_back(Elem(2));
5185        ring.push_front(Elem(3));
5186        mem::drop(ring);
5187
5188        assert_eq!(unsafe { DROPS }, 4);
5189    }
5190
5191    #[test]
5192    fn vecdeque_drop_with_pop_zst() {
5193        static mut DROPS: i32 = 0;
5194        struct Elem;
5195        impl Drop for Elem {
5196            fn drop(&mut self) {
5197                unsafe {
5198                    DROPS += 1;
5199                }
5200            }
5201        }
5202
5203        let mut ring = SliceDeque::new();
5204        ring.push_back(Elem);
5205        ring.push_front(Elem);
5206        ring.push_back(Elem);
5207        ring.push_front(Elem);
5208
5209        mem::drop(ring.pop_back());
5210        mem::drop(ring.pop_front());
5211        assert_eq!(unsafe { DROPS }, 2);
5212
5213        mem::drop(ring);
5214        assert_eq!(unsafe { DROPS }, 4);
5215    }
5216
5217    #[test]
5218    fn vecdeque_drop_with_pop() {
5219        static mut DROPS: i32 = 0;
5220        struct Elem(i32);
5221        impl Drop for Elem {
5222            fn drop(&mut self) {
5223                unsafe {
5224                    DROPS += 1;
5225                }
5226            }
5227        }
5228
5229        let mut ring = SliceDeque::new();
5230        ring.push_back(Elem(0));
5231        ring.push_front(Elem(0));
5232        ring.push_back(Elem(0));
5233        ring.push_front(Elem(0));
5234
5235        mem::drop(ring.pop_back());
5236        mem::drop(ring.pop_front());
5237        assert_eq!(unsafe { DROPS }, 2);
5238
5239        mem::drop(ring);
5240        assert_eq!(unsafe { DROPS }, 4);
5241    }
5242
5243    #[test]
5244    fn vecdeque_drop_clear_zst() {
5245        static mut DROPS: i32 = 0;
5246        struct Elem;
5247        impl Drop for Elem {
5248            fn drop(&mut self) {
5249                unsafe {
5250                    DROPS += 1;
5251                }
5252            }
5253        }
5254
5255        let mut ring = SliceDeque::new();
5256        ring.push_back(Elem);
5257        ring.push_front(Elem);
5258        ring.push_back(Elem);
5259        ring.push_front(Elem);
5260        ring.clear();
5261        assert_eq!(unsafe { DROPS }, 4);
5262
5263        mem::drop(ring);
5264        assert_eq!(unsafe { DROPS }, 4);
5265    }
5266
5267    #[test]
5268    fn vecdeque_drop_clear() {
5269        static mut DROPS: i32 = 0;
5270        struct Elem(i32);
5271        impl Drop for Elem {
5272            fn drop(&mut self) {
5273                unsafe {
5274                    DROPS += 1;
5275                }
5276            }
5277        }
5278
5279        let mut ring = SliceDeque::new();
5280        ring.push_back(Elem(0));
5281        ring.push_front(Elem(0));
5282        ring.push_back(Elem(0));
5283        ring.push_front(Elem(0));
5284        ring.clear();
5285        assert_eq!(unsafe { DROPS }, 4);
5286
5287        mem::drop(ring);
5288        assert_eq!(unsafe { DROPS }, 4);
5289    }
5290
5291    #[test]
5292    fn vecdeque_reserve_grow() {
5293        // test growth path A
5294        // [T o o H] -> [T o o H . . . . ]
5295        let mut ring = SliceDeque::with_capacity(4);
5296        for i in 0..3 {
5297            ring.push_back(i);
5298        }
5299        ring.reserve(7);
5300        for i in 0..3 {
5301            assert_eq!(ring.pop_front(), Some(i));
5302        }
5303
5304        // test growth path B
5305        // [H T o o] -> [. T o o H . . . ]
5306        let mut ring = SliceDeque::with_capacity(4);
5307        for i in 0..1 {
5308            ring.push_back(i);
5309            assert_eq!(ring.pop_front(), Some(i));
5310        }
5311        for i in 0..3 {
5312            ring.push_back(i);
5313        }
5314        ring.reserve(7);
5315        for i in 0..3 {
5316            assert_eq!(ring.pop_front(), Some(i));
5317        }
5318
5319        // test growth path C
5320        // [o o H T] -> [o o H . . . . T ]
5321        let mut ring = SliceDeque::with_capacity(4);
5322        for i in 0..3 {
5323            ring.push_back(i);
5324            assert_eq!(ring.pop_front(), Some(i));
5325        }
5326        for i in 0..3 {
5327            ring.push_back(i);
5328        }
5329        ring.reserve(7);
5330        for i in 0..3 {
5331            assert_eq!(ring.pop_front(), Some(i));
5332        }
5333    }
5334
5335    #[test]
5336    fn vecdeque_get() {
5337        let mut ring = SliceDeque::new();
5338        ring.push_back(0);
5339        assert_eq!(ring.get(0), Some(&0));
5340        assert_eq!(ring.get(1), None);
5341
5342        ring.push_back(1);
5343        assert_eq!(ring.get(0), Some(&0));
5344        assert_eq!(ring.get(1), Some(&1));
5345        assert_eq!(ring.get(2), None);
5346
5347        ring.push_back(2);
5348        assert_eq!(ring.get(0), Some(&0));
5349        assert_eq!(ring.get(1), Some(&1));
5350        assert_eq!(ring.get(2), Some(&2));
5351        assert_eq!(ring.get(3), None);
5352
5353        assert_eq!(ring.pop_front(), Some(0));
5354        assert_eq!(ring.get(0), Some(&1));
5355        assert_eq!(ring.get(1), Some(&2));
5356        assert_eq!(ring.get(2), None);
5357
5358        assert_eq!(ring.pop_front(), Some(1));
5359        assert_eq!(ring.get(0), Some(&2));
5360        assert_eq!(ring.get(1), None);
5361
5362        assert_eq!(ring.pop_front(), Some(2));
5363        assert_eq!(ring.get(0), None);
5364        assert_eq!(ring.get(1), None);
5365    }
5366
5367    #[test]
5368    fn vecdeque_get_mut() {
5369        let mut ring = SliceDeque::new();
5370        for i in 0..3 {
5371            ring.push_back(i);
5372        }
5373
5374        match ring.get_mut(1) {
5375            Some(x) => *x = -1,
5376            None => (),
5377        };
5378
5379        assert_eq!(ring.get_mut(0), Some(&mut 0));
5380        assert_eq!(ring.get_mut(1), Some(&mut -1));
5381        assert_eq!(ring.get_mut(2), Some(&mut 2));
5382        assert_eq!(ring.get_mut(3), None);
5383
5384        assert_eq!(ring.pop_front(), Some(0));
5385        assert_eq!(ring.get_mut(0), Some(&mut -1));
5386        assert_eq!(ring.get_mut(1), Some(&mut 2));
5387        assert_eq!(ring.get_mut(2), None);
5388    }
5389
5390    #[test]
5391    fn vecdeque_front() {
5392        let mut ring = SliceDeque::new();
5393        ring.push_back(10);
5394        ring.push_back(20);
5395        assert_eq!(ring.front(), Some(&10));
5396        ring.pop_front();
5397        assert_eq!(ring.front(), Some(&20));
5398        ring.pop_front();
5399        assert_eq!(ring.front(), None);
5400    }
5401
5402    #[test]
5403    fn vecdeque_as_slices() {
5404        let mut ring: SliceDeque<i32> = SliceDeque::with_capacity(127);
5405        let cap = ring.capacity() as i32;
5406        let first = cap / 2;
5407        let last = cap - first;
5408        for i in 0..first {
5409            ring.push_back(i);
5410
5411            let (left, right) = ring.as_slices();
5412            let expected: Vec<_> = (0..i + 1).collect();
5413            assert_eq!(left, &expected[..]);
5414            assert_eq!(right, []);
5415        }
5416
5417        for j in -last..0 {
5418            ring.push_front(j);
5419            let (left, right) = ring.as_slices();
5420            let mut expected_left: Vec<_> = (-last..j + 1).rev().collect();
5421            expected_left.extend(0..first);
5422            assert_eq!(left, &expected_left[..]);
5423            assert_eq!(right, []);
5424        }
5425
5426        assert_eq!(ring.len() as i32, cap);
5427        assert_eq!(ring.capacity() as i32, cap);
5428    }
5429
5430    #[test]
5431    fn vecdeque_as_mut_slices() {
5432        let mut ring: SliceDeque<i32> = SliceDeque::with_capacity(127);
5433        let cap = ring.capacity() as i32;
5434        let first = cap / 2;
5435        let last = cap - first;
5436        for i in 0..first {
5437            ring.push_back(i);
5438
5439            let (left, right) = ring.as_mut_slices();
5440            let expected: Vec<_> = (0..i + 1).collect();
5441            assert_eq!(left, &expected[..]);
5442            assert_eq!(right, []);
5443        }
5444
5445        for j in -last..0 {
5446            ring.push_front(j);
5447            let (left, right) = ring.as_mut_slices();
5448            let mut expected_left: Vec<_> = (-last..j + 1).rev().collect();
5449            expected_left.extend(0..first);
5450            assert_eq!(left, &expected_left[..]);
5451            assert_eq!(right, []);
5452        }
5453
5454        assert_eq!(ring.len() as i32, cap);
5455        assert_eq!(ring.capacity() as i32, cap);
5456    }
5457
5458    #[test]
5459    fn vecdeque_append() {
5460        let mut a: SliceDeque<_> = vec![1, 2, 3].into_iter().collect();
5461        let mut b: SliceDeque<_> = vec![4, 5, 6].into_iter().collect();
5462
5463        // normal append
5464        a.append(&mut b);
5465        assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
5466        assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
5467
5468        // append nothing to something
5469        a.append(&mut b);
5470        assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
5471        assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
5472
5473        // append something to nothing
5474        b.append(&mut a);
5475        assert_eq!(b.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
5476        assert_eq!(a.iter().cloned().collect::<Vec<_>>(), []);
5477    }
5478
5479    #[test]
5480    fn vecdeque_retain() {
5481        let mut buf = SliceDeque::new();
5482        buf.extend(1..5);
5483        buf.retain(|&x| x % 2 == 0);
5484        let v: Vec<_> = buf.into_iter().collect();
5485        assert_eq!(&v[..], &[2, 4]);
5486    }
5487
5488    #[test]
5489    fn vecdeque_extend_ref() {
5490        let mut v = SliceDeque::new();
5491        v.push_back(1);
5492        v.extend(&[2, 3, 4]);
5493
5494        assert_eq!(v.len(), 4);
5495        assert_eq!(v[0], 1);
5496        assert_eq!(v[1], 2);
5497        assert_eq!(v[2], 3);
5498        assert_eq!(v[3], 4);
5499
5500        let mut w = SliceDeque::new();
5501        w.push_back(5);
5502        w.push_back(6);
5503        v.extend(&w);
5504
5505        assert_eq!(v.len(), 6);
5506        assert_eq!(v[0], 1);
5507        assert_eq!(v[1], 2);
5508        assert_eq!(v[2], 3);
5509        assert_eq!(v[3], 4);
5510        assert_eq!(v[4], 5);
5511        assert_eq!(v[5], 6);
5512    }
5513
5514    #[test]
5515    fn vecdeque_contains() {
5516        let mut v = SliceDeque::new();
5517        v.extend(&[2, 3, 4]);
5518
5519        assert!(v.contains(&3));
5520        assert!(!v.contains(&1));
5521
5522        v.clear();
5523
5524        assert!(!v.contains(&3));
5525    }
5526
5527    /* TODO: covariance
5528    #[allow(dead_code)]
5529    fn assert_covariance() {
5530        fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
5531            d
5532        }
5533    }
5534        */
5535
5536    #[cfg(feature = "unstable")]
5537    #[test]
5538    fn vecdeque_is_empty() {
5539        let mut v = SliceDeque::<i32>::new();
5540        assert!(v.is_empty());
5541        assert!(v.iter().is_empty());
5542        assert!(v.iter_mut().is_empty());
5543        v.extend(&[2, 3, 4]);
5544        assert!(!v.is_empty());
5545        assert!(!v.iter().is_empty());
5546        assert!(!v.iter_mut().is_empty());
5547        while let Some(_) = v.pop_front() {
5548            assert_eq!(v.is_empty(), v.len() == 0);
5549            assert_eq!(v.iter().is_empty(), v.iter().len() == 0);
5550            assert_eq!(v.iter_mut().is_empty(), v.iter_mut().len() == 0);
5551        }
5552        assert!(v.is_empty());
5553        assert!(v.iter().is_empty());
5554        assert!(v.iter_mut().is_empty());
5555        assert!(v.into_iter().is_empty());
5556    }
5557
5558    #[cfg(all(feature = "bytes_buf", feature = "use_std"))]
5559    #[test]
5560    fn bytes_bufmut() {
5561        use bytes::{BigEndian, BufMut};
5562        use std::io::Write;
5563
5564        {
5565            let mut buf = sdeq![];
5566
5567            buf.put("hello world");
5568
5569            assert_eq!(buf, b"hello world");
5570        }
5571        {
5572            let mut buf = SliceDeque::with_capacity(16);
5573
5574            unsafe {
5575                buf.bytes_mut()[0] = b'h';
5576                buf.bytes_mut()[1] = b'e';
5577
5578                buf.advance_mut(2);
5579
5580                buf.bytes_mut()[0] = b'l';
5581                buf.bytes_mut()[1..3].copy_from_slice(b"lo");
5582
5583                buf.advance_mut(3);
5584            }
5585
5586            assert_eq!(5, buf.len());
5587            assert_eq!(buf, b"hello");
5588        }
5589        {
5590            let mut buf = SliceDeque::with_capacity(16);
5591
5592            unsafe {
5593                buf.bytes_mut()[0] = b'h';
5594                buf.bytes_mut()[1] = b'e';
5595
5596                buf.advance_mut(2);
5597
5598                buf.bytes_mut()[0] = b'l';
5599                buf.bytes_mut()[1..3].copy_from_slice(b"lo");
5600
5601                buf.advance_mut(3);
5602            }
5603
5604            assert_eq!(5, buf.len());
5605            assert_eq!(buf, b"hello");
5606        }
5607        {
5608            let mut buf = sdeq![];
5609
5610            buf.put(b'h');
5611            buf.put(&b"ello"[..]);
5612            buf.put(" world");
5613
5614            assert_eq!(buf, b"hello world");
5615        }
5616        {
5617            let mut buf = sdeq![];
5618            buf.put_u8(0x01);
5619            assert_eq!(buf, b"\x01");
5620        }
5621        {
5622            let mut buf = sdeq![];
5623            buf.put_i8(0x01);
5624            assert_eq!(buf, b"\x01");
5625        }
5626        {
5627            let mut buf = sdeq![];
5628            buf.put_u16::<BigEndian>(0x0809);
5629            assert_eq!(buf, b"\x08\x09");
5630        }
5631        {
5632            let mut buf = sdeq![];
5633
5634            {
5635                let reference = buf.by_ref();
5636
5637                // Adapt reference to `std::io::Write`.
5638                let mut writer = reference.writer();
5639
5640                // Use the buffer as a writter
5641                Write::write(&mut writer, &b"hello world"[..]).unwrap();
5642            } // drop our &mut reference so that we can use `buf` again
5643
5644            assert_eq!(buf, &b"hello world"[..]);
5645        }
5646        {
5647            let mut buf = sdeq![].writer();
5648
5649            let num = buf.write(&b"hello world"[..]).unwrap();
5650            assert_eq!(11, num);
5651
5652            let buf = buf.into_inner();
5653
5654            assert_eq!(*buf, b"hello world"[..]);
5655        }
5656    }
5657
5658    #[cfg(all(feature = "bytes_buf", feature = "use_std"))]
5659    #[test]
5660    fn bytes_buf() {
5661        {
5662            use bytes::{Buf, Bytes, IntoBuf};
5663
5664            let buf = Bytes::from(&b"hello world"[..]).into_buf();
5665            let vec: SliceDeque<u8> = buf.collect();
5666
5667            assert_eq!(vec, &b"hello world"[..]);
5668        }
5669        {
5670            use bytes::{Buf, BufMut};
5671            use std::io::Cursor;
5672
5673            let mut buf = Cursor::new("hello world").take(5);
5674            let mut dst = sdeq![];
5675
5676            dst.put(&mut buf);
5677            assert_eq!(dst, b"hello");
5678
5679            let mut buf = buf.into_inner();
5680            dst.clear();
5681            dst.put(&mut buf);
5682            assert_eq!(dst, b" world");
5683        }
5684        {
5685            use bytes::{Buf, BufMut};
5686            use std::io::Cursor;
5687
5688            let mut buf = Cursor::new("hello world");
5689            let mut dst = sdeq![];
5690
5691            {
5692                let reference = buf.by_ref();
5693                dst.put(&mut reference.take(5));
5694                assert_eq!(dst, b"hello");
5695            } // drop our &mut reference so we can use `buf` again
5696
5697            dst.clear();
5698            dst.put(&mut buf);
5699            assert_eq!(dst, b" world");
5700        }
5701    }
5702
5703    #[test]
5704    fn issue_42() {
5705        // https://github.com/gnzlbg/slice_deque/issues/42
5706        let page_size = crate::mirrored::allocation_granularity();
5707        let mut deque = SliceDeque::<u8>::with_capacity(page_size);
5708        let page_size = page_size as isize;
5709
5710        let slice = unsafe {
5711            deque.move_tail(page_size);
5712            deque.move_head(page_size / 100 * 99);
5713            deque.move_tail(page_size / 100 * 99);
5714            deque.move_head(page_size / 100 * 99);
5715            deque.tail_head_slice()
5716        };
5717
5718        for i in 0..slice.len() {
5719            // segfault:
5720            slice[i] = 0;
5721        }
5722    }
5723
5724    #[test]
5725    fn issue_45() {
5726        // https://github.com/gnzlbg/slice_deque/issues/45
5727        fn refill(buf: &mut SliceDeque<u8>) {
5728            let data = [0u8; MAX_SAMPLES_PER_FRAME * 5];
5729            buf.extend(data.iter());
5730        }
5731
5732        const MAX_SAMPLES_PER_FRAME: usize = 1152 * 2;
5733        const BUFFER_SIZE: usize = MAX_SAMPLES_PER_FRAME * 15;
5734        const REFILL_TRIGGER: usize = MAX_SAMPLES_PER_FRAME * 8;
5735
5736        let mut buf = SliceDeque::with_capacity(BUFFER_SIZE);
5737        for _ in 0..10_000 {
5738            if buf.len() < REFILL_TRIGGER {
5739                refill(&mut buf);
5740            }
5741
5742            let cur_len = buf.len();
5743            buf.truncate_front(cur_len - 10);
5744        }
5745    }
5746
5747    #[test]
5748    fn issue_47() {
5749        let page_size = crate::mirrored::allocation_granularity();
5750        let mut sdq = SliceDeque::<u8>::new();
5751        let vec = vec![0_u8; page_size + 1];
5752        sdq.extend(vec);
5753    }
5754
5755    #[test]
5756    fn issue_50() {
5757        use std::fs::File;
5758        use std::io::Write;
5759        use std::path::Path;
5760
5761        let out_buffer = SliceDeque::new();
5762
5763        let p = if cfg!(target_os = "windows") {
5764            "slice_deque_test"
5765        } else {
5766            "/tmp/slice_deque_test"
5767        };
5768
5769        let mut out_file = File::create(Path::new(p)).unwrap();
5770        let res = out_file.write(&out_buffer[..]);
5771        println!("Result was {:?}", res);
5772        println!("Buffer size: {}", out_buffer.len());
5773        println!("Address of buffer was: {:?}", out_buffer.as_ptr());
5774    }
5775
5776    #[test]
5777    fn empty_ptr() {
5778        {
5779            let sdeq = SliceDeque::<i8>::new();
5780            let v = Vec::<i8>::new();
5781            assert_eq!(sdeq.as_ptr() as usize, mem::align_of::<i8>());
5782            assert_eq!(v.as_ptr() as usize, mem::align_of::<i8>());
5783        }
5784        {
5785            let sdeq = SliceDeque::<i16>::new();
5786            let v = Vec::<i16>::new();
5787            assert_eq!(sdeq.as_ptr() as usize, mem::align_of::<i16>());
5788            assert_eq!(v.as_ptr() as usize, mem::align_of::<i16>());
5789        }
5790        {
5791            let sdeq = SliceDeque::<i32>::new();
5792            let v = Vec::<i32>::new();
5793            assert_eq!(sdeq.as_ptr() as usize, mem::align_of::<i32>());
5794            assert_eq!(v.as_ptr() as usize, mem::align_of::<i32>());
5795        }
5796        {
5797            let sdeq = SliceDeque::<i64>::new();
5798            let v = Vec::<i64>::new();
5799            assert_eq!(sdeq.as_ptr() as usize, mem::align_of::<i64>());
5800            assert_eq!(v.as_ptr() as usize, mem::align_of::<i64>());
5801        }
5802        {
5803            #[repr(align(32))]
5804            struct Foo(i8);
5805            let sdeq = SliceDeque::<Foo>::new();
5806            let v = Vec::<Foo>::new();
5807            assert_eq!(sdeq.as_ptr() as usize, mem::align_of::<Foo>());
5808            assert_eq!(v.as_ptr() as usize, mem::align_of::<Foo>());
5809        }
5810    }
5811
5812    #[test]
5813    fn issue_57() {
5814        const C: [i16; 3] = [42; 3];
5815
5816        let mut deque = SliceDeque::new();
5817
5818        for _ in 0..918 {
5819            deque.push_front(C);
5820        }
5821
5822        for _ in 0..237 {
5823            assert_eq!(deque.pop_front(), Some(C));
5824            assert!(!deque.is_empty());
5825            assert_eq!(*deque.back().unwrap(), C);
5826        }
5827    }
5828
5829    #[test]
5830    fn drop_count() {
5831        #[repr(C)]
5832        struct Foo(*mut usize);
5833        impl Drop for Foo {
5834            fn drop(&mut self) {
5835                unsafe {
5836                    *self.0 += 1;
5837                }
5838            }
5839        }
5840
5841        let mut count = 0_usize;
5842        {
5843            let mut deque = SliceDeque::new();
5844            for _ in 0..10 {
5845                deque.push_back(Foo(&mut count as *mut _));
5846                deque.pop_front();
5847            }
5848        }
5849        assert_eq!(count, 10);
5850    }
5851
5852    #[test]
5853    fn non_fitting_elem_type() {
5854        // This type does not perfectly fit in an "allocation granularity"
5855        // unit (e.g. a memory page). A new type has always (1, 2, 3),
5856        // while free-ing the type writes (4, 5, 6) to the memory.
5857        #[repr(C)]
5858        struct NonFitting(u8, u8, u8);
5859        impl NonFitting {
5860            fn new() -> Self {
5861                Self(1, 2, 3)
5862            }
5863            fn valid(&self) -> bool {
5864                //dbg!("valid", self as *const Self as usize);
5865                if self.0 == 1 && self.1 == 2 && self.2 == 3 {
5866                    true
5867                } else {
5868                    dbg!((self.0, self.1, self.2));
5869                    false
5870                }
5871            }
5872        }
5873
5874        impl Drop for NonFitting {
5875            fn drop(&mut self) {
5876                //dbg!(("drop", self as *mut Self as usize));
5877                unsafe {
5878                    let ptr = self as *mut Self as *mut u8;
5879                    ptr.write_volatile(4);
5880                    ptr.add(1).write_volatile(5);
5881                    ptr.add(2).write_volatile(6);
5882                }
5883            }
5884        }
5885
5886        let page_size = crate::mirrored::allocation_granularity();
5887        let elem_size = mem::size_of::<NonFitting>();
5888
5889        assert!(elem_size % page_size != 0);
5890        let no_elements_that_fit = page_size / elem_size;
5891
5892        // Create a deque, which has a single element
5893        // right at the end of the first page.
5894        //
5895        // We do that by shifting a single element till the end, which can be
5896        // achieved by pushing an element and while popping the previous one.
5897        let mut deque = SliceDeque::new();
5898        deque.push_back(NonFitting::new());
5899
5900        for i in 0..no_elements_that_fit {
5901            if i > no_elements_that_fit - 2 {
5902                //dbg!((i, deque.len()));
5903            }
5904            //dbg!(("push_back", deque.len()));
5905            deque.push_back(NonFitting::new());
5906            //dbg!(("pop_front", deque.len()));
5907            deque.truncate_front(1);
5908            assert_eq!(deque.len(), 1);
5909            assert!(deque[0].valid());
5910        }
5911    }
5912
5913    #[test]
5914    fn issue_57_2() {
5915        let mut deque = SliceDeque::new();
5916        for _ in 0..30_000 {
5917            deque.push_back(String::from("test"));
5918            if deque.len() == 8 {
5919                deque.pop_front();
5920            }
5921        }
5922    }
5923
5924    #[test]
5925    fn zst() {
5926        struct A;
5927        let mut s = SliceDeque::<A>::new();
5928        assert_eq!(s.len(), 0);
5929        assert_eq!(s.capacity(), isize::max_value() as usize);
5930
5931        for _ in 0..10 {
5932            s.push_back(A);
5933        }
5934        assert_eq!(s.len(), 10);
5935    }
5936
5937    #[test]
5938    fn sync() {
5939        fn assert_sync<T: Sync>(_: T) {}
5940
5941        struct S(*mut u8);
5942        unsafe impl Sync for S {}
5943        let x = SliceDeque::<S>::new();
5944        assert_sync(x);
5945    }
5946
5947    #[test]
5948    fn send() {
5949        fn assert_send<T: Send>(_: T) {}
5950
5951        struct S(*mut u8);
5952        unsafe impl Send for S {}
5953        let x = SliceDeque::<S>::new();
5954        assert_send(x);
5955    }
5956}