1 use std::collections::TryReserveError::*;
2 use std::collections::{vec_deque::Drain, VecDeque};
5 use std::{isize, usize};
14 let mut d = VecDeque::new();
15 assert_eq!(d.len(), 0);
19 assert_eq!(d.len(), 3);
21 assert_eq!(d.len(), 4);
22 assert_eq!(*d.front().unwrap(), 42);
23 assert_eq!(*d.back().unwrap(), 137);
24 let mut i = d.pop_front();
25 assert_eq!(i, Some(42));
27 assert_eq!(i, Some(137));
29 assert_eq!(i, Some(137));
31 assert_eq!(i, Some(17));
32 assert_eq!(d.len(), 0);
34 assert_eq!(d.len(), 1);
36 assert_eq!(d.len(), 2);
38 assert_eq!(d.len(), 3);
40 assert_eq!(d.len(), 4);
47 fn test_parameterized<T: Clone + PartialEq + Debug>(a: T, b: T, c: T, d: T) {
48 let mut deq = VecDeque::new();
49 assert_eq!(deq.len(), 0);
50 deq.push_front(a.clone());
51 deq.push_front(b.clone());
52 deq.push_back(c.clone());
53 assert_eq!(deq.len(), 3);
54 deq.push_back(d.clone());
55 assert_eq!(deq.len(), 4);
56 assert_eq!((*deq.front().unwrap()).clone(), b.clone());
57 assert_eq!((*deq.back().unwrap()).clone(), d.clone());
58 assert_eq!(deq.pop_front().unwrap(), b.clone());
59 assert_eq!(deq.pop_back().unwrap(), d.clone());
60 assert_eq!(deq.pop_back().unwrap(), c.clone());
61 assert_eq!(deq.pop_back().unwrap(), a.clone());
62 assert_eq!(deq.len(), 0);
63 deq.push_back(c.clone());
64 assert_eq!(deq.len(), 1);
65 deq.push_front(b.clone());
66 assert_eq!(deq.len(), 2);
67 deq.push_back(d.clone());
68 assert_eq!(deq.len(), 3);
69 deq.push_front(a.clone());
70 assert_eq!(deq.len(), 4);
71 assert_eq!(deq[0].clone(), a.clone());
72 assert_eq!(deq[1].clone(), b.clone());
73 assert_eq!(deq[2].clone(), c.clone());
74 assert_eq!(deq[3].clone(), d.clone());
78 fn test_push_front_grow() {
79 let mut deq = VecDeque::new();
83 assert_eq!(deq.len(), 66);
86 assert_eq!(deq[i], 65 - i);
89 let mut deq = VecDeque::new();
95 assert_eq!(deq[i], i);
101 let mut deq = VecDeque::new();
105 assert_eq!(deq[1], 2);
110 fn test_index_out_of_bounds() {
111 let mut deq = VecDeque::new();
118 #[derive(Clone, PartialEq, Debug)]
122 Three(i32, i32, i32),
125 #[derive(Clone, PartialEq, Debug)]
132 #[derive(Clone, PartialEq, Debug)]
140 fn test_param_int() {
141 test_parameterized::<i32>(5, 72, 64, 175);
145 fn test_param_taggy() {
146 test_parameterized::<Taggy>(One(1), Two(1, 2), Three(1, 2, 3), Two(17, 42));
150 fn test_param_taggypar() {
151 test_parameterized::<Taggypar<i32>>(
154 Threepar::<i32>(1, 2, 3),
155 Twopar::<i32>(17, 42),
160 fn test_param_reccy() {
161 let reccy1 = RecCy { x: 1, y: 2, t: One(1) };
162 let reccy2 = RecCy { x: 345, y: 2, t: Two(1, 2) };
163 let reccy3 = RecCy { x: 1, y: 777, t: Three(1, 2, 3) };
164 let reccy4 = RecCy { x: 19, y: 252, t: Two(17, 42) };
165 test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
169 fn test_with_capacity() {
170 let mut d = VecDeque::with_capacity(0);
172 assert_eq!(d.len(), 1);
173 let mut d = VecDeque::with_capacity(50);
175 assert_eq!(d.len(), 1);
179 fn test_with_capacity_non_power_two() {
180 let mut d3 = VecDeque::with_capacity(3);
185 assert_eq!(d3.pop_front(), Some(1));
187 assert_eq!(d3.front(), None);
194 assert_eq!(d3.pop_front(), Some(3));
196 // Pushing the lo past half way point to trigger
197 // the 'B' scenario for growth
204 // There used to be a bug here about how the
205 // VecDeque made growth assumptions about the
206 // underlying Vec which didn't hold and lead
208 // (Vec grows to next power of two)
209 // good- [9, 12, 15, X, X, X, X, |6]
210 // bug- [15, 12, X, X, X, |6, X, X]
211 assert_eq!(d3.pop_front(), Some(6));
213 // Which leads us to the following state which
214 // would be a failure case.
215 // bug- [15, 12, X, X, X, X, |X, X]
216 assert_eq!(d3.front(), Some(&9));
220 fn test_reserve_exact() {
221 let mut d = VecDeque::new();
224 assert!(d.capacity() >= 51);
229 let mut d = VecDeque::new();
232 assert!(d.capacity() >= 51);
237 let mut d: VecDeque<_> = (0..5).collect();
240 assert_eq!(d.iter().cloned().collect::<Vec<_>>(), [4, 2, 3, 1]);
245 let mut d = VecDeque::new();
246 assert_eq!(d.iter().next(), None);
247 assert_eq!(d.iter().size_hint(), (0, Some(0)));
253 let b: &[_] = &[&0, &1, &2, &3, &4];
254 assert_eq!(d.iter().collect::<Vec<_>>(), b);
261 let b: &[_] = &[&8, &7, &6, &0, &1, &2, &3, &4];
262 assert_eq!(d.iter().collect::<Vec<_>>(), b);
265 let mut it = d.iter();
266 let mut len = d.len();
272 assert_eq!(it.size_hint(), (len, Some(len)))
280 let mut d = VecDeque::new();
281 assert_eq!(d.iter().rev().next(), None);
287 let b: &[_] = &[&4, &3, &2, &1, &0];
288 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
294 let b: &[_] = &[&4, &3, &2, &1, &0, &6, &7, &8];
295 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
299 fn test_mut_rev_iter_wrap() {
300 let mut d = VecDeque::with_capacity(3);
301 assert!(d.iter_mut().rev().next().is_none());
306 assert_eq!(d.pop_front(), Some(1));
309 assert_eq!(d.iter_mut().rev().map(|x| *x).collect::<Vec<_>>(), vec![4, 3, 2]);
314 let mut d = VecDeque::new();
315 assert!(d.iter_mut().next().is_none());
321 for (i, elt) in d.iter_mut().enumerate() {
322 assert_eq!(*elt, 2 - i);
327 let mut it = d.iter_mut();
328 assert_eq!(*it.next().unwrap(), 0);
329 assert_eq!(*it.next().unwrap(), 1);
330 assert_eq!(*it.next().unwrap(), 2);
331 assert!(it.next().is_none());
336 fn test_mut_rev_iter() {
337 let mut d = VecDeque::new();
338 assert!(d.iter_mut().rev().next().is_none());
344 for (i, elt) in d.iter_mut().rev().enumerate() {
350 let mut it = d.iter_mut().rev();
351 assert_eq!(*it.next().unwrap(), 0);
352 assert_eq!(*it.next().unwrap(), 1);
353 assert_eq!(*it.next().unwrap(), 2);
354 assert!(it.next().is_none());
359 fn test_into_iter() {
362 let d: VecDeque<i32> = VecDeque::new();
363 let mut iter = d.into_iter();
365 assert_eq!(iter.size_hint(), (0, Some(0)));
366 assert_eq!(iter.next(), None);
367 assert_eq!(iter.size_hint(), (0, Some(0)));
372 let mut d = VecDeque::new();
377 let b = vec![0, 1, 2, 3, 4];
378 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
383 let mut d = VecDeque::new();
391 let b = vec![8, 7, 6, 0, 1, 2, 3, 4];
392 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
397 let mut d = VecDeque::new();
405 let mut it = d.into_iter();
406 assert_eq!(it.size_hint(), (8, Some(8)));
407 assert_eq!(it.next(), Some(8));
408 assert_eq!(it.size_hint(), (7, Some(7)));
409 assert_eq!(it.next_back(), Some(4));
410 assert_eq!(it.size_hint(), (6, Some(6)));
411 assert_eq!(it.next(), Some(7));
412 assert_eq!(it.size_hint(), (5, Some(5)));
420 let mut d: VecDeque<i32> = VecDeque::new();
423 let mut iter = d.drain(..);
425 assert_eq!(iter.size_hint(), (0, Some(0)));
426 assert_eq!(iter.next(), None);
427 assert_eq!(iter.size_hint(), (0, Some(0)));
430 assert!(d.is_empty());
435 let mut d = VecDeque::new();
440 assert_eq!(d.drain(..).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
441 assert!(d.is_empty());
446 let mut d = VecDeque::new();
454 assert_eq!(d.drain(..).collect::<Vec<_>>(), [8, 7, 6, 0, 1, 2, 3, 4]);
455 assert!(d.is_empty());
460 let mut d: VecDeque<_> = VecDeque::new();
469 let mut it = d.drain(..);
470 assert_eq!(it.size_hint(), (8, Some(8)));
471 assert_eq!(it.next(), Some(8));
472 assert_eq!(it.size_hint(), (7, Some(7)));
473 assert_eq!(it.next_back(), Some(4));
474 assert_eq!(it.size_hint(), (6, Some(6)));
475 assert_eq!(it.next(), Some(7));
476 assert_eq!(it.size_hint(), (5, Some(5)));
478 assert!(d.is_empty());
483 fn test_from_iter() {
484 let v = vec![1, 2, 3, 4, 5, 6, 7];
485 let deq: VecDeque<_> = v.iter().cloned().collect();
486 let u: Vec<_> = deq.iter().cloned().collect();
489 let seq = (0..).step_by(2).take(256);
490 let deq: VecDeque<_> = seq.collect();
491 for (i, &x) in deq.iter().enumerate() {
492 assert_eq!(2 * i, x);
494 assert_eq!(deq.len(), 256);
499 let mut d = VecDeque::new();
504 assert_eq!(d.len(), 4);
505 let mut e = d.clone();
506 assert_eq!(e.len(), 4);
507 while !d.is_empty() {
508 assert_eq!(d.pop_back(), e.pop_back());
510 assert_eq!(d.len(), 0);
511 assert_eq!(e.len(), 0);
516 let mut d = VecDeque::new();
517 assert!(d == VecDeque::with_capacity(0));
522 let mut e = VecDeque::with_capacity(0);
532 assert!(e == VecDeque::new());
536 fn test_partial_eq_array() {
537 let d = VecDeque::<char>::new();
540 let mut d = VecDeque::new();
544 let mut d = VecDeque::new();
548 let mut d = VecDeque::new();
551 assert!(d == ['a', 'b']);
556 let mut x = VecDeque::new();
557 let mut y = VecDeque::new();
569 assert!(hash(&x) == hash(&y));
573 fn test_hash_after_rotation() {
574 // test that two deques hash equal even if elements are laid out differently
576 let mut ring: VecDeque<i32> = (0..len as i32).collect();
577 let orig = ring.clone();
578 for _ in 0..ring.capacity() {
579 // shift values 1 step to the right by pop, sub one, push
581 for elt in &mut ring {
584 ring.push_back(len - 1);
585 assert_eq!(hash(&orig), hash(&ring));
586 assert_eq!(orig, ring);
587 assert_eq!(ring, orig);
592 fn test_eq_after_rotation() {
593 // test that two deques are equal even if elements are laid out differently
595 let mut ring: VecDeque<i32> = (0..len as i32).collect();
596 let mut shifted = ring.clone();
598 // shift values 1 step to the right by pop, sub one, push
600 for elt in &mut ring {
603 ring.push_back(len - 1);
607 for _ in 0..shifted.capacity() {
609 for elt in &mut shifted {
612 shifted.push_back(len - 1);
613 assert_eq!(shifted, ring);
614 assert_eq!(ring, shifted);
620 let x = VecDeque::new();
621 let mut y = VecDeque::new();
633 let ringbuf: VecDeque<_> = (0..10).collect();
634 assert_eq!(format!("{:?}", ringbuf), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
636 let ringbuf: VecDeque<_> = vec!["just", "one", "test", "more"].iter().cloned().collect();
637 assert_eq!(format!("{:?}", ringbuf), "[\"just\", \"one\", \"test\", \"more\"]");
642 static mut DROPS: i32 = 0;
652 let mut ring = VecDeque::new();
653 ring.push_back(Elem);
654 ring.push_front(Elem);
655 ring.push_back(Elem);
656 ring.push_front(Elem);
659 assert_eq!(unsafe { DROPS }, 4);
663 fn test_drop_with_pop() {
664 static mut DROPS: i32 = 0;
674 let mut ring = VecDeque::new();
675 ring.push_back(Elem);
676 ring.push_front(Elem);
677 ring.push_back(Elem);
678 ring.push_front(Elem);
680 drop(ring.pop_back());
681 drop(ring.pop_front());
682 assert_eq!(unsafe { DROPS }, 2);
685 assert_eq!(unsafe { DROPS }, 4);
689 fn test_drop_clear() {
690 static mut DROPS: i32 = 0;
700 let mut ring = VecDeque::new();
701 ring.push_back(Elem);
702 ring.push_front(Elem);
703 ring.push_back(Elem);
704 ring.push_front(Elem);
706 assert_eq!(unsafe { DROPS }, 4);
709 assert_eq!(unsafe { DROPS }, 4);
713 fn test_reserve_grow() {
714 // test growth path A
715 // [T o o H] -> [T o o H . . . . ]
716 let mut ring = VecDeque::with_capacity(4);
722 assert_eq!(ring.pop_front(), Some(i));
725 // test growth path B
726 // [H T o o] -> [. T o o H . . . ]
727 let mut ring = VecDeque::with_capacity(4);
730 assert_eq!(ring.pop_front(), Some(i));
737 assert_eq!(ring.pop_front(), Some(i));
740 // test growth path C
741 // [o o H T] -> [o o H . . . . T ]
742 let mut ring = VecDeque::with_capacity(4);
745 assert_eq!(ring.pop_front(), Some(i));
752 assert_eq!(ring.pop_front(), Some(i));
758 let mut ring = VecDeque::new();
760 assert_eq!(ring.get(0), Some(&0));
761 assert_eq!(ring.get(1), None);
764 assert_eq!(ring.get(0), Some(&0));
765 assert_eq!(ring.get(1), Some(&1));
766 assert_eq!(ring.get(2), None);
769 assert_eq!(ring.get(0), Some(&0));
770 assert_eq!(ring.get(1), Some(&1));
771 assert_eq!(ring.get(2), Some(&2));
772 assert_eq!(ring.get(3), None);
774 assert_eq!(ring.pop_front(), Some(0));
775 assert_eq!(ring.get(0), Some(&1));
776 assert_eq!(ring.get(1), Some(&2));
777 assert_eq!(ring.get(2), None);
779 assert_eq!(ring.pop_front(), Some(1));
780 assert_eq!(ring.get(0), Some(&2));
781 assert_eq!(ring.get(1), None);
783 assert_eq!(ring.pop_front(), Some(2));
784 assert_eq!(ring.get(0), None);
785 assert_eq!(ring.get(1), None);
790 let mut ring = VecDeque::new();
795 match ring.get_mut(1) {
800 assert_eq!(ring.get_mut(0), Some(&mut 0));
801 assert_eq!(ring.get_mut(1), Some(&mut -1));
802 assert_eq!(ring.get_mut(2), Some(&mut 2));
803 assert_eq!(ring.get_mut(3), None);
805 assert_eq!(ring.pop_front(), Some(0));
806 assert_eq!(ring.get_mut(0), Some(&mut -1));
807 assert_eq!(ring.get_mut(1), Some(&mut 2));
808 assert_eq!(ring.get_mut(2), None);
813 let mut ring = VecDeque::new();
816 assert_eq!(ring.front(), Some(&10));
818 assert_eq!(ring.front(), Some(&20));
820 assert_eq!(ring.front(), None);
824 fn test_as_slices() {
825 let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
826 let cap = ring.capacity() as i32;
828 let last = cap - first;
832 let (left, right) = ring.as_slices();
833 let expected: Vec<_> = (0..=i).collect();
834 assert_eq!(left, &expected[..]);
835 assert_eq!(right, []);
840 let (left, right) = ring.as_slices();
841 let expected_left: Vec<_> = (-last..=j).rev().collect();
842 let expected_right: Vec<_> = (0..first).collect();
843 assert_eq!(left, &expected_left[..]);
844 assert_eq!(right, &expected_right[..]);
847 assert_eq!(ring.len() as i32, cap);
848 assert_eq!(ring.capacity() as i32, cap);
852 fn test_as_mut_slices() {
853 let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
854 let cap = ring.capacity() as i32;
856 let last = cap - first;
860 let (left, right) = ring.as_mut_slices();
861 let expected: Vec<_> = (0..=i).collect();
862 assert_eq!(left, &expected[..]);
863 assert_eq!(right, []);
868 let (left, right) = ring.as_mut_slices();
869 let expected_left: Vec<_> = (-last..=j).rev().collect();
870 let expected_right: Vec<_> = (0..first).collect();
871 assert_eq!(left, &expected_left[..]);
872 assert_eq!(right, &expected_right[..]);
875 assert_eq!(ring.len() as i32, cap);
876 assert_eq!(ring.capacity() as i32, cap);
881 let mut a: VecDeque<_> = vec![1, 2, 3].into_iter().collect();
882 let mut b: VecDeque<_> = vec![4, 5, 6].into_iter().collect();
886 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
887 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
889 // append nothing to something
891 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
892 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
894 // append something to nothing
896 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
897 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), []);
901 fn test_append_permutations() {
902 fn construct_vec_deque(
907 ) -> VecDeque<usize> {
908 let mut out = VecDeque::new();
909 for a in 0..push_back {
912 for b in 0..push_front {
913 out.push_front(push_back + b);
915 for _ in 0..pop_back {
918 for _ in 0..pop_front {
924 #[cfg(not(miri))] // Miri is too slow
925 const MAX: usize = 5;
927 const MAX: usize = 3;
929 // Many different permutations of both the `VecDeque` getting appended to
930 // and the one getting appended are generated to check `append`.
931 // This ensures all 6 code paths of `append` are tested.
932 for src_push_back in 0..MAX {
933 for src_push_front in 0..MAX {
934 // doesn't pop more values than are pushed
935 for src_pop_back in 0..(src_push_back + src_push_front) {
936 for src_pop_front in 0..(src_push_back + src_push_front - src_pop_back) {
937 let src = construct_vec_deque(
944 for dst_push_back in 0..MAX {
945 for dst_push_front in 0..MAX {
946 for dst_pop_back in 0..(dst_push_back + dst_push_front) {
948 0..(dst_push_back + dst_push_front - dst_pop_back)
950 let mut dst = construct_vec_deque(
956 let mut src = src.clone();
958 // Assert that appending `src` to `dst` gives the same order
959 // of values as iterating over both in sequence.
964 .collect::<Vec<usize>>();
965 dst.append(&mut src);
966 assert_eq!(dst, correct);
967 assert!(src.is_empty());
978 struct DropCounter<'a> {
982 impl Drop for DropCounter<'_> {
989 fn test_append_double_drop() {
990 let (mut count_a, mut count_b) = (0, 0);
992 let mut a = VecDeque::new();
993 let mut b = VecDeque::new();
994 a.push_back(DropCounter { count: &mut count_a });
995 b.push_back(DropCounter { count: &mut count_b });
999 assert_eq!(count_a, 1);
1000 assert_eq!(count_b, 1);
1005 let mut buf = VecDeque::new();
1007 buf.retain(|&x| x % 2 == 0);
1008 let v: Vec<_> = buf.into_iter().collect();
1009 assert_eq!(&v[..], &[2, 4]);
1013 fn test_extend_ref() {
1014 let mut v = VecDeque::new();
1016 v.extend(&[2, 3, 4]);
1018 assert_eq!(v.len(), 4);
1019 assert_eq!(v[0], 1);
1020 assert_eq!(v[1], 2);
1021 assert_eq!(v[2], 3);
1022 assert_eq!(v[3], 4);
1024 let mut w = VecDeque::new();
1029 assert_eq!(v.len(), 6);
1030 assert_eq!(v[0], 1);
1031 assert_eq!(v[1], 2);
1032 assert_eq!(v[2], 3);
1033 assert_eq!(v[3], 4);
1034 assert_eq!(v[4], 5);
1035 assert_eq!(v[5], 6);
1039 fn test_contains() {
1040 let mut v = VecDeque::new();
1041 v.extend(&[2, 3, 4]);
1043 assert!(v.contains(&3));
1044 assert!(!v.contains(&1));
1048 assert!(!v.contains(&3));
1052 fn assert_covariance() {
1053 fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
1059 fn test_is_empty() {
1060 let mut v = VecDeque::<i32>::new();
1061 assert!(v.is_empty());
1062 assert!(v.iter().is_empty());
1063 assert!(v.iter_mut().is_empty());
1064 v.extend(&[2, 3, 4]);
1065 assert!(!v.is_empty());
1066 assert!(!v.iter().is_empty());
1067 assert!(!v.iter_mut().is_empty());
1068 while let Some(_) = v.pop_front() {
1069 assert_eq!(v.is_empty(), v.len() == 0);
1070 assert_eq!(v.iter().is_empty(), v.iter().len() == 0);
1071 assert_eq!(v.iter_mut().is_empty(), v.iter_mut().len() == 0);
1073 assert!(v.is_empty());
1074 assert!(v.iter().is_empty());
1075 assert!(v.iter_mut().is_empty());
1076 assert!(v.into_iter().is_empty());
1080 fn test_reserve_exact_2() {
1081 // This is all the same as test_reserve
1083 let mut v = VecDeque::new();
1086 assert!(v.capacity() >= 2);
1092 assert!(v.capacity() >= 16);
1093 v.reserve_exact(16);
1094 assert!(v.capacity() >= 32);
1098 v.reserve_exact(16);
1099 assert!(v.capacity() >= 48)
1103 #[cfg(not(miri))] // Miri does not support signalling OOM
1104 fn test_try_reserve() {
1105 // These are the interesting cases:
1106 // * exactly isize::MAX should never trigger a CapacityOverflow (can be OOM)
1107 // * > isize::MAX should always fail
1108 // * On 16/32-bit should CapacityOverflow
1109 // * On 64-bit should OOM
1110 // * overflow may trigger when adding `len` to `cap` (in number of elements)
1111 // * overflow may trigger when multiplying `new_cap` by size_of::<T> (to get bytes)
1113 const MAX_CAP: usize = (isize::MAX as usize + 1) / 2 - 1;
1114 const MAX_USIZE: usize = usize::MAX;
1116 // On 16/32-bit, we check that allocations don't exceed isize::MAX,
1117 // on 64-bit, we assume the OS will give an OOM for such a ridiculous size.
1118 // Any platform that succeeds for these requests is technically broken with
1119 // ptr::offset because LLVM is the worst.
1120 let guards_against_isize = size_of::<usize>() < 8;
1123 // Note: basic stuff is checked by test_reserve
1124 let mut empty_bytes: VecDeque<u8> = VecDeque::new();
1126 // Check isize::MAX doesn't count as an overflow
1127 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP) {
1128 panic!("isize::MAX shouldn't trigger an overflow!");
1130 // Play it again, frank! (just to be sure)
1131 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP) {
1132 panic!("isize::MAX shouldn't trigger an overflow!");
1135 if guards_against_isize {
1136 // Check isize::MAX + 1 does count as overflow
1137 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP + 1) {
1139 panic!("isize::MAX + 1 should trigger an overflow!")
1142 // Check usize::MAX does count as overflow
1143 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_USIZE) {
1145 panic!("usize::MAX should trigger an overflow!")
1148 // Check isize::MAX is an OOM
1149 // VecDeque starts with capacity 7, always adds 1 to the capacity
1150 // and also rounds the number to next power of 2 so this is the
1151 // furthest we can go without triggering CapacityOverflow
1152 if let Err(AllocError { .. }) = empty_bytes.try_reserve(MAX_CAP) {
1154 panic!("isize::MAX + 1 should trigger an OOM!")
1160 // Same basic idea, but with non-zero len
1161 let mut ten_bytes: VecDeque<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1163 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 10) {
1164 panic!("isize::MAX shouldn't trigger an overflow!");
1166 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 10) {
1167 panic!("isize::MAX shouldn't trigger an overflow!");
1169 if guards_against_isize {
1170 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 9) {
1172 panic!("isize::MAX + 1 should trigger an overflow!");
1175 if let Err(AllocError { .. }) = ten_bytes.try_reserve(MAX_CAP - 9) {
1177 panic!("isize::MAX + 1 should trigger an OOM!")
1180 // Should always overflow in the add-to-len
1181 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_USIZE) {
1183 panic!("usize::MAX should trigger an overflow!")
1188 // Same basic idea, but with interesting type size
1189 let mut ten_u32s: VecDeque<u32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1191 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP / 4 - 10) {
1192 panic!("isize::MAX shouldn't trigger an overflow!");
1194 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP / 4 - 10) {
1195 panic!("isize::MAX shouldn't trigger an overflow!");
1197 if guards_against_isize {
1198 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP / 4 - 9) {
1200 panic!("isize::MAX + 1 should trigger an overflow!");
1203 if let Err(AllocError { .. }) = ten_u32s.try_reserve(MAX_CAP / 4 - 9) {
1205 panic!("isize::MAX + 1 should trigger an OOM!")
1208 // Should fail in the mul-by-size
1209 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_USIZE - 20) {
1211 panic!("usize::MAX should trigger an overflow!");
1217 #[cfg(not(miri))] // Miri does not support signalling OOM
1218 fn test_try_reserve_exact() {
1219 // This is exactly the same as test_try_reserve with the method changed.
1220 // See that test for comments.
1222 const MAX_CAP: usize = (isize::MAX as usize + 1) / 2 - 1;
1223 const MAX_USIZE: usize = usize::MAX;
1225 let guards_against_isize = size_of::<usize>() < 8;
1228 let mut empty_bytes: VecDeque<u8> = VecDeque::new();
1230 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP) {
1231 panic!("isize::MAX shouldn't trigger an overflow!");
1233 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP) {
1234 panic!("isize::MAX shouldn't trigger an overflow!");
1237 if guards_against_isize {
1238 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP + 1) {
1240 panic!("isize::MAX + 1 should trigger an overflow!")
1243 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_USIZE) {
1245 panic!("usize::MAX should trigger an overflow!")
1248 // Check isize::MAX is an OOM
1249 // VecDeque starts with capacity 7, always adds 1 to the capacity
1250 // and also rounds the number to next power of 2 so this is the
1251 // furthest we can go without triggering CapacityOverflow
1252 if let Err(AllocError { .. }) = empty_bytes.try_reserve_exact(MAX_CAP) {
1254 panic!("isize::MAX + 1 should trigger an OOM!")
1260 let mut ten_bytes: VecDeque<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1262 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 10) {
1263 panic!("isize::MAX shouldn't trigger an overflow!");
1265 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 10) {
1266 panic!("isize::MAX shouldn't trigger an overflow!");
1268 if guards_against_isize {
1269 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 9) {
1271 panic!("isize::MAX + 1 should trigger an overflow!");
1274 if let Err(AllocError { .. }) = ten_bytes.try_reserve_exact(MAX_CAP - 9) {
1276 panic!("isize::MAX + 1 should trigger an OOM!")
1279 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_USIZE) {
1281 panic!("usize::MAX should trigger an overflow!")
1286 let mut ten_u32s: VecDeque<u32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1288 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 10) {
1289 panic!("isize::MAX shouldn't trigger an overflow!");
1291 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 10) {
1292 panic!("isize::MAX shouldn't trigger an overflow!");
1294 if guards_against_isize {
1295 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 9) {
1297 panic!("isize::MAX + 1 should trigger an overflow!");
1300 if let Err(AllocError { .. }) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 9) {
1302 panic!("isize::MAX + 1 should trigger an OOM!")
1305 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_USIZE - 20) {
1307 panic!("usize::MAX should trigger an overflow!")
1313 fn test_rotate_nop() {
1314 let mut v: VecDeque<_> = (0..10).collect();
1315 assert_unchanged(&v);
1318 assert_unchanged(&v);
1321 assert_unchanged(&v);
1324 assert_unchanged(&v);
1327 assert_unchanged(&v);
1331 assert_unchanged(&v);
1335 assert_unchanged(&v);
1339 assert_unchanged(&v);
1343 assert_unchanged(&v);
1347 assert_unchanged(&v);
1351 assert_unchanged(&v);
1357 assert_unchanged(&v);
1363 assert_unchanged(&v);
1365 fn assert_unchanged(v: &VecDeque<i32>) {
1366 assert_eq!(v, &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
1371 fn test_rotate_left_parts() {
1372 let mut v: VecDeque<_> = (1..=7).collect();
1374 assert_eq!(v.as_slices(), (&[3, 4, 5, 6, 7, 1][..], &[2][..]));
1376 assert_eq!(v.as_slices(), (&[5, 6, 7, 1][..], &[2, 3, 4][..]));
1378 assert_eq!(v.as_slices(), (&[7, 1][..], &[2, 3, 4, 5, 6][..]));
1380 assert_eq!(v.as_slices(), (&[2, 3, 4, 5, 6, 7, 1][..], &[][..]));
1382 assert_eq!(v.as_slices(), (&[4, 5, 6, 7, 1, 2][..], &[3][..]));
1384 assert_eq!(v.as_slices(), (&[6, 7, 1, 2][..], &[3, 4, 5][..]));
1386 assert_eq!(v.as_slices(), (&[1, 2][..], &[3, 4, 5, 6, 7][..]));
1390 fn test_rotate_right_parts() {
1391 let mut v: VecDeque<_> = (1..=7).collect();
1393 assert_eq!(v.as_slices(), (&[6, 7][..], &[1, 2, 3, 4, 5][..]));
1395 assert_eq!(v.as_slices(), (&[4, 5, 6, 7][..], &[1, 2, 3][..]));
1397 assert_eq!(v.as_slices(), (&[2, 3, 4, 5, 6, 7][..], &[1][..]));
1399 assert_eq!(v.as_slices(), (&[7, 1, 2, 3, 4, 5, 6][..], &[][..]));
1401 assert_eq!(v.as_slices(), (&[5, 6][..], &[7, 1, 2, 3, 4][..]));
1403 assert_eq!(v.as_slices(), (&[3, 4, 5, 6][..], &[7, 1, 2][..]));
1405 assert_eq!(v.as_slices(), (&[1, 2, 3, 4, 5, 6][..], &[7][..]));
1409 fn test_rotate_left_random() {
1411 6, 1, 0, 11, 12, 1, 11, 7, 9, 3, 6, 1, 4, 0, 5, 1, 3, 1, 12, 8, 3, 1, 11, 11, 9, 4, 12, 3,
1412 12, 9, 11, 1, 7, 9, 7, 2,
1415 let mut v: VecDeque<_> = (0..n).collect();
1416 let mut total_shift = 0;
1417 for shift in shifts.iter().cloned() {
1418 v.rotate_left(shift);
1419 total_shift += shift;
1421 assert_eq!(v[i], (i + total_shift) % n);
1427 fn test_rotate_right_random() {
1429 6, 1, 0, 11, 12, 1, 11, 7, 9, 3, 6, 1, 4, 0, 5, 1, 3, 1, 12, 8, 3, 1, 11, 11, 9, 4, 12, 3,
1430 12, 9, 11, 1, 7, 9, 7, 2,
1433 let mut v: VecDeque<_> = (0..n).collect();
1434 let mut total_shift = 0;
1435 for shift in shifts.iter().cloned() {
1436 v.rotate_right(shift);
1437 total_shift += shift;
1439 assert_eq!(v[(i + total_shift) % n], i);
1445 fn test_try_fold_empty() {
1446 assert_eq!(Some(0), VecDeque::<u32>::new().iter().try_fold(0, |_, _| None));
1450 fn test_try_fold_none() {
1451 let v: VecDeque<u32> = (0..12).collect();
1452 assert_eq!(None, v.into_iter().try_fold(0, |a, b| if b < 11 { Some(a + b) } else { None }));
1456 fn test_try_fold_ok() {
1457 let v: VecDeque<u32> = (0..12).collect();
1458 assert_eq!(Ok::<_, ()>(66), v.into_iter().try_fold(0, |a, b| Ok(a + b)));
1462 fn test_try_fold_unit() {
1463 let v: VecDeque<()> = std::iter::repeat(()).take(42).collect();
1464 assert_eq!(Some(()), v.into_iter().try_fold((), |(), ()| Some(())));
1468 fn test_try_fold_unit_none() {
1469 let v: std::collections::VecDeque<()> = [(); 10].iter().cloned().collect();
1470 let mut iter = v.into_iter();
1471 assert!(iter.try_fold((), |_, _| None).is_none());
1472 assert_eq!(iter.len(), 9);
1476 fn test_try_fold_rotated() {
1477 let mut v: VecDeque<_> = (0..12).collect();
1484 assert_eq!(Ok::<_, ()>(66), v.iter().try_fold(0, |a, b| Ok(a + b)));
1489 fn test_try_fold_moves_iter() {
1490 let v: VecDeque<_> = [10, 20, 30, 40, 100, 60, 70, 80, 90].iter().collect();
1491 let mut iter = v.into_iter();
1492 assert_eq!(iter.try_fold(0_i8, |acc, &x| acc.checked_add(x)), None);
1493 assert_eq!(iter.next(), Some(&60));
1497 fn test_try_fold_exhaust_wrap() {
1498 let mut v = VecDeque::with_capacity(7);
1504 let mut iter = v.iter();
1505 let _ = iter.try_fold(0, |_, _| Some(1));
1506 assert!(iter.is_empty());
1510 fn test_try_fold_wraparound() {
1511 let mut v = VecDeque::with_capacity(8);
1517 let mut iter = v.iter();
1518 let _ = iter.find(|&&x| x == 2);
1519 assert_eq!(Some(&7), iter.next());
1523 fn test_try_rfold_rotated() {
1524 let mut v: VecDeque<_> = (0..12).collect();
1531 assert_eq!(Ok::<_, ()>(66), v.iter().try_rfold(0, |a, b| Ok(a + b)));
1536 fn test_try_rfold_moves_iter() {
1537 let v: VecDeque<_> = [10, 20, 30, 40, 100, 60, 70, 80, 90].iter().collect();
1538 let mut iter = v.into_iter();
1539 assert_eq!(iter.try_rfold(0_i8, |acc, &x| acc.checked_add(x)), None);
1540 assert_eq!(iter.next_back(), Some(&70));