• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! A double-ended queue (deque) implemented with a growable ring buffer.
2 //!
3 //! This queue has *O*(1) amortized inserts and removals from both ends of the
4 //! container. It also has *O*(1) indexing like a vector. The contained elements
5 //! are not required to be copyable, and the queue will be sendable if the
6 //! contained type is sendable.
7 
8 #![stable(feature = "rust1", since = "1.0.0")]
9 
10 use core::cmp::{self, Ordering};
11 use core::fmt;
12 use core::hash::{Hash, Hasher};
13 use core::iter::{repeat_n, repeat_with, ByRefSized};
14 use core::mem::{ManuallyDrop, SizedTypeProperties};
15 use core::ops::{Index, IndexMut, Range, RangeBounds};
16 use core::ptr;
17 use core::slice;
18 
19 // This is used in a bunch of intra-doc links.
20 // FIXME: For some reason, `#[cfg(doc)]` wasn't sufficient, resulting in
21 // failures in linkchecker even though rustdoc built the docs just fine.
22 #[allow(unused_imports)]
23 use core::mem;
24 
25 use crate::alloc::{Allocator, Global};
26 use crate::collections::TryReserveError;
27 use crate::collections::TryReserveErrorKind;
28 use crate::raw_vec::RawVec;
29 use crate::vec::Vec;
30 
31 #[macro_use]
32 mod macros;
33 
34 #[stable(feature = "drain", since = "1.6.0")]
35 pub use self::drain::Drain;
36 
37 mod drain;
38 
39 #[stable(feature = "rust1", since = "1.0.0")]
40 pub use self::iter_mut::IterMut;
41 
42 mod iter_mut;
43 
44 #[stable(feature = "rust1", since = "1.0.0")]
45 pub use self::into_iter::IntoIter;
46 
47 mod into_iter;
48 
49 #[stable(feature = "rust1", since = "1.0.0")]
50 pub use self::iter::Iter;
51 
52 mod iter;
53 
54 use self::spec_extend::SpecExtend;
55 
56 mod spec_extend;
57 
58 use self::spec_from_iter::SpecFromIter;
59 
60 mod spec_from_iter;
61 
62 #[cfg(test)]
63 mod tests;
64 
65 /// A double-ended queue implemented with a growable ring buffer.
66 ///
67 /// The "default" usage of this type as a queue is to use [`push_back`] to add to
68 /// the queue, and [`pop_front`] to remove from the queue. [`extend`] and [`append`]
69 /// push onto the back in this manner, and iterating over `VecDeque` goes front
70 /// to back.
71 ///
72 /// A `VecDeque` with a known list of items can be initialized from an array:
73 ///
74 /// ```
75 /// use std::collections::VecDeque;
76 ///
77 /// let deq = VecDeque::from([-1, 0, 1]);
78 /// ```
79 ///
80 /// Since `VecDeque` is a ring buffer, its elements are not necessarily contiguous
81 /// in memory. If you want to access the elements as a single slice, such as for
82 /// efficient sorting, you can use [`make_contiguous`]. It rotates the `VecDeque`
83 /// so that its elements do not wrap, and returns a mutable slice to the
84 /// now-contiguous element sequence.
85 ///
86 /// [`push_back`]: VecDeque::push_back
87 /// [`pop_front`]: VecDeque::pop_front
88 /// [`extend`]: VecDeque::extend
89 /// [`append`]: VecDeque::append
90 /// [`make_contiguous`]: VecDeque::make_contiguous
91 #[cfg_attr(not(test), rustc_diagnostic_item = "VecDeque")]
92 #[stable(feature = "rust1", since = "1.0.0")]
93 #[rustc_insignificant_dtor]
94 pub struct VecDeque<
95     T,
96     #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global,
97 > {
98     // `self[0]`, if it exists, is `buf[head]`.
99     // `head < buf.capacity()`, unless `buf.capacity() == 0` when `head == 0`.
100     head: usize,
101     // the number of initialized elements, starting from the one at `head` and potentially wrapping around.
102     // if `len == 0`, the exact value of `head` is unimportant.
103     // if `T` is zero-Sized, then `self.len <= usize::MAX`, otherwise `self.len <= isize::MAX as usize`.
104     len: usize,
105     buf: RawVec<T, A>,
106 }
107 
108 #[stable(feature = "rust1", since = "1.0.0")]
109 impl<T: Clone, A: Allocator + Clone> Clone for VecDeque<T, A> {
clone(&self) -> Self110     fn clone(&self) -> Self {
111         let mut deq = Self::with_capacity_in(self.len(), self.allocator().clone());
112         deq.extend(self.iter().cloned());
113         deq
114     }
115 
clone_from(&mut self, other: &Self)116     fn clone_from(&mut self, other: &Self) {
117         self.clear();
118         self.extend(other.iter().cloned());
119     }
120 }
121 
122 #[stable(feature = "rust1", since = "1.0.0")]
123 unsafe impl<#[may_dangle] T, A: Allocator> Drop for VecDeque<T, A> {
drop(&mut self)124     fn drop(&mut self) {
125         /// Runs the destructor for all items in the slice when it gets dropped (normally or
126         /// during unwinding).
127         struct Dropper<'a, T>(&'a mut [T]);
128 
129         impl<'a, T> Drop for Dropper<'a, T> {
130             fn drop(&mut self) {
131                 unsafe {
132                     ptr::drop_in_place(self.0);
133                 }
134             }
135         }
136 
137         let (front, back) = self.as_mut_slices();
138         unsafe {
139             let _back_dropper = Dropper(back);
140             // use drop for [T]
141             ptr::drop_in_place(front);
142         }
143         // RawVec handles deallocation
144     }
145 }
146 
147 #[stable(feature = "rust1", since = "1.0.0")]
148 impl<T> Default for VecDeque<T> {
149     /// Creates an empty deque.
150     #[inline]
default() -> VecDeque<T>151     fn default() -> VecDeque<T> {
152         VecDeque::new()
153     }
154 }
155 
156 impl<T, A: Allocator> VecDeque<T, A> {
157     /// Marginally more convenient
158     #[inline]
ptr(&self) -> *mut T159     fn ptr(&self) -> *mut T {
160         self.buf.ptr()
161     }
162 
163     /// Moves an element out of the buffer
164     #[inline]
buffer_read(&mut self, off: usize) -> T165     unsafe fn buffer_read(&mut self, off: usize) -> T {
166         unsafe { ptr::read(self.ptr().add(off)) }
167     }
168 
169     /// Writes an element into the buffer, moving it.
170     #[inline]
buffer_write(&mut self, off: usize, value: T)171     unsafe fn buffer_write(&mut self, off: usize, value: T) {
172         unsafe {
173             ptr::write(self.ptr().add(off), value);
174         }
175     }
176 
177     /// Returns a slice pointer into the buffer.
178     /// `range` must lie inside `0..self.capacity()`.
179     #[inline]
buffer_range(&self, range: Range<usize>) -> *mut [T]180     unsafe fn buffer_range(&self, range: Range<usize>) -> *mut [T] {
181         unsafe {
182             ptr::slice_from_raw_parts_mut(self.ptr().add(range.start), range.end - range.start)
183         }
184     }
185 
186     /// Returns `true` if the buffer is at full capacity.
187     #[inline]
is_full(&self) -> bool188     fn is_full(&self) -> bool {
189         self.len == self.capacity()
190     }
191 
192     /// Returns the index in the underlying buffer for a given logical element
193     /// index + addend.
194     #[inline]
wrap_add(&self, idx: usize, addend: usize) -> usize195     fn wrap_add(&self, idx: usize, addend: usize) -> usize {
196         wrap_index(idx.wrapping_add(addend), self.capacity())
197     }
198 
199     #[inline]
to_physical_idx(&self, idx: usize) -> usize200     fn to_physical_idx(&self, idx: usize) -> usize {
201         self.wrap_add(self.head, idx)
202     }
203 
204     /// Returns the index in the underlying buffer for a given logical element
205     /// index - subtrahend.
206     #[inline]
wrap_sub(&self, idx: usize, subtrahend: usize) -> usize207     fn wrap_sub(&self, idx: usize, subtrahend: usize) -> usize {
208         wrap_index(idx.wrapping_sub(subtrahend).wrapping_add(self.capacity()), self.capacity())
209     }
210 
211     /// Copies a contiguous block of memory len long from src to dst
212     #[inline]
copy(&mut self, src: usize, dst: usize, len: usize)213     unsafe fn copy(&mut self, src: usize, dst: usize, len: usize) {
214         debug_assert!(
215             dst + len <= self.capacity(),
216             "cpy dst={} src={} len={} cap={}",
217             dst,
218             src,
219             len,
220             self.capacity()
221         );
222         debug_assert!(
223             src + len <= self.capacity(),
224             "cpy dst={} src={} len={} cap={}",
225             dst,
226             src,
227             len,
228             self.capacity()
229         );
230         unsafe {
231             ptr::copy(self.ptr().add(src), self.ptr().add(dst), len);
232         }
233     }
234 
235     /// Copies a contiguous block of memory len long from src to dst
236     #[inline]
copy_nonoverlapping(&mut self, src: usize, dst: usize, len: usize)237     unsafe fn copy_nonoverlapping(&mut self, src: usize, dst: usize, len: usize) {
238         debug_assert!(
239             dst + len <= self.capacity(),
240             "cno dst={} src={} len={} cap={}",
241             dst,
242             src,
243             len,
244             self.capacity()
245         );
246         debug_assert!(
247             src + len <= self.capacity(),
248             "cno dst={} src={} len={} cap={}",
249             dst,
250             src,
251             len,
252             self.capacity()
253         );
254         unsafe {
255             ptr::copy_nonoverlapping(self.ptr().add(src), self.ptr().add(dst), len);
256         }
257     }
258 
259     /// Copies a potentially wrapping block of memory len long from src to dest.
260     /// (abs(dst - src) + len) must be no larger than capacity() (There must be at
261     /// most one continuous overlapping region between src and dest).
wrap_copy(&mut self, src: usize, dst: usize, len: usize)262     unsafe fn wrap_copy(&mut self, src: usize, dst: usize, len: usize) {
263         debug_assert!(
264             cmp::min(src.abs_diff(dst), self.capacity() - src.abs_diff(dst)) + len
265                 <= self.capacity(),
266             "wrc dst={} src={} len={} cap={}",
267             dst,
268             src,
269             len,
270             self.capacity()
271         );
272 
273         // If T is a ZST, don't do any copying.
274         if T::IS_ZST || src == dst || len == 0 {
275             return;
276         }
277 
278         let dst_after_src = self.wrap_sub(dst, src) < len;
279 
280         let src_pre_wrap_len = self.capacity() - src;
281         let dst_pre_wrap_len = self.capacity() - dst;
282         let src_wraps = src_pre_wrap_len < len;
283         let dst_wraps = dst_pre_wrap_len < len;
284 
285         match (dst_after_src, src_wraps, dst_wraps) {
286             (_, false, false) => {
287                 // src doesn't wrap, dst doesn't wrap
288                 //
289                 //        S . . .
290                 // 1 [_ _ A A B B C C _]
291                 // 2 [_ _ A A A A B B _]
292                 //            D . . .
293                 //
294                 unsafe {
295                     self.copy(src, dst, len);
296                 }
297             }
298             (false, false, true) => {
299                 // dst before src, src doesn't wrap, dst wraps
300                 //
301                 //    S . . .
302                 // 1 [A A B B _ _ _ C C]
303                 // 2 [A A B B _ _ _ A A]
304                 // 3 [B B B B _ _ _ A A]
305                 //    . .           D .
306                 //
307                 unsafe {
308                     self.copy(src, dst, dst_pre_wrap_len);
309                     self.copy(src + dst_pre_wrap_len, 0, len - dst_pre_wrap_len);
310                 }
311             }
312             (true, false, true) => {
313                 // src before dst, src doesn't wrap, dst wraps
314                 //
315                 //              S . . .
316                 // 1 [C C _ _ _ A A B B]
317                 // 2 [B B _ _ _ A A B B]
318                 // 3 [B B _ _ _ A A A A]
319                 //    . .           D .
320                 //
321                 unsafe {
322                     self.copy(src + dst_pre_wrap_len, 0, len - dst_pre_wrap_len);
323                     self.copy(src, dst, dst_pre_wrap_len);
324                 }
325             }
326             (false, true, false) => {
327                 // dst before src, src wraps, dst doesn't wrap
328                 //
329                 //    . .           S .
330                 // 1 [C C _ _ _ A A B B]
331                 // 2 [C C _ _ _ B B B B]
332                 // 3 [C C _ _ _ B B C C]
333                 //              D . . .
334                 //
335                 unsafe {
336                     self.copy(src, dst, src_pre_wrap_len);
337                     self.copy(0, dst + src_pre_wrap_len, len - src_pre_wrap_len);
338                 }
339             }
340             (true, true, false) => {
341                 // src before dst, src wraps, dst doesn't wrap
342                 //
343                 //    . .           S .
344                 // 1 [A A B B _ _ _ C C]
345                 // 2 [A A A A _ _ _ C C]
346                 // 3 [C C A A _ _ _ C C]
347                 //    D . . .
348                 //
349                 unsafe {
350                     self.copy(0, dst + src_pre_wrap_len, len - src_pre_wrap_len);
351                     self.copy(src, dst, src_pre_wrap_len);
352                 }
353             }
354             (false, true, true) => {
355                 // dst before src, src wraps, dst wraps
356                 //
357                 //    . . .         S .
358                 // 1 [A B C D _ E F G H]
359                 // 2 [A B C D _ E G H H]
360                 // 3 [A B C D _ E G H A]
361                 // 4 [B C C D _ E G H A]
362                 //    . .         D . .
363                 //
364                 debug_assert!(dst_pre_wrap_len > src_pre_wrap_len);
365                 let delta = dst_pre_wrap_len - src_pre_wrap_len;
366                 unsafe {
367                     self.copy(src, dst, src_pre_wrap_len);
368                     self.copy(0, dst + src_pre_wrap_len, delta);
369                     self.copy(delta, 0, len - dst_pre_wrap_len);
370                 }
371             }
372             (true, true, true) => {
373                 // src before dst, src wraps, dst wraps
374                 //
375                 //    . .         S . .
376                 // 1 [A B C D _ E F G H]
377                 // 2 [A A B D _ E F G H]
378                 // 3 [H A B D _ E F G H]
379                 // 4 [H A B D _ E F F G]
380                 //    . . .         D .
381                 //
382                 debug_assert!(src_pre_wrap_len > dst_pre_wrap_len);
383                 let delta = src_pre_wrap_len - dst_pre_wrap_len;
384                 unsafe {
385                     self.copy(0, delta, len - src_pre_wrap_len);
386                     self.copy(self.capacity() - delta, 0, delta);
387                     self.copy(src, dst, dst_pre_wrap_len);
388                 }
389             }
390         }
391     }
392 
393     /// Copies all values from `src` to `dst`, wrapping around if needed.
394     /// Assumes capacity is sufficient.
395     #[inline]
copy_slice(&mut self, dst: usize, src: &[T])396     unsafe fn copy_slice(&mut self, dst: usize, src: &[T]) {
397         debug_assert!(src.len() <= self.capacity());
398         let head_room = self.capacity() - dst;
399         if src.len() <= head_room {
400             unsafe {
401                 ptr::copy_nonoverlapping(src.as_ptr(), self.ptr().add(dst), src.len());
402             }
403         } else {
404             let (left, right) = src.split_at(head_room);
405             unsafe {
406                 ptr::copy_nonoverlapping(left.as_ptr(), self.ptr().add(dst), left.len());
407                 ptr::copy_nonoverlapping(right.as_ptr(), self.ptr(), right.len());
408             }
409         }
410     }
411 
412     /// Writes all values from `iter` to `dst`.
413     ///
414     /// # Safety
415     ///
416     /// Assumes no wrapping around happens.
417     /// Assumes capacity is sufficient.
418     #[inline]
write_iter( &mut self, dst: usize, iter: impl Iterator<Item = T>, written: &mut usize, )419     unsafe fn write_iter(
420         &mut self,
421         dst: usize,
422         iter: impl Iterator<Item = T>,
423         written: &mut usize,
424     ) {
425         iter.enumerate().for_each(|(i, element)| unsafe {
426             self.buffer_write(dst + i, element);
427             *written += 1;
428         });
429     }
430 
431     /// Writes all values from `iter` to `dst`, wrapping
432     /// at the end of the buffer and returns the number
433     /// of written values.
434     ///
435     /// # Safety
436     ///
437     /// Assumes that `iter` yields at most `len` items.
438     /// Assumes capacity is sufficient.
write_iter_wrapping( &mut self, dst: usize, mut iter: impl Iterator<Item = T>, len: usize, ) -> usize439     unsafe fn write_iter_wrapping(
440         &mut self,
441         dst: usize,
442         mut iter: impl Iterator<Item = T>,
443         len: usize,
444     ) -> usize {
445         struct Guard<'a, T, A: Allocator> {
446             deque: &'a mut VecDeque<T, A>,
447             written: usize,
448         }
449 
450         impl<'a, T, A: Allocator> Drop for Guard<'a, T, A> {
451             fn drop(&mut self) {
452                 self.deque.len += self.written;
453             }
454         }
455 
456         let head_room = self.capacity() - dst;
457 
458         let mut guard = Guard { deque: self, written: 0 };
459 
460         if head_room >= len {
461             unsafe { guard.deque.write_iter(dst, iter, &mut guard.written) };
462         } else {
463             unsafe {
464                 guard.deque.write_iter(
465                     dst,
466                     ByRefSized(&mut iter).take(head_room),
467                     &mut guard.written,
468                 );
469                 guard.deque.write_iter(0, iter, &mut guard.written)
470             };
471         }
472 
473         guard.written
474     }
475 
476     /// Frobs the head and tail sections around to handle the fact that we
477     /// just reallocated. Unsafe because it trusts old_capacity.
478     #[inline]
handle_capacity_increase(&mut self, old_capacity: usize)479     unsafe fn handle_capacity_increase(&mut self, old_capacity: usize) {
480         let new_capacity = self.capacity();
481         debug_assert!(new_capacity >= old_capacity);
482 
483         // Move the shortest contiguous section of the ring buffer
484         //
485         // H := head
486         // L := last element (`self.to_physical_idx(self.len - 1)`)
487         //
488         //    H           L
489         //   [o o o o o o o . ]
490         //    H           L
491         // A [o o o o o o o . . . . . . . . . ]
492         //        L H
493         //   [o o o o o o o o ]
494         //          H           L
495         // B [. . . o o o o o o o . . . . . . ]
496         //              L H
497         //   [o o o o o o o o ]
498         //            L                   H
499         // C [o o o o o . . . . . . . . . o o ]
500 
501         // can't use is_contiguous() because the capacity is already updated.
502         if self.head <= old_capacity - self.len {
503             // A
504             // Nop
505         } else {
506             let head_len = old_capacity - self.head;
507             let tail_len = self.len - head_len;
508             if head_len > tail_len && new_capacity - old_capacity >= tail_len {
509                 // B
510                 unsafe {
511                     self.copy_nonoverlapping(0, old_capacity, tail_len);
512                 }
513             } else {
514                 // C
515                 let new_head = new_capacity - head_len;
516                 unsafe {
517                     // can't use copy_nonoverlapping here, because if e.g. head_len = 2
518                     // and new_capacity = old_capacity + 1, then the heads overlap.
519                     self.copy(self.head, new_head, head_len);
520                 }
521                 self.head = new_head;
522             }
523         }
524         debug_assert!(self.head < self.capacity() || self.capacity() == 0);
525     }
526 }
527 
528 impl<T> VecDeque<T> {
529     /// Creates an empty deque.
530     ///
531     /// # Examples
532     ///
533     /// ```
534     /// use std::collections::VecDeque;
535     ///
536     /// let deque: VecDeque<u32> = VecDeque::new();
537     /// ```
538     #[inline]
539     #[stable(feature = "rust1", since = "1.0.0")]
540     #[rustc_const_stable(feature = "const_vec_deque_new", since = "1.68.0")]
541     #[must_use]
new() -> VecDeque<T>542     pub const fn new() -> VecDeque<T> {
543         // FIXME: This should just be `VecDeque::new_in(Global)` once that hits stable.
544         VecDeque { head: 0, len: 0, buf: RawVec::NEW }
545     }
546 
547     /// Creates an empty deque with space for at least `capacity` elements.
548     ///
549     /// # Examples
550     ///
551     /// ```
552     /// use std::collections::VecDeque;
553     ///
554     /// let deque: VecDeque<u32> = VecDeque::with_capacity(10);
555     /// ```
556     #[inline]
557     #[stable(feature = "rust1", since = "1.0.0")]
558     #[must_use]
with_capacity(capacity: usize) -> VecDeque<T>559     pub fn with_capacity(capacity: usize) -> VecDeque<T> {
560         Self::with_capacity_in(capacity, Global)
561     }
562 }
563 
564 impl<T, A: Allocator> VecDeque<T, A> {
565     /// Creates an empty deque.
566     ///
567     /// # Examples
568     ///
569     /// ```
570     /// use std::collections::VecDeque;
571     ///
572     /// let deque: VecDeque<u32> = VecDeque::new();
573     /// ```
574     #[inline]
575     #[unstable(feature = "allocator_api", issue = "32838")]
new_in(alloc: A) -> VecDeque<T, A>576     pub const fn new_in(alloc: A) -> VecDeque<T, A> {
577         VecDeque { head: 0, len: 0, buf: RawVec::new_in(alloc) }
578     }
579 
580     /// Creates an empty deque with space for at least `capacity` elements.
581     ///
582     /// # Examples
583     ///
584     /// ```
585     /// use std::collections::VecDeque;
586     ///
587     /// let deque: VecDeque<u32> = VecDeque::with_capacity(10);
588     /// ```
589     #[unstable(feature = "allocator_api", issue = "32838")]
with_capacity_in(capacity: usize, alloc: A) -> VecDeque<T, A>590     pub fn with_capacity_in(capacity: usize, alloc: A) -> VecDeque<T, A> {
591         VecDeque { head: 0, len: 0, buf: RawVec::with_capacity_in(capacity, alloc) }
592     }
593 
594     /// Creates a `VecDeque` from a raw allocation, when the initialized
595     /// part of that allocation forms a *contiguous* subslice thereof.
596     ///
597     /// For use by `vec::IntoIter::into_vecdeque`
598     ///
599     /// # Safety
600     ///
601     /// All the usual requirements on the allocated memory like in
602     /// `Vec::from_raw_parts_in`, but takes a *range* of elements that are
603     /// initialized rather than only supporting `0..len`.  Requires that
604     /// `initialized.start` ≤ `initialized.end` ≤ `capacity`.
605     #[inline]
from_contiguous_raw_parts_in( ptr: *mut T, initialized: Range<usize>, capacity: usize, alloc: A, ) -> Self606     pub(crate) unsafe fn from_contiguous_raw_parts_in(
607         ptr: *mut T,
608         initialized: Range<usize>,
609         capacity: usize,
610         alloc: A,
611     ) -> Self {
612         debug_assert!(initialized.start <= initialized.end);
613         debug_assert!(initialized.end <= capacity);
614 
615         // SAFETY: Our safety precondition guarantees the range length won't wrap,
616         // and that the allocation is valid for use in `RawVec`.
617         unsafe {
618             VecDeque {
619                 head: initialized.start,
620                 len: initialized.end.unchecked_sub(initialized.start),
621                 buf: RawVec::from_raw_parts_in(ptr, capacity, alloc),
622             }
623         }
624     }
625 
626     /// Provides a reference to the element at the given index.
627     ///
628     /// Element at index 0 is the front of the queue.
629     ///
630     /// # Examples
631     ///
632     /// ```
633     /// use std::collections::VecDeque;
634     ///
635     /// let mut buf = VecDeque::new();
636     /// buf.push_back(3);
637     /// buf.push_back(4);
638     /// buf.push_back(5);
639     /// buf.push_back(6);
640     /// assert_eq!(buf.get(1), Some(&4));
641     /// ```
642     #[stable(feature = "rust1", since = "1.0.0")]
get(&self, index: usize) -> Option<&T>643     pub fn get(&self, index: usize) -> Option<&T> {
644         if index < self.len {
645             let idx = self.to_physical_idx(index);
646             unsafe { Some(&*self.ptr().add(idx)) }
647         } else {
648             None
649         }
650     }
651 
652     /// Provides a mutable reference to the element at the given index.
653     ///
654     /// Element at index 0 is the front of the queue.
655     ///
656     /// # Examples
657     ///
658     /// ```
659     /// use std::collections::VecDeque;
660     ///
661     /// let mut buf = VecDeque::new();
662     /// buf.push_back(3);
663     /// buf.push_back(4);
664     /// buf.push_back(5);
665     /// buf.push_back(6);
666     /// assert_eq!(buf[1], 4);
667     /// if let Some(elem) = buf.get_mut(1) {
668     ///     *elem = 7;
669     /// }
670     /// assert_eq!(buf[1], 7);
671     /// ```
672     #[stable(feature = "rust1", since = "1.0.0")]
get_mut(&mut self, index: usize) -> Option<&mut T>673     pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
674         if index < self.len {
675             let idx = self.to_physical_idx(index);
676             unsafe { Some(&mut *self.ptr().add(idx)) }
677         } else {
678             None
679         }
680     }
681 
682     /// Swaps elements at indices `i` and `j`.
683     ///
684     /// `i` and `j` may be equal.
685     ///
686     /// Element at index 0 is the front of the queue.
687     ///
688     /// # Panics
689     ///
690     /// Panics if either index is out of bounds.
691     ///
692     /// # Examples
693     ///
694     /// ```
695     /// use std::collections::VecDeque;
696     ///
697     /// let mut buf = VecDeque::new();
698     /// buf.push_back(3);
699     /// buf.push_back(4);
700     /// buf.push_back(5);
701     /// assert_eq!(buf, [3, 4, 5]);
702     /// buf.swap(0, 2);
703     /// assert_eq!(buf, [5, 4, 3]);
704     /// ```
705     #[stable(feature = "rust1", since = "1.0.0")]
swap(&mut self, i: usize, j: usize)706     pub fn swap(&mut self, i: usize, j: usize) {
707         assert!(i < self.len());
708         assert!(j < self.len());
709         let ri = self.to_physical_idx(i);
710         let rj = self.to_physical_idx(j);
711         unsafe { ptr::swap(self.ptr().add(ri), self.ptr().add(rj)) }
712     }
713 
714     /// Returns the number of elements the deque can hold without
715     /// reallocating.
716     ///
717     /// # Examples
718     ///
719     /// ```
720     /// use std::collections::VecDeque;
721     ///
722     /// let buf: VecDeque<i32> = VecDeque::with_capacity(10);
723     /// assert!(buf.capacity() >= 10);
724     /// ```
725     #[inline]
726     #[stable(feature = "rust1", since = "1.0.0")]
capacity(&self) -> usize727     pub fn capacity(&self) -> usize {
728         if T::IS_ZST { usize::MAX } else { self.buf.capacity() }
729     }
730 
731     /// Reserves the minimum capacity for at least `additional` more elements to be inserted in the
732     /// given deque. Does nothing if the capacity is already sufficient.
733     ///
734     /// Note that the allocator may give the collection more space than it requests. Therefore
735     /// capacity can not be relied upon to be precisely minimal. Prefer [`reserve`] if future
736     /// insertions are expected.
737     ///
738     /// # Panics
739     ///
740     /// Panics if the new capacity overflows `usize`.
741     ///
742     /// # Examples
743     ///
744     /// ```
745     /// use std::collections::VecDeque;
746     ///
747     /// let mut buf: VecDeque<i32> = [1].into();
748     /// buf.reserve_exact(10);
749     /// assert!(buf.capacity() >= 11);
750     /// ```
751     ///
752     /// [`reserve`]: VecDeque::reserve
753     #[stable(feature = "rust1", since = "1.0.0")]
reserve_exact(&mut self, additional: usize)754     pub fn reserve_exact(&mut self, additional: usize) {
755         let new_cap = self.len.checked_add(additional).expect("capacity overflow");
756         let old_cap = self.capacity();
757 
758         if new_cap > old_cap {
759             self.buf.reserve_exact(self.len, additional);
760             unsafe {
761                 self.handle_capacity_increase(old_cap);
762             }
763         }
764     }
765 
766     /// Reserves capacity for at least `additional` more elements to be inserted in the given
767     /// deque. The collection may reserve more space to speculatively avoid frequent reallocations.
768     ///
769     /// # Panics
770     ///
771     /// Panics if the new capacity overflows `usize`.
772     ///
773     /// # Examples
774     ///
775     /// ```
776     /// use std::collections::VecDeque;
777     ///
778     /// let mut buf: VecDeque<i32> = [1].into();
779     /// buf.reserve(10);
780     /// assert!(buf.capacity() >= 11);
781     /// ```
782     #[stable(feature = "rust1", since = "1.0.0")]
reserve(&mut self, additional: usize)783     pub fn reserve(&mut self, additional: usize) {
784         let new_cap = self.len.checked_add(additional).expect("capacity overflow");
785         let old_cap = self.capacity();
786 
787         if new_cap > old_cap {
788             // we don't need to reserve_exact(), as the size doesn't have
789             // to be a power of 2.
790             self.buf.reserve(self.len, additional);
791             unsafe {
792                 self.handle_capacity_increase(old_cap);
793             }
794         }
795     }
796 
797     /// Tries to reserve the minimum capacity for at least `additional` more elements to
798     /// be inserted in the given deque. After calling `try_reserve_exact`,
799     /// capacity will be greater than or equal to `self.len() + additional` if
800     /// it returns `Ok(())`. Does nothing if the capacity is already sufficient.
801     ///
802     /// Note that the allocator may give the collection more space than it
803     /// requests. Therefore, capacity can not be relied upon to be precisely
804     /// minimal. Prefer [`try_reserve`] if future insertions are expected.
805     ///
806     /// [`try_reserve`]: VecDeque::try_reserve
807     ///
808     /// # Errors
809     ///
810     /// If the capacity overflows `usize`, or the allocator reports a failure, then an error
811     /// is returned.
812     ///
813     /// # Examples
814     ///
815     /// ```
816     /// use std::collections::TryReserveError;
817     /// use std::collections::VecDeque;
818     ///
819     /// fn process_data(data: &[u32]) -> Result<VecDeque<u32>, TryReserveError> {
820     ///     let mut output = VecDeque::new();
821     ///
822     ///     // Pre-reserve the memory, exiting if we can't
823     ///     output.try_reserve_exact(data.len())?;
824     ///
825     ///     // Now we know this can't OOM(Out-Of-Memory) in the middle of our complex work
826     ///     output.extend(data.iter().map(|&val| {
827     ///         val * 2 + 5 // very complicated
828     ///     }));
829     ///
830     ///     Ok(output)
831     /// }
832     /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?");
833     /// ```
834     #[stable(feature = "try_reserve", since = "1.57.0")]
try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError>835     pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> {
836         let new_cap =
837             self.len.checked_add(additional).ok_or(TryReserveErrorKind::CapacityOverflow)?;
838         let old_cap = self.capacity();
839 
840         if new_cap > old_cap {
841             self.buf.try_reserve_exact(self.len, additional)?;
842             unsafe {
843                 self.handle_capacity_increase(old_cap);
844             }
845         }
846         Ok(())
847     }
848 
849     /// Tries to reserve capacity for at least `additional` more elements to be inserted
850     /// in the given deque. The collection may reserve more space to speculatively avoid
851     /// frequent reallocations. After calling `try_reserve`, capacity will be
852     /// greater than or equal to `self.len() + additional` if it returns
853     /// `Ok(())`. Does nothing if capacity is already sufficient. This method
854     /// preserves the contents even if an error occurs.
855     ///
856     /// # Errors
857     ///
858     /// If the capacity overflows `usize`, or the allocator reports a failure, then an error
859     /// is returned.
860     ///
861     /// # Examples
862     ///
863     /// ```
864     /// use std::collections::TryReserveError;
865     /// use std::collections::VecDeque;
866     ///
867     /// fn process_data(data: &[u32]) -> Result<VecDeque<u32>, TryReserveError> {
868     ///     let mut output = VecDeque::new();
869     ///
870     ///     // Pre-reserve the memory, exiting if we can't
871     ///     output.try_reserve(data.len())?;
872     ///
873     ///     // Now we know this can't OOM in the middle of our complex work
874     ///     output.extend(data.iter().map(|&val| {
875     ///         val * 2 + 5 // very complicated
876     ///     }));
877     ///
878     ///     Ok(output)
879     /// }
880     /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?");
881     /// ```
882     #[stable(feature = "try_reserve", since = "1.57.0")]
try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>883     pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
884         let new_cap =
885             self.len.checked_add(additional).ok_or(TryReserveErrorKind::CapacityOverflow)?;
886         let old_cap = self.capacity();
887 
888         if new_cap > old_cap {
889             self.buf.try_reserve(self.len, additional)?;
890             unsafe {
891                 self.handle_capacity_increase(old_cap);
892             }
893         }
894         Ok(())
895     }
896 
897     /// Shrinks the capacity of the deque as much as possible.
898     ///
899     /// It will drop down as close as possible to the length but the allocator may still inform the
900     /// deque that there is space for a few more elements.
901     ///
902     /// # Examples
903     ///
904     /// ```
905     /// use std::collections::VecDeque;
906     ///
907     /// let mut buf = VecDeque::with_capacity(15);
908     /// buf.extend(0..4);
909     /// assert_eq!(buf.capacity(), 15);
910     /// buf.shrink_to_fit();
911     /// assert!(buf.capacity() >= 4);
912     /// ```
913     #[stable(feature = "deque_extras_15", since = "1.5.0")]
shrink_to_fit(&mut self)914     pub fn shrink_to_fit(&mut self) {
915         self.shrink_to(0);
916     }
917 
918     /// Shrinks the capacity of the deque with a lower bound.
919     ///
920     /// The capacity will remain at least as large as both the length
921     /// and the supplied value.
922     ///
923     /// If the current capacity is less than the lower limit, this is a no-op.
924     ///
925     /// # Examples
926     ///
927     /// ```
928     /// use std::collections::VecDeque;
929     ///
930     /// let mut buf = VecDeque::with_capacity(15);
931     /// buf.extend(0..4);
932     /// assert_eq!(buf.capacity(), 15);
933     /// buf.shrink_to(6);
934     /// assert!(buf.capacity() >= 6);
935     /// buf.shrink_to(0);
936     /// assert!(buf.capacity() >= 4);
937     /// ```
938     #[stable(feature = "shrink_to", since = "1.56.0")]
shrink_to(&mut self, min_capacity: usize)939     pub fn shrink_to(&mut self, min_capacity: usize) {
940         let target_cap = min_capacity.max(self.len);
941 
942         // never shrink ZSTs
943         if T::IS_ZST || self.capacity() <= target_cap {
944             return;
945         }
946 
947         // There are three cases of interest:
948         //   All elements are out of desired bounds
949         //   Elements are contiguous, and tail is out of desired bounds
950         //   Elements are discontiguous
951         //
952         // At all other times, element positions are unaffected.
953 
954         // `head` and `len` are at most `isize::MAX` and `target_cap < self.capacity()`, so nothing can
955         // overflow.
956         let tail_outside = (target_cap + 1..=self.capacity()).contains(&(self.head + self.len));
957 
958         if self.len == 0 {
959             self.head = 0;
960         } else if self.head >= target_cap && tail_outside {
961             // Head and tail are both out of bounds, so copy all of them to the front.
962             //
963             //  H := head
964             //  L := last element
965             //                    H           L
966             //   [. . . . . . . . o o o o o o o . ]
967             //    H           L
968             //   [o o o o o o o . ]
969             unsafe {
970                 // nonoverlapping because `self.head >= target_cap >= self.len`.
971                 self.copy_nonoverlapping(self.head, 0, self.len);
972             }
973             self.head = 0;
974         } else if self.head < target_cap && tail_outside {
975             // Head is in bounds, tail is out of bounds.
976             // Copy the overflowing part to the beginning of the
977             // buffer. This won't overlap because `target_cap >= self.len`.
978             //
979             //  H := head
980             //  L := last element
981             //          H           L
982             //   [. . . o o o o o o o . . . . . . ]
983             //      L   H
984             //   [o o . o o o o o ]
985             let len = self.head + self.len - target_cap;
986             unsafe {
987                 self.copy_nonoverlapping(target_cap, 0, len);
988             }
989         } else if !self.is_contiguous() {
990             // The head slice is at least partially out of bounds, tail is in bounds.
991             // Copy the head backwards so it lines up with the target capacity.
992             // This won't overlap because `target_cap >= self.len`.
993             //
994             //  H := head
995             //  L := last element
996             //            L                   H
997             //   [o o o o o . . . . . . . . . o o ]
998             //            L   H
999             //   [o o o o o . o o ]
1000             let head_len = self.capacity() - self.head;
1001             let new_head = target_cap - head_len;
1002             unsafe {
1003                 // can't use `copy_nonoverlapping()` here because the new and old
1004                 // regions for the head might overlap.
1005                 self.copy(self.head, new_head, head_len);
1006             }
1007             self.head = new_head;
1008         }
1009         self.buf.shrink_to_fit(target_cap);
1010 
1011         debug_assert!(self.head < self.capacity() || self.capacity() == 0);
1012         debug_assert!(self.len <= self.capacity());
1013     }
1014 
1015     /// Shortens the deque, keeping the first `len` elements and dropping
1016     /// the rest.
1017     ///
1018     /// If `len` is greater than the deque's current length, this has no
1019     /// effect.
1020     ///
1021     /// # Examples
1022     ///
1023     /// ```
1024     /// use std::collections::VecDeque;
1025     ///
1026     /// let mut buf = VecDeque::new();
1027     /// buf.push_back(5);
1028     /// buf.push_back(10);
1029     /// buf.push_back(15);
1030     /// assert_eq!(buf, [5, 10, 15]);
1031     /// buf.truncate(1);
1032     /// assert_eq!(buf, [5]);
1033     /// ```
1034     #[stable(feature = "deque_extras", since = "1.16.0")]
truncate(&mut self, len: usize)1035     pub fn truncate(&mut self, len: usize) {
1036         /// Runs the destructor for all items in the slice when it gets dropped (normally or
1037         /// during unwinding).
1038         struct Dropper<'a, T>(&'a mut [T]);
1039 
1040         impl<'a, T> Drop for Dropper<'a, T> {
1041             fn drop(&mut self) {
1042                 unsafe {
1043                     ptr::drop_in_place(self.0);
1044                 }
1045             }
1046         }
1047 
1048         // Safe because:
1049         //
1050         // * Any slice passed to `drop_in_place` is valid; the second case has
1051         //   `len <= front.len()` and returning on `len > self.len()` ensures
1052         //   `begin <= back.len()` in the first case
1053         // * The head of the VecDeque is moved before calling `drop_in_place`,
1054         //   so no value is dropped twice if `drop_in_place` panics
1055         unsafe {
1056             if len >= self.len {
1057                 return;
1058             }
1059 
1060             let (front, back) = self.as_mut_slices();
1061             if len > front.len() {
1062                 let begin = len - front.len();
1063                 let drop_back = back.get_unchecked_mut(begin..) as *mut _;
1064                 self.len = len;
1065                 ptr::drop_in_place(drop_back);
1066             } else {
1067                 let drop_back = back as *mut _;
1068                 let drop_front = front.get_unchecked_mut(len..) as *mut _;
1069                 self.len = len;
1070 
1071                 // Make sure the second half is dropped even when a destructor
1072                 // in the first one panics.
1073                 let _back_dropper = Dropper(&mut *drop_back);
1074                 ptr::drop_in_place(drop_front);
1075             }
1076         }
1077     }
1078 
1079     /// Returns a reference to the underlying allocator.
1080     #[unstable(feature = "allocator_api", issue = "32838")]
1081     #[inline]
allocator(&self) -> &A1082     pub fn allocator(&self) -> &A {
1083         self.buf.allocator()
1084     }
1085 
1086     /// Returns a front-to-back iterator.
1087     ///
1088     /// # Examples
1089     ///
1090     /// ```
1091     /// use std::collections::VecDeque;
1092     ///
1093     /// let mut buf = VecDeque::new();
1094     /// buf.push_back(5);
1095     /// buf.push_back(3);
1096     /// buf.push_back(4);
1097     /// let b: &[_] = &[&5, &3, &4];
1098     /// let c: Vec<&i32> = buf.iter().collect();
1099     /// assert_eq!(&c[..], b);
1100     /// ```
1101     #[stable(feature = "rust1", since = "1.0.0")]
iter(&self) -> Iter<'_, T>1102     pub fn iter(&self) -> Iter<'_, T> {
1103         let (a, b) = self.as_slices();
1104         Iter::new(a.iter(), b.iter())
1105     }
1106 
1107     /// Returns a front-to-back iterator that returns mutable references.
1108     ///
1109     /// # Examples
1110     ///
1111     /// ```
1112     /// use std::collections::VecDeque;
1113     ///
1114     /// let mut buf = VecDeque::new();
1115     /// buf.push_back(5);
1116     /// buf.push_back(3);
1117     /// buf.push_back(4);
1118     /// for num in buf.iter_mut() {
1119     ///     *num = *num - 2;
1120     /// }
1121     /// let b: &[_] = &[&mut 3, &mut 1, &mut 2];
1122     /// assert_eq!(&buf.iter_mut().collect::<Vec<&mut i32>>()[..], b);
1123     /// ```
1124     #[stable(feature = "rust1", since = "1.0.0")]
iter_mut(&mut self) -> IterMut<'_, T>1125     pub fn iter_mut(&mut self) -> IterMut<'_, T> {
1126         let (a, b) = self.as_mut_slices();
1127         IterMut::new(a.iter_mut(), b.iter_mut())
1128     }
1129 
1130     /// Returns a pair of slices which contain, in order, the contents of the
1131     /// deque.
1132     ///
1133     /// If [`make_contiguous`] was previously called, all elements of the
1134     /// deque will be in the first slice and the second slice will be empty.
1135     ///
1136     /// [`make_contiguous`]: VecDeque::make_contiguous
1137     ///
1138     /// # Examples
1139     ///
1140     /// ```
1141     /// use std::collections::VecDeque;
1142     ///
1143     /// let mut deque = VecDeque::new();
1144     ///
1145     /// deque.push_back(0);
1146     /// deque.push_back(1);
1147     /// deque.push_back(2);
1148     ///
1149     /// assert_eq!(deque.as_slices(), (&[0, 1, 2][..], &[][..]));
1150     ///
1151     /// deque.push_front(10);
1152     /// deque.push_front(9);
1153     ///
1154     /// assert_eq!(deque.as_slices(), (&[9, 10][..], &[0, 1, 2][..]));
1155     /// ```
1156     #[inline]
1157     #[stable(feature = "deque_extras_15", since = "1.5.0")]
as_slices(&self) -> (&[T], &[T])1158     pub fn as_slices(&self) -> (&[T], &[T]) {
1159         let (a_range, b_range) = self.slice_ranges(.., self.len);
1160         // SAFETY: `slice_ranges` always returns valid ranges into
1161         // the physical buffer.
1162         unsafe { (&*self.buffer_range(a_range), &*self.buffer_range(b_range)) }
1163     }
1164 
1165     /// Returns a pair of slices which contain, in order, the contents of the
1166     /// deque.
1167     ///
1168     /// If [`make_contiguous`] was previously called, all elements of the
1169     /// deque will be in the first slice and the second slice will be empty.
1170     ///
1171     /// [`make_contiguous`]: VecDeque::make_contiguous
1172     ///
1173     /// # Examples
1174     ///
1175     /// ```
1176     /// use std::collections::VecDeque;
1177     ///
1178     /// let mut deque = VecDeque::new();
1179     ///
1180     /// deque.push_back(0);
1181     /// deque.push_back(1);
1182     ///
1183     /// deque.push_front(10);
1184     /// deque.push_front(9);
1185     ///
1186     /// deque.as_mut_slices().0[0] = 42;
1187     /// deque.as_mut_slices().1[0] = 24;
1188     /// assert_eq!(deque.as_slices(), (&[42, 10][..], &[24, 1][..]));
1189     /// ```
1190     #[inline]
1191     #[stable(feature = "deque_extras_15", since = "1.5.0")]
as_mut_slices(&mut self) -> (&mut [T], &mut [T])1192     pub fn as_mut_slices(&mut self) -> (&mut [T], &mut [T]) {
1193         let (a_range, b_range) = self.slice_ranges(.., self.len);
1194         // SAFETY: `slice_ranges` always returns valid ranges into
1195         // the physical buffer.
1196         unsafe { (&mut *self.buffer_range(a_range), &mut *self.buffer_range(b_range)) }
1197     }
1198 
1199     /// Returns the number of elements in the deque.
1200     ///
1201     /// # Examples
1202     ///
1203     /// ```
1204     /// use std::collections::VecDeque;
1205     ///
1206     /// let mut deque = VecDeque::new();
1207     /// assert_eq!(deque.len(), 0);
1208     /// deque.push_back(1);
1209     /// assert_eq!(deque.len(), 1);
1210     /// ```
1211     #[stable(feature = "rust1", since = "1.0.0")]
len(&self) -> usize1212     pub fn len(&self) -> usize {
1213         self.len
1214     }
1215 
1216     /// Returns `true` if the deque is empty.
1217     ///
1218     /// # Examples
1219     ///
1220     /// ```
1221     /// use std::collections::VecDeque;
1222     ///
1223     /// let mut deque = VecDeque::new();
1224     /// assert!(deque.is_empty());
1225     /// deque.push_front(1);
1226     /// assert!(!deque.is_empty());
1227     /// ```
1228     #[stable(feature = "rust1", since = "1.0.0")]
is_empty(&self) -> bool1229     pub fn is_empty(&self) -> bool {
1230         self.len == 0
1231     }
1232 
1233     /// Given a range into the logical buffer of the deque, this function
1234     /// return two ranges into the physical buffer that correspond to
1235     /// the given range. The `len` parameter should usually just be `self.len`;
1236     /// the reason it's passed explicitly is that if the deque is wrapped in
1237     /// a `Drain`, then `self.len` is not actually the length of the deque.
1238     ///
1239     /// # Safety
1240     ///
1241     /// This function is always safe to call. For the resulting ranges to be valid
1242     /// ranges into the physical buffer, the caller must ensure that the result of
1243     /// calling `slice::range(range, ..len)` represents a valid range into the
1244     /// logical buffer, and that all elements in that range are initialized.
slice_ranges<R>(&self, range: R, len: usize) -> (Range<usize>, Range<usize>) where R: RangeBounds<usize>,1245     fn slice_ranges<R>(&self, range: R, len: usize) -> (Range<usize>, Range<usize>)
1246     where
1247         R: RangeBounds<usize>,
1248     {
1249         let Range { start, end } = slice::range(range, ..len);
1250         let len = end - start;
1251 
1252         if len == 0 {
1253             (0..0, 0..0)
1254         } else {
1255             // `slice::range` guarantees that `start <= end <= len`.
1256             // because `len != 0`, we know that `start < end`, so `start < len`
1257             // and the indexing is valid.
1258             let wrapped_start = self.to_physical_idx(start);
1259 
1260             // this subtraction can never overflow because `wrapped_start` is
1261             // at most `self.capacity()` (and if `self.capacity != 0`, then `wrapped_start` is strictly less
1262             // than `self.capacity`).
1263             let head_len = self.capacity() - wrapped_start;
1264 
1265             if head_len >= len {
1266                 // we know that `len + wrapped_start <= self.capacity <= usize::MAX`, so this addition can't overflow
1267                 (wrapped_start..wrapped_start + len, 0..0)
1268             } else {
1269                 // can't overflow because of the if condition
1270                 let tail_len = len - head_len;
1271                 (wrapped_start..self.capacity(), 0..tail_len)
1272             }
1273         }
1274     }
1275 
1276     /// Creates an iterator that covers the specified range in the deque.
1277     ///
1278     /// # Panics
1279     ///
1280     /// Panics if the starting point is greater than the end point or if
1281     /// the end point is greater than the length of the deque.
1282     ///
1283     /// # Examples
1284     ///
1285     /// ```
1286     /// use std::collections::VecDeque;
1287     ///
1288     /// let deque: VecDeque<_> = [1, 2, 3].into();
1289     /// let range = deque.range(2..).copied().collect::<VecDeque<_>>();
1290     /// assert_eq!(range, [3]);
1291     ///
1292     /// // A full range covers all contents
1293     /// let all = deque.range(..);
1294     /// assert_eq!(all.len(), 3);
1295     /// ```
1296     #[inline]
1297     #[stable(feature = "deque_range", since = "1.51.0")]
range<R>(&self, range: R) -> Iter<'_, T> where R: RangeBounds<usize>,1298     pub fn range<R>(&self, range: R) -> Iter<'_, T>
1299     where
1300         R: RangeBounds<usize>,
1301     {
1302         let (a_range, b_range) = self.slice_ranges(range, self.len);
1303         // SAFETY: The ranges returned by `slice_ranges`
1304         // are valid ranges into the physical buffer, so
1305         // it's ok to pass them to `buffer_range` and
1306         // dereference the result.
1307         let a = unsafe { &*self.buffer_range(a_range) };
1308         let b = unsafe { &*self.buffer_range(b_range) };
1309         Iter::new(a.iter(), b.iter())
1310     }
1311 
1312     /// Creates an iterator that covers the specified mutable range in the deque.
1313     ///
1314     /// # Panics
1315     ///
1316     /// Panics if the starting point is greater than the end point or if
1317     /// the end point is greater than the length of the deque.
1318     ///
1319     /// # Examples
1320     ///
1321     /// ```
1322     /// use std::collections::VecDeque;
1323     ///
1324     /// let mut deque: VecDeque<_> = [1, 2, 3].into();
1325     /// for v in deque.range_mut(2..) {
1326     ///   *v *= 2;
1327     /// }
1328     /// assert_eq!(deque, [1, 2, 6]);
1329     ///
1330     /// // A full range covers all contents
1331     /// for v in deque.range_mut(..) {
1332     ///   *v *= 2;
1333     /// }
1334     /// assert_eq!(deque, [2, 4, 12]);
1335     /// ```
1336     #[inline]
1337     #[stable(feature = "deque_range", since = "1.51.0")]
range_mut<R>(&mut self, range: R) -> IterMut<'_, T> where R: RangeBounds<usize>,1338     pub fn range_mut<R>(&mut self, range: R) -> IterMut<'_, T>
1339     where
1340         R: RangeBounds<usize>,
1341     {
1342         let (a_range, b_range) = self.slice_ranges(range, self.len);
1343         // SAFETY: The ranges returned by `slice_ranges`
1344         // are valid ranges into the physical buffer, so
1345         // it's ok to pass them to `buffer_range` and
1346         // dereference the result.
1347         let a = unsafe { &mut *self.buffer_range(a_range) };
1348         let b = unsafe { &mut *self.buffer_range(b_range) };
1349         IterMut::new(a.iter_mut(), b.iter_mut())
1350     }
1351 
1352     /// Removes the specified range from the deque in bulk, returning all
1353     /// removed elements as an iterator. If the iterator is dropped before
1354     /// being fully consumed, it drops the remaining removed elements.
1355     ///
1356     /// The returned iterator keeps a mutable borrow on the queue to optimize
1357     /// its implementation.
1358     ///
1359     ///
1360     /// # Panics
1361     ///
1362     /// Panics if the starting point is greater than the end point or if
1363     /// the end point is greater than the length of the deque.
1364     ///
1365     /// # Leaking
1366     ///
1367     /// If the returned iterator goes out of scope without being dropped (due to
1368     /// [`mem::forget`], for example), the deque may have lost and leaked
1369     /// elements arbitrarily, including elements outside the range.
1370     ///
1371     /// # Examples
1372     ///
1373     /// ```
1374     /// use std::collections::VecDeque;
1375     ///
1376     /// let mut deque: VecDeque<_> = [1, 2, 3].into();
1377     /// let drained = deque.drain(2..).collect::<VecDeque<_>>();
1378     /// assert_eq!(drained, [3]);
1379     /// assert_eq!(deque, [1, 2]);
1380     ///
1381     /// // A full range clears all contents, like `clear()` does
1382     /// deque.drain(..);
1383     /// assert!(deque.is_empty());
1384     /// ```
1385     #[inline]
1386     #[stable(feature = "drain", since = "1.6.0")]
drain<R>(&mut self, range: R) -> Drain<'_, T, A> where R: RangeBounds<usize>,1387     pub fn drain<R>(&mut self, range: R) -> Drain<'_, T, A>
1388     where
1389         R: RangeBounds<usize>,
1390     {
1391         // Memory safety
1392         //
1393         // When the Drain is first created, the source deque is shortened to
1394         // make sure no uninitialized or moved-from elements are accessible at
1395         // all if the Drain's destructor never gets to run.
1396         //
1397         // Drain will ptr::read out the values to remove.
1398         // When finished, the remaining data will be copied back to cover the hole,
1399         // and the head/tail values will be restored correctly.
1400         //
1401         let Range { start, end } = slice::range(range, ..self.len);
1402         let drain_start = start;
1403         let drain_len = end - start;
1404 
1405         // The deque's elements are parted into three segments:
1406         // * 0  -> drain_start
1407         // * drain_start -> drain_start+drain_len
1408         // * drain_start+drain_len -> self.len
1409         //
1410         // H = self.head; T = self.head+self.len; t = drain_start+drain_len; h = drain_head
1411         //
1412         // We store drain_start as self.len, and drain_len and self.len as
1413         // drain_len and orig_len respectively on the Drain. This also
1414         // truncates the effective array such that if the Drain is leaked, we
1415         // have forgotten about the potentially moved values after the start of
1416         // the drain.
1417         //
1418         //        H   h   t   T
1419         // [. . . o o x x o o . . .]
1420         //
1421         // "forget" about the values after the start of the drain until after
1422         // the drain is complete and the Drain destructor is run.
1423 
1424         unsafe { Drain::new(self, drain_start, drain_len) }
1425     }
1426 
1427     /// Clears the deque, removing all values.
1428     ///
1429     /// # Examples
1430     ///
1431     /// ```
1432     /// use std::collections::VecDeque;
1433     ///
1434     /// let mut deque = VecDeque::new();
1435     /// deque.push_back(1);
1436     /// deque.clear();
1437     /// assert!(deque.is_empty());
1438     /// ```
1439     #[stable(feature = "rust1", since = "1.0.0")]
1440     #[inline]
clear(&mut self)1441     pub fn clear(&mut self) {
1442         self.truncate(0);
1443         // Not strictly necessary, but leaves things in a more consistent/predictable state.
1444         self.head = 0;
1445     }
1446 
1447     /// Returns `true` if the deque contains an element equal to the
1448     /// given value.
1449     ///
1450     /// This operation is *O*(*n*).
1451     ///
1452     /// Note that if you have a sorted `VecDeque`, [`binary_search`] may be faster.
1453     ///
1454     /// [`binary_search`]: VecDeque::binary_search
1455     ///
1456     /// # Examples
1457     ///
1458     /// ```
1459     /// use std::collections::VecDeque;
1460     ///
1461     /// let mut deque: VecDeque<u32> = VecDeque::new();
1462     ///
1463     /// deque.push_back(0);
1464     /// deque.push_back(1);
1465     ///
1466     /// assert_eq!(deque.contains(&1), true);
1467     /// assert_eq!(deque.contains(&10), false);
1468     /// ```
1469     #[stable(feature = "vec_deque_contains", since = "1.12.0")]
contains(&self, x: &T) -> bool where T: PartialEq<T>,1470     pub fn contains(&self, x: &T) -> bool
1471     where
1472         T: PartialEq<T>,
1473     {
1474         let (a, b) = self.as_slices();
1475         a.contains(x) || b.contains(x)
1476     }
1477 
1478     /// Provides a reference to the front element, or `None` if the deque is
1479     /// empty.
1480     ///
1481     /// # Examples
1482     ///
1483     /// ```
1484     /// use std::collections::VecDeque;
1485     ///
1486     /// let mut d = VecDeque::new();
1487     /// assert_eq!(d.front(), None);
1488     ///
1489     /// d.push_back(1);
1490     /// d.push_back(2);
1491     /// assert_eq!(d.front(), Some(&1));
1492     /// ```
1493     #[stable(feature = "rust1", since = "1.0.0")]
front(&self) -> Option<&T>1494     pub fn front(&self) -> Option<&T> {
1495         self.get(0)
1496     }
1497 
1498     /// Provides a mutable reference to the front element, or `None` if the
1499     /// deque is empty.
1500     ///
1501     /// # Examples
1502     ///
1503     /// ```
1504     /// use std::collections::VecDeque;
1505     ///
1506     /// let mut d = VecDeque::new();
1507     /// assert_eq!(d.front_mut(), None);
1508     ///
1509     /// d.push_back(1);
1510     /// d.push_back(2);
1511     /// match d.front_mut() {
1512     ///     Some(x) => *x = 9,
1513     ///     None => (),
1514     /// }
1515     /// assert_eq!(d.front(), Some(&9));
1516     /// ```
1517     #[stable(feature = "rust1", since = "1.0.0")]
front_mut(&mut self) -> Option<&mut T>1518     pub fn front_mut(&mut self) -> Option<&mut T> {
1519         self.get_mut(0)
1520     }
1521 
1522     /// Provides a reference to the back element, or `None` if the deque is
1523     /// empty.
1524     ///
1525     /// # Examples
1526     ///
1527     /// ```
1528     /// use std::collections::VecDeque;
1529     ///
1530     /// let mut d = VecDeque::new();
1531     /// assert_eq!(d.back(), None);
1532     ///
1533     /// d.push_back(1);
1534     /// d.push_back(2);
1535     /// assert_eq!(d.back(), Some(&2));
1536     /// ```
1537     #[stable(feature = "rust1", since = "1.0.0")]
back(&self) -> Option<&T>1538     pub fn back(&self) -> Option<&T> {
1539         self.get(self.len.wrapping_sub(1))
1540     }
1541 
1542     /// Provides a mutable reference to the back element, or `None` if the
1543     /// deque is empty.
1544     ///
1545     /// # Examples
1546     ///
1547     /// ```
1548     /// use std::collections::VecDeque;
1549     ///
1550     /// let mut d = VecDeque::new();
1551     /// assert_eq!(d.back(), None);
1552     ///
1553     /// d.push_back(1);
1554     /// d.push_back(2);
1555     /// match d.back_mut() {
1556     ///     Some(x) => *x = 9,
1557     ///     None => (),
1558     /// }
1559     /// assert_eq!(d.back(), Some(&9));
1560     /// ```
1561     #[stable(feature = "rust1", since = "1.0.0")]
back_mut(&mut self) -> Option<&mut T>1562     pub fn back_mut(&mut self) -> Option<&mut T> {
1563         self.get_mut(self.len.wrapping_sub(1))
1564     }
1565 
1566     /// Removes the first element and returns it, or `None` if the deque is
1567     /// empty.
1568     ///
1569     /// # Examples
1570     ///
1571     /// ```
1572     /// use std::collections::VecDeque;
1573     ///
1574     /// let mut d = VecDeque::new();
1575     /// d.push_back(1);
1576     /// d.push_back(2);
1577     ///
1578     /// assert_eq!(d.pop_front(), Some(1));
1579     /// assert_eq!(d.pop_front(), Some(2));
1580     /// assert_eq!(d.pop_front(), None);
1581     /// ```
1582     #[stable(feature = "rust1", since = "1.0.0")]
pop_front(&mut self) -> Option<T>1583     pub fn pop_front(&mut self) -> Option<T> {
1584         if self.is_empty() {
1585             None
1586         } else {
1587             let old_head = self.head;
1588             self.head = self.to_physical_idx(1);
1589             self.len -= 1;
1590             Some(unsafe { self.buffer_read(old_head) })
1591         }
1592     }
1593 
1594     /// Removes the last element from the deque and returns it, or `None` if
1595     /// it is empty.
1596     ///
1597     /// # Examples
1598     ///
1599     /// ```
1600     /// use std::collections::VecDeque;
1601     ///
1602     /// let mut buf = VecDeque::new();
1603     /// assert_eq!(buf.pop_back(), None);
1604     /// buf.push_back(1);
1605     /// buf.push_back(3);
1606     /// assert_eq!(buf.pop_back(), Some(3));
1607     /// ```
1608     #[stable(feature = "rust1", since = "1.0.0")]
pop_back(&mut self) -> Option<T>1609     pub fn pop_back(&mut self) -> Option<T> {
1610         if self.is_empty() {
1611             None
1612         } else {
1613             self.len -= 1;
1614             Some(unsafe { self.buffer_read(self.to_physical_idx(self.len)) })
1615         }
1616     }
1617 
1618     /// Prepends an element to the deque.
1619     ///
1620     /// # Examples
1621     ///
1622     /// ```
1623     /// use std::collections::VecDeque;
1624     ///
1625     /// let mut d = VecDeque::new();
1626     /// d.push_front(1);
1627     /// d.push_front(2);
1628     /// assert_eq!(d.front(), Some(&2));
1629     /// ```
1630     #[stable(feature = "rust1", since = "1.0.0")]
push_front(&mut self, value: T)1631     pub fn push_front(&mut self, value: T) {
1632         if self.is_full() {
1633             self.grow();
1634         }
1635 
1636         self.head = self.wrap_sub(self.head, 1);
1637         self.len += 1;
1638 
1639         unsafe {
1640             self.buffer_write(self.head, value);
1641         }
1642     }
1643 
1644     /// Appends an element to the back of the deque.
1645     ///
1646     /// # Examples
1647     ///
1648     /// ```
1649     /// use std::collections::VecDeque;
1650     ///
1651     /// let mut buf = VecDeque::new();
1652     /// buf.push_back(1);
1653     /// buf.push_back(3);
1654     /// assert_eq!(3, *buf.back().unwrap());
1655     /// ```
1656     #[stable(feature = "rust1", since = "1.0.0")]
push_back(&mut self, value: T)1657     pub fn push_back(&mut self, value: T) {
1658         if self.is_full() {
1659             self.grow();
1660         }
1661 
1662         unsafe { self.buffer_write(self.to_physical_idx(self.len), value) }
1663         self.len += 1;
1664     }
1665 
1666     #[inline]
is_contiguous(&self) -> bool1667     fn is_contiguous(&self) -> bool {
1668         // Do the calculation like this to avoid overflowing if len + head > usize::MAX
1669         self.head <= self.capacity() - self.len
1670     }
1671 
1672     /// Removes an element from anywhere in the deque and returns it,
1673     /// replacing it with the first element.
1674     ///
1675     /// This does not preserve ordering, but is *O*(1).
1676     ///
1677     /// Returns `None` if `index` is out of bounds.
1678     ///
1679     /// Element at index 0 is the front of the queue.
1680     ///
1681     /// # Examples
1682     ///
1683     /// ```
1684     /// use std::collections::VecDeque;
1685     ///
1686     /// let mut buf = VecDeque::new();
1687     /// assert_eq!(buf.swap_remove_front(0), None);
1688     /// buf.push_back(1);
1689     /// buf.push_back(2);
1690     /// buf.push_back(3);
1691     /// assert_eq!(buf, [1, 2, 3]);
1692     ///
1693     /// assert_eq!(buf.swap_remove_front(2), Some(3));
1694     /// assert_eq!(buf, [2, 1]);
1695     /// ```
1696     #[stable(feature = "deque_extras_15", since = "1.5.0")]
swap_remove_front(&mut self, index: usize) -> Option<T>1697     pub fn swap_remove_front(&mut self, index: usize) -> Option<T> {
1698         let length = self.len;
1699         if index < length && index != 0 {
1700             self.swap(index, 0);
1701         } else if index >= length {
1702             return None;
1703         }
1704         self.pop_front()
1705     }
1706 
1707     /// Removes an element from anywhere in the deque and returns it,
1708     /// replacing it with the last element.
1709     ///
1710     /// This does not preserve ordering, but is *O*(1).
1711     ///
1712     /// Returns `None` if `index` is out of bounds.
1713     ///
1714     /// Element at index 0 is the front of the queue.
1715     ///
1716     /// # Examples
1717     ///
1718     /// ```
1719     /// use std::collections::VecDeque;
1720     ///
1721     /// let mut buf = VecDeque::new();
1722     /// assert_eq!(buf.swap_remove_back(0), None);
1723     /// buf.push_back(1);
1724     /// buf.push_back(2);
1725     /// buf.push_back(3);
1726     /// assert_eq!(buf, [1, 2, 3]);
1727     ///
1728     /// assert_eq!(buf.swap_remove_back(0), Some(1));
1729     /// assert_eq!(buf, [3, 2]);
1730     /// ```
1731     #[stable(feature = "deque_extras_15", since = "1.5.0")]
swap_remove_back(&mut self, index: usize) -> Option<T>1732     pub fn swap_remove_back(&mut self, index: usize) -> Option<T> {
1733         let length = self.len;
1734         if length > 0 && index < length - 1 {
1735             self.swap(index, length - 1);
1736         } else if index >= length {
1737             return None;
1738         }
1739         self.pop_back()
1740     }
1741 
1742     /// Inserts an element at `index` within the deque, shifting all elements
1743     /// with indices greater than or equal to `index` towards the back.
1744     ///
1745     /// Element at index 0 is the front of the queue.
1746     ///
1747     /// # Panics
1748     ///
1749     /// Panics if `index` is greater than deque's length
1750     ///
1751     /// # Examples
1752     ///
1753     /// ```
1754     /// use std::collections::VecDeque;
1755     ///
1756     /// let mut vec_deque = VecDeque::new();
1757     /// vec_deque.push_back('a');
1758     /// vec_deque.push_back('b');
1759     /// vec_deque.push_back('c');
1760     /// assert_eq!(vec_deque, &['a', 'b', 'c']);
1761     ///
1762     /// vec_deque.insert(1, 'd');
1763     /// assert_eq!(vec_deque, &['a', 'd', 'b', 'c']);
1764     /// ```
1765     #[stable(feature = "deque_extras_15", since = "1.5.0")]
insert(&mut self, index: usize, value: T)1766     pub fn insert(&mut self, index: usize, value: T) {
1767         assert!(index <= self.len(), "index out of bounds");
1768         if self.is_full() {
1769             self.grow();
1770         }
1771 
1772         let k = self.len - index;
1773         if k < index {
1774             // `index + 1` can't overflow, because if index was usize::MAX, then either the
1775             // assert would've failed, or the deque would've tried to grow past usize::MAX
1776             // and panicked.
1777             unsafe {
1778                 // see `remove()` for explanation why this wrap_copy() call is safe.
1779                 self.wrap_copy(self.to_physical_idx(index), self.to_physical_idx(index + 1), k);
1780                 self.buffer_write(self.to_physical_idx(index), value);
1781                 self.len += 1;
1782             }
1783         } else {
1784             let old_head = self.head;
1785             self.head = self.wrap_sub(self.head, 1);
1786             unsafe {
1787                 self.wrap_copy(old_head, self.head, index);
1788                 self.buffer_write(self.to_physical_idx(index), value);
1789                 self.len += 1;
1790             }
1791         }
1792     }
1793 
1794     /// Removes and returns the element at `index` from the deque.
1795     /// Whichever end is closer to the removal point will be moved to make
1796     /// room, and all the affected elements will be moved to new positions.
1797     /// Returns `None` if `index` is out of bounds.
1798     ///
1799     /// Element at index 0 is the front of the queue.
1800     ///
1801     /// # Examples
1802     ///
1803     /// ```
1804     /// use std::collections::VecDeque;
1805     ///
1806     /// let mut buf = VecDeque::new();
1807     /// buf.push_back(1);
1808     /// buf.push_back(2);
1809     /// buf.push_back(3);
1810     /// assert_eq!(buf, [1, 2, 3]);
1811     ///
1812     /// assert_eq!(buf.remove(1), Some(2));
1813     /// assert_eq!(buf, [1, 3]);
1814     /// ```
1815     #[stable(feature = "rust1", since = "1.0.0")]
remove(&mut self, index: usize) -> Option<T>1816     pub fn remove(&mut self, index: usize) -> Option<T> {
1817         if self.len <= index {
1818             return None;
1819         }
1820 
1821         let wrapped_idx = self.to_physical_idx(index);
1822 
1823         let elem = unsafe { Some(self.buffer_read(wrapped_idx)) };
1824 
1825         let k = self.len - index - 1;
1826         // safety: due to the nature of the if-condition, whichever wrap_copy gets called,
1827         // its length argument will be at most `self.len / 2`, so there can't be more than
1828         // one overlapping area.
1829         if k < index {
1830             unsafe { self.wrap_copy(self.wrap_add(wrapped_idx, 1), wrapped_idx, k) };
1831             self.len -= 1;
1832         } else {
1833             let old_head = self.head;
1834             self.head = self.to_physical_idx(1);
1835             unsafe { self.wrap_copy(old_head, self.head, index) };
1836             self.len -= 1;
1837         }
1838 
1839         elem
1840     }
1841 
1842     /// Splits the deque into two at the given index.
1843     ///
1844     /// Returns a newly allocated `VecDeque`. `self` contains elements `[0, at)`,
1845     /// and the returned deque contains elements `[at, len)`.
1846     ///
1847     /// Note that the capacity of `self` does not change.
1848     ///
1849     /// Element at index 0 is the front of the queue.
1850     ///
1851     /// # Panics
1852     ///
1853     /// Panics if `at > len`.
1854     ///
1855     /// # Examples
1856     ///
1857     /// ```
1858     /// use std::collections::VecDeque;
1859     ///
1860     /// let mut buf: VecDeque<_> = [1, 2, 3].into();
1861     /// let buf2 = buf.split_off(1);
1862     /// assert_eq!(buf, [1]);
1863     /// assert_eq!(buf2, [2, 3]);
1864     /// ```
1865     #[inline]
1866     #[must_use = "use `.truncate()` if you don't need the other half"]
1867     #[stable(feature = "split_off", since = "1.4.0")]
split_off(&mut self, at: usize) -> Self where A: Clone,1868     pub fn split_off(&mut self, at: usize) -> Self
1869     where
1870         A: Clone,
1871     {
1872         let len = self.len;
1873         assert!(at <= len, "`at` out of bounds");
1874 
1875         let other_len = len - at;
1876         let mut other = VecDeque::with_capacity_in(other_len, self.allocator().clone());
1877 
1878         unsafe {
1879             let (first_half, second_half) = self.as_slices();
1880 
1881             let first_len = first_half.len();
1882             let second_len = second_half.len();
1883             if at < first_len {
1884                 // `at` lies in the first half.
1885                 let amount_in_first = first_len - at;
1886 
1887                 ptr::copy_nonoverlapping(first_half.as_ptr().add(at), other.ptr(), amount_in_first);
1888 
1889                 // just take all of the second half.
1890                 ptr::copy_nonoverlapping(
1891                     second_half.as_ptr(),
1892                     other.ptr().add(amount_in_first),
1893                     second_len,
1894                 );
1895             } else {
1896                 // `at` lies in the second half, need to factor in the elements we skipped
1897                 // in the first half.
1898                 let offset = at - first_len;
1899                 let amount_in_second = second_len - offset;
1900                 ptr::copy_nonoverlapping(
1901                     second_half.as_ptr().add(offset),
1902                     other.ptr(),
1903                     amount_in_second,
1904                 );
1905             }
1906         }
1907 
1908         // Cleanup where the ends of the buffers are
1909         self.len = at;
1910         other.len = other_len;
1911 
1912         other
1913     }
1914 
1915     /// Moves all the elements of `other` into `self`, leaving `other` empty.
1916     ///
1917     /// # Panics
1918     ///
1919     /// Panics if the new number of elements in self overflows a `usize`.
1920     ///
1921     /// # Examples
1922     ///
1923     /// ```
1924     /// use std::collections::VecDeque;
1925     ///
1926     /// let mut buf: VecDeque<_> = [1, 2].into();
1927     /// let mut buf2: VecDeque<_> = [3, 4].into();
1928     /// buf.append(&mut buf2);
1929     /// assert_eq!(buf, [1, 2, 3, 4]);
1930     /// assert_eq!(buf2, []);
1931     /// ```
1932     #[inline]
1933     #[stable(feature = "append", since = "1.4.0")]
append(&mut self, other: &mut Self)1934     pub fn append(&mut self, other: &mut Self) {
1935         if T::IS_ZST {
1936             self.len = self.len.checked_add(other.len).expect("capacity overflow");
1937             other.len = 0;
1938             other.head = 0;
1939             return;
1940         }
1941 
1942         self.reserve(other.len);
1943         unsafe {
1944             let (left, right) = other.as_slices();
1945             self.copy_slice(self.to_physical_idx(self.len), left);
1946             // no overflow, because self.capacity() >= old_cap + left.len() >= self.len + left.len()
1947             self.copy_slice(self.to_physical_idx(self.len + left.len()), right);
1948         }
1949         // SAFETY: Update pointers after copying to avoid leaving doppelganger
1950         // in case of panics.
1951         self.len += other.len;
1952         // Now that we own its values, forget everything in `other`.
1953         other.len = 0;
1954         other.head = 0;
1955     }
1956 
1957     /// Retains only the elements specified by the predicate.
1958     ///
1959     /// In other words, remove all elements `e` for which `f(&e)` returns false.
1960     /// This method operates in place, visiting each element exactly once in the
1961     /// original order, and preserves the order of the retained elements.
1962     ///
1963     /// # Examples
1964     ///
1965     /// ```
1966     /// use std::collections::VecDeque;
1967     ///
1968     /// let mut buf = VecDeque::new();
1969     /// buf.extend(1..5);
1970     /// buf.retain(|&x| x % 2 == 0);
1971     /// assert_eq!(buf, [2, 4]);
1972     /// ```
1973     ///
1974     /// Because the elements are visited exactly once in the original order,
1975     /// external state may be used to decide which elements to keep.
1976     ///
1977     /// ```
1978     /// use std::collections::VecDeque;
1979     ///
1980     /// let mut buf = VecDeque::new();
1981     /// buf.extend(1..6);
1982     ///
1983     /// let keep = [false, true, true, false, true];
1984     /// let mut iter = keep.iter();
1985     /// buf.retain(|_| *iter.next().unwrap());
1986     /// assert_eq!(buf, [2, 3, 5]);
1987     /// ```
1988     #[stable(feature = "vec_deque_retain", since = "1.4.0")]
retain<F>(&mut self, mut f: F) where F: FnMut(&T) -> bool,1989     pub fn retain<F>(&mut self, mut f: F)
1990     where
1991         F: FnMut(&T) -> bool,
1992     {
1993         self.retain_mut(|elem| f(elem));
1994     }
1995 
1996     /// Retains only the elements specified by the predicate.
1997     ///
1998     /// In other words, remove all elements `e` for which `f(&e)` returns false.
1999     /// This method operates in place, visiting each element exactly once in the
2000     /// original order, and preserves the order of the retained elements.
2001     ///
2002     /// # Examples
2003     ///
2004     /// ```
2005     /// use std::collections::VecDeque;
2006     ///
2007     /// let mut buf = VecDeque::new();
2008     /// buf.extend(1..5);
2009     /// buf.retain_mut(|x| if *x % 2 == 0 {
2010     ///     *x += 1;
2011     ///     true
2012     /// } else {
2013     ///     false
2014     /// });
2015     /// assert_eq!(buf, [3, 5]);
2016     /// ```
2017     #[stable(feature = "vec_retain_mut", since = "1.61.0")]
retain_mut<F>(&mut self, mut f: F) where F: FnMut(&mut T) -> bool,2018     pub fn retain_mut<F>(&mut self, mut f: F)
2019     where
2020         F: FnMut(&mut T) -> bool,
2021     {
2022         let len = self.len;
2023         let mut idx = 0;
2024         let mut cur = 0;
2025 
2026         // Stage 1: All values are retained.
2027         while cur < len {
2028             if !f(&mut self[cur]) {
2029                 cur += 1;
2030                 break;
2031             }
2032             cur += 1;
2033             idx += 1;
2034         }
2035         // Stage 2: Swap retained value into current idx.
2036         while cur < len {
2037             if !f(&mut self[cur]) {
2038                 cur += 1;
2039                 continue;
2040             }
2041 
2042             self.swap(idx, cur);
2043             cur += 1;
2044             idx += 1;
2045         }
2046         // Stage 3: Truncate all values after idx.
2047         if cur != idx {
2048             self.truncate(idx);
2049         }
2050     }
2051 
2052     // Double the buffer size. This method is inline(never), so we expect it to only
2053     // be called in cold paths.
2054     // This may panic or abort
2055     #[inline(never)]
grow(&mut self)2056     fn grow(&mut self) {
2057         // Extend or possibly remove this assertion when valid use-cases for growing the
2058         // buffer without it being full emerge
2059         debug_assert!(self.is_full());
2060         let old_cap = self.capacity();
2061         self.buf.reserve_for_push(old_cap);
2062         unsafe {
2063             self.handle_capacity_increase(old_cap);
2064         }
2065         debug_assert!(!self.is_full());
2066     }
2067 
2068     /// Modifies the deque in-place so that `len()` is equal to `new_len`,
2069     /// either by removing excess elements from the back or by appending
2070     /// elements generated by calling `generator` to the back.
2071     ///
2072     /// # Examples
2073     ///
2074     /// ```
2075     /// use std::collections::VecDeque;
2076     ///
2077     /// let mut buf = VecDeque::new();
2078     /// buf.push_back(5);
2079     /// buf.push_back(10);
2080     /// buf.push_back(15);
2081     /// assert_eq!(buf, [5, 10, 15]);
2082     ///
2083     /// buf.resize_with(5, Default::default);
2084     /// assert_eq!(buf, [5, 10, 15, 0, 0]);
2085     ///
2086     /// buf.resize_with(2, || unreachable!());
2087     /// assert_eq!(buf, [5, 10]);
2088     ///
2089     /// let mut state = 100;
2090     /// buf.resize_with(5, || { state += 1; state });
2091     /// assert_eq!(buf, [5, 10, 101, 102, 103]);
2092     /// ```
2093     #[stable(feature = "vec_resize_with", since = "1.33.0")]
resize_with(&mut self, new_len: usize, generator: impl FnMut() -> T)2094     pub fn resize_with(&mut self, new_len: usize, generator: impl FnMut() -> T) {
2095         let len = self.len;
2096 
2097         if new_len > len {
2098             self.extend(repeat_with(generator).take(new_len - len))
2099         } else {
2100             self.truncate(new_len);
2101         }
2102     }
2103 
2104     /// Rearranges the internal storage of this deque so it is one contiguous
2105     /// slice, which is then returned.
2106     ///
2107     /// This method does not allocate and does not change the order of the
2108     /// inserted elements. As it returns a mutable slice, this can be used to
2109     /// sort a deque.
2110     ///
2111     /// Once the internal storage is contiguous, the [`as_slices`] and
2112     /// [`as_mut_slices`] methods will return the entire contents of the
2113     /// deque in a single slice.
2114     ///
2115     /// [`as_slices`]: VecDeque::as_slices
2116     /// [`as_mut_slices`]: VecDeque::as_mut_slices
2117     ///
2118     /// # Examples
2119     ///
2120     /// Sorting the content of a deque.
2121     ///
2122     /// ```
2123     /// use std::collections::VecDeque;
2124     ///
2125     /// let mut buf = VecDeque::with_capacity(15);
2126     ///
2127     /// buf.push_back(2);
2128     /// buf.push_back(1);
2129     /// buf.push_front(3);
2130     ///
2131     /// // sorting the deque
2132     /// buf.make_contiguous().sort();
2133     /// assert_eq!(buf.as_slices(), (&[1, 2, 3] as &[_], &[] as &[_]));
2134     ///
2135     /// // sorting it in reverse order
2136     /// buf.make_contiguous().sort_by(|a, b| b.cmp(a));
2137     /// assert_eq!(buf.as_slices(), (&[3, 2, 1] as &[_], &[] as &[_]));
2138     /// ```
2139     ///
2140     /// Getting immutable access to the contiguous slice.
2141     ///
2142     /// ```rust
2143     /// use std::collections::VecDeque;
2144     ///
2145     /// let mut buf = VecDeque::new();
2146     ///
2147     /// buf.push_back(2);
2148     /// buf.push_back(1);
2149     /// buf.push_front(3);
2150     ///
2151     /// buf.make_contiguous();
2152     /// if let (slice, &[]) = buf.as_slices() {
2153     ///     // we can now be sure that `slice` contains all elements of the deque,
2154     ///     // while still having immutable access to `buf`.
2155     ///     assert_eq!(buf.len(), slice.len());
2156     ///     assert_eq!(slice, &[3, 2, 1] as &[_]);
2157     /// }
2158     /// ```
2159     #[stable(feature = "deque_make_contiguous", since = "1.48.0")]
make_contiguous(&mut self) -> &mut [T]2160     pub fn make_contiguous(&mut self) -> &mut [T] {
2161         if T::IS_ZST {
2162             self.head = 0;
2163         }
2164 
2165         if self.is_contiguous() {
2166             unsafe { return slice::from_raw_parts_mut(self.ptr().add(self.head), self.len) }
2167         }
2168 
2169         let &mut Self { head, len, .. } = self;
2170         let ptr = self.ptr();
2171         let cap = self.capacity();
2172 
2173         let free = cap - len;
2174         let head_len = cap - head;
2175         let tail = len - head_len;
2176         let tail_len = tail;
2177 
2178         if free >= head_len {
2179             // there is enough free space to copy the head in one go,
2180             // this means that we first shift the tail backwards, and then
2181             // copy the head to the correct position.
2182             //
2183             // from: DEFGH....ABC
2184             // to:   ABCDEFGH....
2185             unsafe {
2186                 self.copy(0, head_len, tail_len);
2187                 // ...DEFGH.ABC
2188                 self.copy_nonoverlapping(head, 0, head_len);
2189                 // ABCDEFGH....
2190             }
2191 
2192             self.head = 0;
2193         } else if free >= tail_len {
2194             // there is enough free space to copy the tail in one go,
2195             // this means that we first shift the head forwards, and then
2196             // copy the tail to the correct position.
2197             //
2198             // from: FGH....ABCDE
2199             // to:   ...ABCDEFGH.
2200             unsafe {
2201                 self.copy(head, tail, head_len);
2202                 // FGHABCDE....
2203                 self.copy_nonoverlapping(0, tail + head_len, tail_len);
2204                 // ...ABCDEFGH.
2205             }
2206 
2207             self.head = tail;
2208         } else {
2209             // `free` is smaller than both `head_len` and `tail_len`.
2210             // the general algorithm for this first moves the slices
2211             // right next to each other and then uses `slice::rotate`
2212             // to rotate them into place:
2213             //
2214             // initially:   HIJK..ABCDEFG
2215             // step 1:      ..HIJKABCDEFG
2216             // step 2:      ..ABCDEFGHIJK
2217             //
2218             // or:
2219             //
2220             // initially:   FGHIJK..ABCDE
2221             // step 1:      FGHIJKABCDE..
2222             // step 2:      ABCDEFGHIJK..
2223 
2224             // pick the shorter of the 2 slices to reduce the amount
2225             // of memory that needs to be moved around.
2226             if head_len > tail_len {
2227                 // tail is shorter, so:
2228                 //  1. copy tail forwards
2229                 //  2. rotate used part of the buffer
2230                 //  3. update head to point to the new beginning (which is just `free`)
2231 
2232                 unsafe {
2233                     // if there is no free space in the buffer, then the slices are already
2234                     // right next to each other and we don't need to move any memory.
2235                     if free != 0 {
2236                         // because we only move the tail forward as much as there's free space
2237                         // behind it, we don't overwrite any elements of the head slice, and
2238                         // the slices end up right next to each other.
2239                         self.copy(0, free, tail_len);
2240                     }
2241 
2242                     // We just copied the tail right next to the head slice,
2243                     // so all of the elements in the range are initialized
2244                     let slice = &mut *self.buffer_range(free..self.capacity());
2245 
2246                     // because the deque wasn't contiguous, we know that `tail_len < self.len == slice.len()`,
2247                     // so this will never panic.
2248                     slice.rotate_left(tail_len);
2249 
2250                     // the used part of the buffer now is `free..self.capacity()`, so set
2251                     // `head` to the beginning of that range.
2252                     self.head = free;
2253                 }
2254             } else {
2255                 // head is shorter so:
2256                 //  1. copy head backwards
2257                 //  2. rotate used part of the buffer
2258                 //  3. update head to point to the new beginning (which is the beginning of the buffer)
2259 
2260                 unsafe {
2261                     // if there is no free space in the buffer, then the slices are already
2262                     // right next to each other and we don't need to move any memory.
2263                     if free != 0 {
2264                         // copy the head slice to lie right behind the tail slice.
2265                         self.copy(self.head, tail_len, head_len);
2266                     }
2267 
2268                     // because we copied the head slice so that both slices lie right
2269                     // next to each other, all the elements in the range are initialized.
2270                     let slice = &mut *self.buffer_range(0..self.len);
2271 
2272                     // because the deque wasn't contiguous, we know that `head_len < self.len == slice.len()`
2273                     // so this will never panic.
2274                     slice.rotate_right(head_len);
2275 
2276                     // the used part of the buffer now is `0..self.len`, so set
2277                     // `head` to the beginning of that range.
2278                     self.head = 0;
2279                 }
2280             }
2281         }
2282 
2283         unsafe { slice::from_raw_parts_mut(ptr.add(self.head), self.len) }
2284     }
2285 
2286     /// Rotates the double-ended queue `mid` places to the left.
2287     ///
2288     /// Equivalently,
2289     /// - Rotates item `mid` into the first position.
2290     /// - Pops the first `mid` items and pushes them to the end.
2291     /// - Rotates `len() - mid` places to the right.
2292     ///
2293     /// # Panics
2294     ///
2295     /// If `mid` is greater than `len()`. Note that `mid == len()`
2296     /// does _not_ panic and is a no-op rotation.
2297     ///
2298     /// # Complexity
2299     ///
2300     /// Takes `*O*(min(mid, len() - mid))` time and no extra space.
2301     ///
2302     /// # Examples
2303     ///
2304     /// ```
2305     /// use std::collections::VecDeque;
2306     ///
2307     /// let mut buf: VecDeque<_> = (0..10).collect();
2308     ///
2309     /// buf.rotate_left(3);
2310     /// assert_eq!(buf, [3, 4, 5, 6, 7, 8, 9, 0, 1, 2]);
2311     ///
2312     /// for i in 1..10 {
2313     ///     assert_eq!(i * 3 % 10, buf[0]);
2314     ///     buf.rotate_left(3);
2315     /// }
2316     /// assert_eq!(buf, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
2317     /// ```
2318     #[stable(feature = "vecdeque_rotate", since = "1.36.0")]
rotate_left(&mut self, mid: usize)2319     pub fn rotate_left(&mut self, mid: usize) {
2320         assert!(mid <= self.len());
2321         let k = self.len - mid;
2322         if mid <= k {
2323             unsafe { self.rotate_left_inner(mid) }
2324         } else {
2325             unsafe { self.rotate_right_inner(k) }
2326         }
2327     }
2328 
2329     /// Rotates the double-ended queue `k` places to the right.
2330     ///
2331     /// Equivalently,
2332     /// - Rotates the first item into position `k`.
2333     /// - Pops the last `k` items and pushes them to the front.
2334     /// - Rotates `len() - k` places to the left.
2335     ///
2336     /// # Panics
2337     ///
2338     /// If `k` is greater than `len()`. Note that `k == len()`
2339     /// does _not_ panic and is a no-op rotation.
2340     ///
2341     /// # Complexity
2342     ///
2343     /// Takes `*O*(min(k, len() - k))` time and no extra space.
2344     ///
2345     /// # Examples
2346     ///
2347     /// ```
2348     /// use std::collections::VecDeque;
2349     ///
2350     /// let mut buf: VecDeque<_> = (0..10).collect();
2351     ///
2352     /// buf.rotate_right(3);
2353     /// assert_eq!(buf, [7, 8, 9, 0, 1, 2, 3, 4, 5, 6]);
2354     ///
2355     /// for i in 1..10 {
2356     ///     assert_eq!(0, buf[i * 3 % 10]);
2357     ///     buf.rotate_right(3);
2358     /// }
2359     /// assert_eq!(buf, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
2360     /// ```
2361     #[stable(feature = "vecdeque_rotate", since = "1.36.0")]
rotate_right(&mut self, k: usize)2362     pub fn rotate_right(&mut self, k: usize) {
2363         assert!(k <= self.len());
2364         let mid = self.len - k;
2365         if k <= mid {
2366             unsafe { self.rotate_right_inner(k) }
2367         } else {
2368             unsafe { self.rotate_left_inner(mid) }
2369         }
2370     }
2371 
2372     // SAFETY: the following two methods require that the rotation amount
2373     // be less than half the length of the deque.
2374     //
2375     // `wrap_copy` requires that `min(x, capacity() - x) + copy_len <= capacity()`,
2376     // but then `min` is never more than half the capacity, regardless of x,
2377     // so it's sound to call here because we're calling with something
2378     // less than half the length, which is never above half the capacity.
2379 
rotate_left_inner(&mut self, mid: usize)2380     unsafe fn rotate_left_inner(&mut self, mid: usize) {
2381         debug_assert!(mid * 2 <= self.len());
2382         unsafe {
2383             self.wrap_copy(self.head, self.to_physical_idx(self.len), mid);
2384         }
2385         self.head = self.to_physical_idx(mid);
2386     }
2387 
rotate_right_inner(&mut self, k: usize)2388     unsafe fn rotate_right_inner(&mut self, k: usize) {
2389         debug_assert!(k * 2 <= self.len());
2390         self.head = self.wrap_sub(self.head, k);
2391         unsafe {
2392             self.wrap_copy(self.to_physical_idx(self.len), self.head, k);
2393         }
2394     }
2395 
2396     /// Binary searches this `VecDeque` for a given element.
2397     /// If the `VecDeque` is not sorted, the returned result is unspecified and
2398     /// meaningless.
2399     ///
2400     /// If the value is found then [`Result::Ok`] is returned, containing the
2401     /// index of the matching element. If there are multiple matches, then any
2402     /// one of the matches could be returned. If the value is not found then
2403     /// [`Result::Err`] is returned, containing the index where a matching
2404     /// element could be inserted while maintaining sorted order.
2405     ///
2406     /// See also [`binary_search_by`], [`binary_search_by_key`], and [`partition_point`].
2407     ///
2408     /// [`binary_search_by`]: VecDeque::binary_search_by
2409     /// [`binary_search_by_key`]: VecDeque::binary_search_by_key
2410     /// [`partition_point`]: VecDeque::partition_point
2411     ///
2412     /// # Examples
2413     ///
2414     /// Looks up a series of four elements. The first is found, with a
2415     /// uniquely determined position; the second and third are not
2416     /// found; the fourth could match any position in `[1, 4]`.
2417     ///
2418     /// ```
2419     /// use std::collections::VecDeque;
2420     ///
2421     /// let deque: VecDeque<_> = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55].into();
2422     ///
2423     /// assert_eq!(deque.binary_search(&13),  Ok(9));
2424     /// assert_eq!(deque.binary_search(&4),   Err(7));
2425     /// assert_eq!(deque.binary_search(&100), Err(13));
2426     /// let r = deque.binary_search(&1);
2427     /// assert!(matches!(r, Ok(1..=4)));
2428     /// ```
2429     ///
2430     /// If you want to insert an item to a sorted deque, while maintaining
2431     /// sort order, consider using [`partition_point`]:
2432     ///
2433     /// ```
2434     /// use std::collections::VecDeque;
2435     ///
2436     /// let mut deque: VecDeque<_> = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55].into();
2437     /// let num = 42;
2438     /// let idx = deque.partition_point(|&x| x < num);
2439     /// // The above is equivalent to `let idx = deque.binary_search(&num).unwrap_or_else(|x| x);`
2440     /// deque.insert(idx, num);
2441     /// assert_eq!(deque, &[0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
2442     /// ```
2443     #[stable(feature = "vecdeque_binary_search", since = "1.54.0")]
2444     #[inline]
binary_search(&self, x: &T) -> Result<usize, usize> where T: Ord,2445     pub fn binary_search(&self, x: &T) -> Result<usize, usize>
2446     where
2447         T: Ord,
2448     {
2449         self.binary_search_by(|e| e.cmp(x))
2450     }
2451 
2452     /// Binary searches this `VecDeque` with a comparator function.
2453     ///
2454     /// The comparator function should return an order code that indicates
2455     /// whether its argument is `Less`, `Equal` or `Greater` the desired
2456     /// target.
2457     /// If the `VecDeque` is not sorted or if the comparator function does not
2458     /// implement an order consistent with the sort order of the underlying
2459     /// `VecDeque`, the returned result is unspecified and meaningless.
2460     ///
2461     /// If the value is found then [`Result::Ok`] is returned, containing the
2462     /// index of the matching element. If there are multiple matches, then any
2463     /// one of the matches could be returned. If the value is not found then
2464     /// [`Result::Err`] is returned, containing the index where a matching
2465     /// element could be inserted while maintaining sorted order.
2466     ///
2467     /// See also [`binary_search`], [`binary_search_by_key`], and [`partition_point`].
2468     ///
2469     /// [`binary_search`]: VecDeque::binary_search
2470     /// [`binary_search_by_key`]: VecDeque::binary_search_by_key
2471     /// [`partition_point`]: VecDeque::partition_point
2472     ///
2473     /// # Examples
2474     ///
2475     /// Looks up a series of four elements. The first is found, with a
2476     /// uniquely determined position; the second and third are not
2477     /// found; the fourth could match any position in `[1, 4]`.
2478     ///
2479     /// ```
2480     /// use std::collections::VecDeque;
2481     ///
2482     /// let deque: VecDeque<_> = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55].into();
2483     ///
2484     /// assert_eq!(deque.binary_search_by(|x| x.cmp(&13)),  Ok(9));
2485     /// assert_eq!(deque.binary_search_by(|x| x.cmp(&4)),   Err(7));
2486     /// assert_eq!(deque.binary_search_by(|x| x.cmp(&100)), Err(13));
2487     /// let r = deque.binary_search_by(|x| x.cmp(&1));
2488     /// assert!(matches!(r, Ok(1..=4)));
2489     /// ```
2490     #[stable(feature = "vecdeque_binary_search", since = "1.54.0")]
binary_search_by<'a, F>(&'a self, mut f: F) -> Result<usize, usize> where F: FnMut(&'a T) -> Ordering,2491     pub fn binary_search_by<'a, F>(&'a self, mut f: F) -> Result<usize, usize>
2492     where
2493         F: FnMut(&'a T) -> Ordering,
2494     {
2495         let (front, back) = self.as_slices();
2496         let cmp_back = back.first().map(|elem| f(elem));
2497 
2498         if let Some(Ordering::Equal) = cmp_back {
2499             Ok(front.len())
2500         } else if let Some(Ordering::Less) = cmp_back {
2501             back.binary_search_by(f).map(|idx| idx + front.len()).map_err(|idx| idx + front.len())
2502         } else {
2503             front.binary_search_by(f)
2504         }
2505     }
2506 
2507     /// Binary searches this `VecDeque` with a key extraction function.
2508     ///
2509     /// Assumes that the deque is sorted by the key, for instance with
2510     /// [`make_contiguous().sort_by_key()`] using the same key extraction function.
2511     /// If the deque is not sorted by the key, the returned result is
2512     /// unspecified and meaningless.
2513     ///
2514     /// If the value is found then [`Result::Ok`] is returned, containing the
2515     /// index of the matching element. If there are multiple matches, then any
2516     /// one of the matches could be returned. If the value is not found then
2517     /// [`Result::Err`] is returned, containing the index where a matching
2518     /// element could be inserted while maintaining sorted order.
2519     ///
2520     /// See also [`binary_search`], [`binary_search_by`], and [`partition_point`].
2521     ///
2522     /// [`make_contiguous().sort_by_key()`]: VecDeque::make_contiguous
2523     /// [`binary_search`]: VecDeque::binary_search
2524     /// [`binary_search_by`]: VecDeque::binary_search_by
2525     /// [`partition_point`]: VecDeque::partition_point
2526     ///
2527     /// # Examples
2528     ///
2529     /// Looks up a series of four elements in a slice of pairs sorted by
2530     /// their second elements. The first is found, with a uniquely
2531     /// determined position; the second and third are not found; the
2532     /// fourth could match any position in `[1, 4]`.
2533     ///
2534     /// ```
2535     /// use std::collections::VecDeque;
2536     ///
2537     /// let deque: VecDeque<_> = [(0, 0), (2, 1), (4, 1), (5, 1),
2538     ///          (3, 1), (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
2539     ///          (1, 21), (2, 34), (4, 55)].into();
2540     ///
2541     /// assert_eq!(deque.binary_search_by_key(&13, |&(a, b)| b),  Ok(9));
2542     /// assert_eq!(deque.binary_search_by_key(&4, |&(a, b)| b),   Err(7));
2543     /// assert_eq!(deque.binary_search_by_key(&100, |&(a, b)| b), Err(13));
2544     /// let r = deque.binary_search_by_key(&1, |&(a, b)| b);
2545     /// assert!(matches!(r, Ok(1..=4)));
2546     /// ```
2547     #[stable(feature = "vecdeque_binary_search", since = "1.54.0")]
2548     #[inline]
binary_search_by_key<'a, B, F>(&'a self, b: &B, mut f: F) -> Result<usize, usize> where F: FnMut(&'a T) -> B, B: Ord,2549     pub fn binary_search_by_key<'a, B, F>(&'a self, b: &B, mut f: F) -> Result<usize, usize>
2550     where
2551         F: FnMut(&'a T) -> B,
2552         B: Ord,
2553     {
2554         self.binary_search_by(|k| f(k).cmp(b))
2555     }
2556 
2557     /// Returns the index of the partition point according to the given predicate
2558     /// (the index of the first element of the second partition).
2559     ///
2560     /// The deque is assumed to be partitioned according to the given predicate.
2561     /// This means that all elements for which the predicate returns true are at the start of the deque
2562     /// and all elements for which the predicate returns false are at the end.
2563     /// For example, `[7, 15, 3, 5, 4, 12, 6]` is partitioned under the predicate `x % 2 != 0`
2564     /// (all odd numbers are at the start, all even at the end).
2565     ///
2566     /// If the deque is not partitioned, the returned result is unspecified and meaningless,
2567     /// as this method performs a kind of binary search.
2568     ///
2569     /// See also [`binary_search`], [`binary_search_by`], and [`binary_search_by_key`].
2570     ///
2571     /// [`binary_search`]: VecDeque::binary_search
2572     /// [`binary_search_by`]: VecDeque::binary_search_by
2573     /// [`binary_search_by_key`]: VecDeque::binary_search_by_key
2574     ///
2575     /// # Examples
2576     ///
2577     /// ```
2578     /// use std::collections::VecDeque;
2579     ///
2580     /// let deque: VecDeque<_> = [1, 2, 3, 3, 5, 6, 7].into();
2581     /// let i = deque.partition_point(|&x| x < 5);
2582     ///
2583     /// assert_eq!(i, 4);
2584     /// assert!(deque.iter().take(i).all(|&x| x < 5));
2585     /// assert!(deque.iter().skip(i).all(|&x| !(x < 5)));
2586     /// ```
2587     ///
2588     /// If you want to insert an item to a sorted deque, while maintaining
2589     /// sort order:
2590     ///
2591     /// ```
2592     /// use std::collections::VecDeque;
2593     ///
2594     /// let mut deque: VecDeque<_> = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55].into();
2595     /// let num = 42;
2596     /// let idx = deque.partition_point(|&x| x < num);
2597     /// deque.insert(idx, num);
2598     /// assert_eq!(deque, &[0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
2599     /// ```
2600     #[stable(feature = "vecdeque_binary_search", since = "1.54.0")]
partition_point<P>(&self, mut pred: P) -> usize where P: FnMut(&T) -> bool,2601     pub fn partition_point<P>(&self, mut pred: P) -> usize
2602     where
2603         P: FnMut(&T) -> bool,
2604     {
2605         let (front, back) = self.as_slices();
2606 
2607         if let Some(true) = back.first().map(|v| pred(v)) {
2608             back.partition_point(pred) + front.len()
2609         } else {
2610             front.partition_point(pred)
2611         }
2612     }
2613 }
2614 
2615 impl<T: Clone, A: Allocator> VecDeque<T, A> {
2616     /// Modifies the deque in-place so that `len()` is equal to new_len,
2617     /// either by removing excess elements from the back or by appending clones of `value`
2618     /// to the back.
2619     ///
2620     /// # Examples
2621     ///
2622     /// ```
2623     /// use std::collections::VecDeque;
2624     ///
2625     /// let mut buf = VecDeque::new();
2626     /// buf.push_back(5);
2627     /// buf.push_back(10);
2628     /// buf.push_back(15);
2629     /// assert_eq!(buf, [5, 10, 15]);
2630     ///
2631     /// buf.resize(2, 0);
2632     /// assert_eq!(buf, [5, 10]);
2633     ///
2634     /// buf.resize(5, 20);
2635     /// assert_eq!(buf, [5, 10, 20, 20, 20]);
2636     /// ```
2637     #[stable(feature = "deque_extras", since = "1.16.0")]
resize(&mut self, new_len: usize, value: T)2638     pub fn resize(&mut self, new_len: usize, value: T) {
2639         if new_len > self.len() {
2640             let extra = new_len - self.len();
2641             self.extend(repeat_n(value, extra))
2642         } else {
2643             self.truncate(new_len);
2644         }
2645     }
2646 }
2647 
2648 /// Returns the index in the underlying buffer for a given logical element index.
2649 #[inline]
wrap_index(logical_index: usize, capacity: usize) -> usize2650 fn wrap_index(logical_index: usize, capacity: usize) -> usize {
2651     debug_assert!(
2652         (logical_index == 0 && capacity == 0)
2653             || logical_index < capacity
2654             || (logical_index - capacity) < capacity
2655     );
2656     if logical_index >= capacity { logical_index - capacity } else { logical_index }
2657 }
2658 
2659 #[stable(feature = "rust1", since = "1.0.0")]
2660 impl<T: PartialEq, A: Allocator> PartialEq for VecDeque<T, A> {
eq(&self, other: &Self) -> bool2661     fn eq(&self, other: &Self) -> bool {
2662         if self.len != other.len() {
2663             return false;
2664         }
2665         let (sa, sb) = self.as_slices();
2666         let (oa, ob) = other.as_slices();
2667         if sa.len() == oa.len() {
2668             sa == oa && sb == ob
2669         } else if sa.len() < oa.len() {
2670             // Always divisible in three sections, for example:
2671             // self:  [a b c|d e f]
2672             // other: [0 1 2 3|4 5]
2673             // front = 3, mid = 1,
2674             // [a b c] == [0 1 2] && [d] == [3] && [e f] == [4 5]
2675             let front = sa.len();
2676             let mid = oa.len() - front;
2677 
2678             let (oa_front, oa_mid) = oa.split_at(front);
2679             let (sb_mid, sb_back) = sb.split_at(mid);
2680             debug_assert_eq!(sa.len(), oa_front.len());
2681             debug_assert_eq!(sb_mid.len(), oa_mid.len());
2682             debug_assert_eq!(sb_back.len(), ob.len());
2683             sa == oa_front && sb_mid == oa_mid && sb_back == ob
2684         } else {
2685             let front = oa.len();
2686             let mid = sa.len() - front;
2687 
2688             let (sa_front, sa_mid) = sa.split_at(front);
2689             let (ob_mid, ob_back) = ob.split_at(mid);
2690             debug_assert_eq!(sa_front.len(), oa.len());
2691             debug_assert_eq!(sa_mid.len(), ob_mid.len());
2692             debug_assert_eq!(sb.len(), ob_back.len());
2693             sa_front == oa && sa_mid == ob_mid && sb == ob_back
2694         }
2695     }
2696 }
2697 
2698 #[stable(feature = "rust1", since = "1.0.0")]
2699 impl<T: Eq, A: Allocator> Eq for VecDeque<T, A> {}
2700 
2701 __impl_slice_eq1! { [] VecDeque<T, A>, Vec<U, A>, }
2702 __impl_slice_eq1! { [] VecDeque<T, A>, &[U], }
2703 __impl_slice_eq1! { [] VecDeque<T, A>, &mut [U], }
2704 __impl_slice_eq1! { [const N: usize] VecDeque<T, A>, [U; N], }
2705 __impl_slice_eq1! { [const N: usize] VecDeque<T, A>, &[U; N], }
2706 __impl_slice_eq1! { [const N: usize] VecDeque<T, A>, &mut [U; N], }
2707 
2708 #[stable(feature = "rust1", since = "1.0.0")]
2709 impl<T: PartialOrd, A: Allocator> PartialOrd for VecDeque<T, A> {
partial_cmp(&self, other: &Self) -> Option<Ordering>2710     fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
2711         self.iter().partial_cmp(other.iter())
2712     }
2713 }
2714 
2715 #[stable(feature = "rust1", since = "1.0.0")]
2716 impl<T: Ord, A: Allocator> Ord for VecDeque<T, A> {
2717     #[inline]
cmp(&self, other: &Self) -> Ordering2718     fn cmp(&self, other: &Self) -> Ordering {
2719         self.iter().cmp(other.iter())
2720     }
2721 }
2722 
2723 #[stable(feature = "rust1", since = "1.0.0")]
2724 impl<T: Hash, A: Allocator> Hash for VecDeque<T, A> {
hash<H: Hasher>(&self, state: &mut H)2725     fn hash<H: Hasher>(&self, state: &mut H) {
2726         state.write_length_prefix(self.len);
2727         // It's not possible to use Hash::hash_slice on slices
2728         // returned by as_slices method as their length can vary
2729         // in otherwise identical deques.
2730         //
2731         // Hasher only guarantees equivalence for the exact same
2732         // set of calls to its methods.
2733         self.iter().for_each(|elem| elem.hash(state));
2734     }
2735 }
2736 
2737 #[stable(feature = "rust1", since = "1.0.0")]
2738 impl<T, A: Allocator> Index<usize> for VecDeque<T, A> {
2739     type Output = T;
2740 
2741     #[inline]
index(&self, index: usize) -> &T2742     fn index(&self, index: usize) -> &T {
2743         self.get(index).expect("Out of bounds access")
2744     }
2745 }
2746 
2747 #[stable(feature = "rust1", since = "1.0.0")]
2748 impl<T, A: Allocator> IndexMut<usize> for VecDeque<T, A> {
2749     #[inline]
index_mut(&mut self, index: usize) -> &mut T2750     fn index_mut(&mut self, index: usize) -> &mut T {
2751         self.get_mut(index).expect("Out of bounds access")
2752     }
2753 }
2754 
2755 #[stable(feature = "rust1", since = "1.0.0")]
2756 impl<T> FromIterator<T> for VecDeque<T> {
from_iter<I: IntoIterator<Item = T>>(iter: I) -> VecDeque<T>2757     fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> VecDeque<T> {
2758         SpecFromIter::spec_from_iter(iter.into_iter())
2759     }
2760 }
2761 
2762 #[stable(feature = "rust1", since = "1.0.0")]
2763 impl<T, A: Allocator> IntoIterator for VecDeque<T, A> {
2764     type Item = T;
2765     type IntoIter = IntoIter<T, A>;
2766 
2767     /// Consumes the deque into a front-to-back iterator yielding elements by
2768     /// value.
into_iter(self) -> IntoIter<T, A>2769     fn into_iter(self) -> IntoIter<T, A> {
2770         IntoIter::new(self)
2771     }
2772 }
2773 
2774 #[stable(feature = "rust1", since = "1.0.0")]
2775 impl<'a, T, A: Allocator> IntoIterator for &'a VecDeque<T, A> {
2776     type Item = &'a T;
2777     type IntoIter = Iter<'a, T>;
2778 
into_iter(self) -> Iter<'a, T>2779     fn into_iter(self) -> Iter<'a, T> {
2780         self.iter()
2781     }
2782 }
2783 
2784 #[stable(feature = "rust1", since = "1.0.0")]
2785 impl<'a, T, A: Allocator> IntoIterator for &'a mut VecDeque<T, A> {
2786     type Item = &'a mut T;
2787     type IntoIter = IterMut<'a, T>;
2788 
into_iter(self) -> IterMut<'a, T>2789     fn into_iter(self) -> IterMut<'a, T> {
2790         self.iter_mut()
2791     }
2792 }
2793 
2794 #[stable(feature = "rust1", since = "1.0.0")]
2795 impl<T, A: Allocator> Extend<T> for VecDeque<T, A> {
extend<I: IntoIterator<Item = T>>(&mut self, iter: I)2796     fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
2797         <Self as SpecExtend<T, I::IntoIter>>::spec_extend(self, iter.into_iter());
2798     }
2799 
2800     #[inline]
extend_one(&mut self, elem: T)2801     fn extend_one(&mut self, elem: T) {
2802         self.push_back(elem);
2803     }
2804 
2805     #[inline]
extend_reserve(&mut self, additional: usize)2806     fn extend_reserve(&mut self, additional: usize) {
2807         self.reserve(additional);
2808     }
2809 }
2810 
2811 #[stable(feature = "extend_ref", since = "1.2.0")]
2812 impl<'a, T: 'a + Copy, A: Allocator> Extend<&'a T> for VecDeque<T, A> {
extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I)2813     fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
2814         self.spec_extend(iter.into_iter());
2815     }
2816 
2817     #[inline]
extend_one(&mut self, &elem: &'a T)2818     fn extend_one(&mut self, &elem: &'a T) {
2819         self.push_back(elem);
2820     }
2821 
2822     #[inline]
extend_reserve(&mut self, additional: usize)2823     fn extend_reserve(&mut self, additional: usize) {
2824         self.reserve(additional);
2825     }
2826 }
2827 
2828 #[stable(feature = "rust1", since = "1.0.0")]
2829 impl<T: fmt::Debug, A: Allocator> fmt::Debug for VecDeque<T, A> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result2830     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2831         f.debug_list().entries(self.iter()).finish()
2832     }
2833 }
2834 
2835 #[stable(feature = "vecdeque_vec_conversions", since = "1.10.0")]
2836 impl<T, A: Allocator> From<Vec<T, A>> for VecDeque<T, A> {
2837     /// Turn a [`Vec<T>`] into a [`VecDeque<T>`].
2838     ///
2839     /// [`Vec<T>`]: crate::vec::Vec
2840     /// [`VecDeque<T>`]: crate::collections::VecDeque
2841     ///
2842     /// This conversion is guaranteed to run in *O*(1) time
2843     /// and to not re-allocate the `Vec`'s buffer or allocate
2844     /// any additional memory.
2845     #[inline]
from(other: Vec<T, A>) -> Self2846     fn from(other: Vec<T, A>) -> Self {
2847         let (ptr, len, cap, alloc) = other.into_raw_parts_with_alloc();
2848         Self { head: 0, len, buf: unsafe { RawVec::from_raw_parts_in(ptr, cap, alloc) } }
2849     }
2850 }
2851 
2852 #[stable(feature = "vecdeque_vec_conversions", since = "1.10.0")]
2853 impl<T, A: Allocator> From<VecDeque<T, A>> for Vec<T, A> {
2854     /// Turn a [`VecDeque<T>`] into a [`Vec<T>`].
2855     ///
2856     /// [`Vec<T>`]: crate::vec::Vec
2857     /// [`VecDeque<T>`]: crate::collections::VecDeque
2858     ///
2859     /// This never needs to re-allocate, but does need to do *O*(*n*) data movement if
2860     /// the circular buffer doesn't happen to be at the beginning of the allocation.
2861     ///
2862     /// # Examples
2863     ///
2864     /// ```
2865     /// use std::collections::VecDeque;
2866     ///
2867     /// // This one is *O*(1).
2868     /// let deque: VecDeque<_> = (1..5).collect();
2869     /// let ptr = deque.as_slices().0.as_ptr();
2870     /// let vec = Vec::from(deque);
2871     /// assert_eq!(vec, [1, 2, 3, 4]);
2872     /// assert_eq!(vec.as_ptr(), ptr);
2873     ///
2874     /// // This one needs data rearranging.
2875     /// let mut deque: VecDeque<_> = (1..5).collect();
2876     /// deque.push_front(9);
2877     /// deque.push_front(8);
2878     /// let ptr = deque.as_slices().1.as_ptr();
2879     /// let vec = Vec::from(deque);
2880     /// assert_eq!(vec, [8, 9, 1, 2, 3, 4]);
2881     /// assert_eq!(vec.as_ptr(), ptr);
2882     /// ```
from(mut other: VecDeque<T, A>) -> Self2883     fn from(mut other: VecDeque<T, A>) -> Self {
2884         other.make_contiguous();
2885 
2886         unsafe {
2887             let other = ManuallyDrop::new(other);
2888             let buf = other.buf.ptr();
2889             let len = other.len();
2890             let cap = other.capacity();
2891             let alloc = ptr::read(other.allocator());
2892 
2893             if other.head != 0 {
2894                 ptr::copy(buf.add(other.head), buf, len);
2895             }
2896             Vec::from_raw_parts_in(buf, len, cap, alloc)
2897         }
2898     }
2899 }
2900 
2901 #[stable(feature = "std_collections_from_array", since = "1.56.0")]
2902 impl<T, const N: usize> From<[T; N]> for VecDeque<T> {
2903     /// Converts a `[T; N]` into a `VecDeque<T>`.
2904     ///
2905     /// ```
2906     /// use std::collections::VecDeque;
2907     ///
2908     /// let deq1 = VecDeque::from([1, 2, 3, 4]);
2909     /// let deq2: VecDeque<_> = [1, 2, 3, 4].into();
2910     /// assert_eq!(deq1, deq2);
2911     /// ```
from(arr: [T; N]) -> Self2912     fn from(arr: [T; N]) -> Self {
2913         let mut deq = VecDeque::with_capacity(N);
2914         let arr = ManuallyDrop::new(arr);
2915         if !<T>::IS_ZST {
2916             // SAFETY: VecDeque::with_capacity ensures that there is enough capacity.
2917             unsafe {
2918                 ptr::copy_nonoverlapping(arr.as_ptr(), deq.ptr(), N);
2919             }
2920         }
2921         deq.head = 0;
2922         deq.len = N;
2923         deq
2924     }
2925 }
2926