2 use std::collections::{VecDeque, vec_deque::Drain};
3 use std::collections::CollectionAllocErr::*;
5 use std::{usize, isize};
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);
48 fn test_parameterized<T: Clone + PartialEq + Debug>(a: T, b: T, c: T, d: T) {
49 let mut deq = VecDeque::new();
50 assert_eq!(deq.len(), 0);
51 deq.push_front(a.clone());
52 deq.push_front(b.clone());
53 deq.push_back(c.clone());
54 assert_eq!(deq.len(), 3);
55 deq.push_back(d.clone());
56 assert_eq!(deq.len(), 4);
57 assert_eq!((*deq.front().unwrap()).clone(), b.clone());
58 assert_eq!((*deq.back().unwrap()).clone(), d.clone());
59 assert_eq!(deq.pop_front().unwrap(), b.clone());
60 assert_eq!(deq.pop_back().unwrap(), d.clone());
61 assert_eq!(deq.pop_back().unwrap(), c.clone());
62 assert_eq!(deq.pop_back().unwrap(), a.clone());
63 assert_eq!(deq.len(), 0);
64 deq.push_back(c.clone());
65 assert_eq!(deq.len(), 1);
66 deq.push_front(b.clone());
67 assert_eq!(deq.len(), 2);
68 deq.push_back(d.clone());
69 assert_eq!(deq.len(), 3);
70 deq.push_front(a.clone());
71 assert_eq!(deq.len(), 4);
72 assert_eq!(deq[0].clone(), a.clone());
73 assert_eq!(deq[1].clone(), b.clone());
74 assert_eq!(deq[2].clone(), c.clone());
75 assert_eq!(deq[3].clone(), d.clone());
79 fn test_push_front_grow() {
80 let mut deq = VecDeque::new();
84 assert_eq!(deq.len(), 66);
87 assert_eq!(deq[i], 65 - i);
90 let mut deq = VecDeque::new();
96 assert_eq!(deq[i], i);
102 let mut deq = VecDeque::new();
106 assert_eq!(deq[1], 2);
111 #[cfg(not(miri))] // Miri does not support panics
112 fn test_index_out_of_bounds() {
113 let mut deq = VecDeque::new();
120 #[derive(Clone, PartialEq, Debug)]
124 Three(i32, i32, i32),
127 #[derive(Clone, PartialEq, Debug)]
134 #[derive(Clone, PartialEq, Debug)]
142 fn test_param_int() {
143 test_parameterized::<i32>(5, 72, 64, 175);
147 fn test_param_taggy() {
148 test_parameterized::<Taggy>(One(1), Two(1, 2), Three(1, 2, 3), Two(17, 42));
152 fn test_param_taggypar() {
153 test_parameterized::<Taggypar<i32>>(Onepar::<i32>(1),
155 Threepar::<i32>(1, 2, 3),
156 Twopar::<i32>(17, 42));
160 fn test_param_reccy() {
181 test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
185 fn test_with_capacity() {
186 let mut d = VecDeque::with_capacity(0);
188 assert_eq!(d.len(), 1);
189 let mut d = VecDeque::with_capacity(50);
191 assert_eq!(d.len(), 1);
195 fn test_with_capacity_non_power_two() {
196 let mut d3 = VecDeque::with_capacity(3);
201 assert_eq!(d3.pop_front(), Some(1));
203 assert_eq!(d3.front(), None);
210 assert_eq!(d3.pop_front(), Some(3));
212 // Pushing the lo past half way point to trigger
213 // the 'B' scenario for growth
220 // There used to be a bug here about how the
221 // VecDeque made growth assumptions about the
222 // underlying Vec which didn't hold and lead
224 // (Vec grows to next power of two)
225 // good- [9, 12, 15, X, X, X, X, |6]
226 // bug- [15, 12, X, X, X, |6, X, X]
227 assert_eq!(d3.pop_front(), Some(6));
229 // Which leads us to the following state which
230 // would be a failure case.
231 // bug- [15, 12, X, X, X, X, |X, X]
232 assert_eq!(d3.front(), Some(&9));
236 fn test_reserve_exact() {
237 let mut d = VecDeque::new();
240 assert!(d.capacity() >= 51);
245 let mut d = VecDeque::new();
248 assert!(d.capacity() >= 51);
253 let mut d: VecDeque<_> = (0..5).collect();
256 assert_eq!(d.iter().cloned().collect::<Vec<_>>(), [4, 2, 3, 1]);
261 let mut d = VecDeque::new();
262 assert_eq!(d.iter().next(), None);
263 assert_eq!(d.iter().size_hint(), (0, Some(0)));
269 let b: &[_] = &[&0, &1, &2, &3, &4];
270 assert_eq!(d.iter().collect::<Vec<_>>(), b);
277 let b: &[_] = &[&8, &7, &6, &0, &1, &2, &3, &4];
278 assert_eq!(d.iter().collect::<Vec<_>>(), b);
281 let mut it = d.iter();
282 let mut len = d.len();
288 assert_eq!(it.size_hint(), (len, Some(len)))
296 let mut d = VecDeque::new();
297 assert_eq!(d.iter().rev().next(), None);
303 let b: &[_] = &[&4, &3, &2, &1, &0];
304 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
310 let b: &[_] = &[&4, &3, &2, &1, &0, &6, &7, &8];
311 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
315 fn test_mut_rev_iter_wrap() {
316 let mut d = VecDeque::with_capacity(3);
317 assert!(d.iter_mut().rev().next().is_none());
322 assert_eq!(d.pop_front(), Some(1));
325 assert_eq!(d.iter_mut().rev().map(|x| *x).collect::<Vec<_>>(),
331 let mut d = VecDeque::new();
332 assert!(d.iter_mut().next().is_none());
338 for (i, elt) in d.iter_mut().enumerate() {
339 assert_eq!(*elt, 2 - i);
344 let mut it = d.iter_mut();
345 assert_eq!(*it.next().unwrap(), 0);
346 assert_eq!(*it.next().unwrap(), 1);
347 assert_eq!(*it.next().unwrap(), 2);
348 assert!(it.next().is_none());
353 fn test_mut_rev_iter() {
354 let mut d = VecDeque::new();
355 assert!(d.iter_mut().rev().next().is_none());
361 for (i, elt) in d.iter_mut().rev().enumerate() {
367 let mut it = d.iter_mut().rev();
368 assert_eq!(*it.next().unwrap(), 0);
369 assert_eq!(*it.next().unwrap(), 1);
370 assert_eq!(*it.next().unwrap(), 2);
371 assert!(it.next().is_none());
376 fn test_into_iter() {
380 let d: VecDeque<i32> = VecDeque::new();
381 let mut iter = d.into_iter();
383 assert_eq!(iter.size_hint(), (0, Some(0)));
384 assert_eq!(iter.next(), None);
385 assert_eq!(iter.size_hint(), (0, Some(0)));
390 let mut d = VecDeque::new();
395 let b = vec![0, 1, 2, 3, 4];
396 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
401 let mut d = VecDeque::new();
409 let b = vec![8, 7, 6, 0, 1, 2, 3, 4];
410 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
415 let mut d = VecDeque::new();
423 let mut it = d.into_iter();
424 assert_eq!(it.size_hint(), (8, Some(8)));
425 assert_eq!(it.next(), Some(8));
426 assert_eq!(it.size_hint(), (7, Some(7)));
427 assert_eq!(it.next_back(), Some(4));
428 assert_eq!(it.size_hint(), (6, Some(6)));
429 assert_eq!(it.next(), Some(7));
430 assert_eq!(it.size_hint(), (5, Some(5)));
439 let mut d: VecDeque<i32> = VecDeque::new();
442 let mut iter = d.drain(..);
444 assert_eq!(iter.size_hint(), (0, Some(0)));
445 assert_eq!(iter.next(), None);
446 assert_eq!(iter.size_hint(), (0, Some(0)));
449 assert!(d.is_empty());
454 let mut d = VecDeque::new();
459 assert_eq!(d.drain(..).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
460 assert!(d.is_empty());
465 let mut d = VecDeque::new();
473 assert_eq!(d.drain(..).collect::<Vec<_>>(), [8, 7, 6, 0, 1, 2, 3, 4]);
474 assert!(d.is_empty());
479 let mut d: VecDeque<_> = VecDeque::new();
488 let mut it = d.drain(..);
489 assert_eq!(it.size_hint(), (8, Some(8)));
490 assert_eq!(it.next(), Some(8));
491 assert_eq!(it.size_hint(), (7, Some(7)));
492 assert_eq!(it.next_back(), Some(4));
493 assert_eq!(it.size_hint(), (6, Some(6)));
494 assert_eq!(it.next(), Some(7));
495 assert_eq!(it.size_hint(), (5, Some(5)));
497 assert!(d.is_empty());
502 fn test_from_iter() {
503 let v = vec![1, 2, 3, 4, 5, 6, 7];
504 let deq: VecDeque<_> = v.iter().cloned().collect();
505 let u: Vec<_> = deq.iter().cloned().collect();
508 let seq = (0..).step_by(2).take(256);
509 let deq: VecDeque<_> = seq.collect();
510 for (i, &x) in deq.iter().enumerate() {
511 assert_eq!(2 * i, x);
513 assert_eq!(deq.len(), 256);
518 let mut d = VecDeque::new();
523 assert_eq!(d.len(), 4);
524 let mut e = d.clone();
525 assert_eq!(e.len(), 4);
526 while !d.is_empty() {
527 assert_eq!(d.pop_back(), e.pop_back());
529 assert_eq!(d.len(), 0);
530 assert_eq!(e.len(), 0);
535 let mut d = VecDeque::new();
536 assert!(d == VecDeque::with_capacity(0));
541 let mut e = VecDeque::with_capacity(0);
551 assert!(e == VecDeque::new());
555 fn test_partial_eq_array() {
556 let d = VecDeque::<char>::new();
559 let mut d = VecDeque::new();
563 let mut d = VecDeque::new();
567 let mut d = VecDeque::new();
570 assert!(d == ['a', 'b']);
575 let mut x = VecDeque::new();
576 let mut y = VecDeque::new();
588 assert!(hash(&x) == hash(&y));
592 fn test_hash_after_rotation() {
593 // test that two deques hash equal even if elements are laid out differently
595 let mut ring: VecDeque<i32> = (0..len as i32).collect();
596 let orig = ring.clone();
597 for _ in 0..ring.capacity() {
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);
604 assert_eq!(hash(&orig), hash(&ring));
605 assert_eq!(orig, ring);
606 assert_eq!(ring, orig);
611 fn test_eq_after_rotation() {
612 // test that two deques are equal even if elements are laid out differently
614 let mut ring: VecDeque<i32> = (0..len as i32).collect();
615 let mut shifted = ring.clone();
617 // shift values 1 step to the right by pop, sub one, push
619 for elt in &mut ring {
622 ring.push_back(len - 1);
626 for _ in 0..shifted.capacity() {
628 for elt in &mut shifted {
631 shifted.push_back(len - 1);
632 assert_eq!(shifted, ring);
633 assert_eq!(ring, shifted);
639 let x = VecDeque::new();
640 let mut y = VecDeque::new();
652 let ringbuf: VecDeque<_> = (0..10).collect();
653 assert_eq!(format!("{:?}", ringbuf), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
655 let ringbuf: VecDeque<_> = vec!["just", "one", "test", "more"]
659 assert_eq!(format!("{:?}", ringbuf),
660 "[\"just\", \"one\", \"test\", \"more\"]");
665 static mut DROPS: i32 = 0;
675 let mut ring = VecDeque::new();
676 ring.push_back(Elem);
677 ring.push_front(Elem);
678 ring.push_back(Elem);
679 ring.push_front(Elem);
682 assert_eq!(unsafe { DROPS }, 4);
686 fn test_drop_with_pop() {
687 static mut DROPS: i32 = 0;
697 let mut ring = VecDeque::new();
698 ring.push_back(Elem);
699 ring.push_front(Elem);
700 ring.push_back(Elem);
701 ring.push_front(Elem);
703 drop(ring.pop_back());
704 drop(ring.pop_front());
705 assert_eq!(unsafe { DROPS }, 2);
708 assert_eq!(unsafe { DROPS }, 4);
712 fn test_drop_clear() {
713 static mut DROPS: i32 = 0;
723 let mut ring = VecDeque::new();
724 ring.push_back(Elem);
725 ring.push_front(Elem);
726 ring.push_back(Elem);
727 ring.push_front(Elem);
729 assert_eq!(unsafe { DROPS }, 4);
732 assert_eq!(unsafe { DROPS }, 4);
736 fn test_reserve_grow() {
737 // test growth path A
738 // [T o o H] -> [T o o H . . . . ]
739 let mut ring = VecDeque::with_capacity(4);
745 assert_eq!(ring.pop_front(), Some(i));
748 // test growth path B
749 // [H T o o] -> [. T o o H . . . ]
750 let mut ring = VecDeque::with_capacity(4);
753 assert_eq!(ring.pop_front(), Some(i));
760 assert_eq!(ring.pop_front(), Some(i));
763 // test growth path C
764 // [o o H T] -> [o o H . . . . T ]
765 let mut ring = VecDeque::with_capacity(4);
768 assert_eq!(ring.pop_front(), Some(i));
775 assert_eq!(ring.pop_front(), Some(i));
781 let mut ring = VecDeque::new();
783 assert_eq!(ring.get(0), Some(&0));
784 assert_eq!(ring.get(1), None);
787 assert_eq!(ring.get(0), Some(&0));
788 assert_eq!(ring.get(1), Some(&1));
789 assert_eq!(ring.get(2), None);
792 assert_eq!(ring.get(0), Some(&0));
793 assert_eq!(ring.get(1), Some(&1));
794 assert_eq!(ring.get(2), Some(&2));
795 assert_eq!(ring.get(3), None);
797 assert_eq!(ring.pop_front(), Some(0));
798 assert_eq!(ring.get(0), Some(&1));
799 assert_eq!(ring.get(1), Some(&2));
800 assert_eq!(ring.get(2), None);
802 assert_eq!(ring.pop_front(), Some(1));
803 assert_eq!(ring.get(0), Some(&2));
804 assert_eq!(ring.get(1), None);
806 assert_eq!(ring.pop_front(), Some(2));
807 assert_eq!(ring.get(0), None);
808 assert_eq!(ring.get(1), None);
813 let mut ring = VecDeque::new();
818 match ring.get_mut(1) {
823 assert_eq!(ring.get_mut(0), Some(&mut 0));
824 assert_eq!(ring.get_mut(1), Some(&mut -1));
825 assert_eq!(ring.get_mut(2), Some(&mut 2));
826 assert_eq!(ring.get_mut(3), None);
828 assert_eq!(ring.pop_front(), Some(0));
829 assert_eq!(ring.get_mut(0), Some(&mut -1));
830 assert_eq!(ring.get_mut(1), Some(&mut 2));
831 assert_eq!(ring.get_mut(2), None);
836 let mut ring = VecDeque::new();
839 assert_eq!(ring.front(), Some(&10));
841 assert_eq!(ring.front(), Some(&20));
843 assert_eq!(ring.front(), None);
847 fn test_as_slices() {
848 let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
849 let cap = ring.capacity() as i32;
851 let last = cap - first;
855 let (left, right) = ring.as_slices();
856 let expected: Vec<_> = (0..=i).collect();
857 assert_eq!(left, &expected[..]);
858 assert_eq!(right, []);
863 let (left, right) = ring.as_slices();
864 let expected_left: Vec<_> = (-last..=j).rev().collect();
865 let expected_right: Vec<_> = (0..first).collect();
866 assert_eq!(left, &expected_left[..]);
867 assert_eq!(right, &expected_right[..]);
870 assert_eq!(ring.len() as i32, cap);
871 assert_eq!(ring.capacity() as i32, cap);
875 fn test_as_mut_slices() {
876 let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
877 let cap = ring.capacity() as i32;
879 let last = cap - first;
883 let (left, right) = ring.as_mut_slices();
884 let expected: Vec<_> = (0..=i).collect();
885 assert_eq!(left, &expected[..]);
886 assert_eq!(right, []);
891 let (left, right) = ring.as_mut_slices();
892 let expected_left: Vec<_> = (-last..=j).rev().collect();
893 let expected_right: Vec<_> = (0..first).collect();
894 assert_eq!(left, &expected_left[..]);
895 assert_eq!(right, &expected_right[..]);
898 assert_eq!(ring.len() as i32, cap);
899 assert_eq!(ring.capacity() as i32, cap);
904 let mut a: VecDeque<_> = vec![1, 2, 3].into_iter().collect();
905 let mut b: VecDeque<_> = vec![4, 5, 6].into_iter().collect();
909 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
910 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
912 // append nothing to something
914 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
915 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
917 // append something to nothing
919 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
920 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), []);
924 #[cfg(not(miri))] // Miri is too slow
925 fn test_append_permutations() {
926 fn construct_vec_deque(
931 ) -> VecDeque<usize> {
932 let mut out = VecDeque::new();
933 for a in 0..push_back {
936 for b in 0..push_front {
937 out.push_front(push_back + b);
939 for _ in 0..pop_back {
942 for _ in 0..pop_front {
948 const MAX: usize = 5;
950 // Many different permutations of both the `VecDeque` getting appended to
951 // and the one getting appended are generated to check `append`.
952 // This ensures all 6 code paths of `append` are tested.
953 for src_push_back in 0..MAX {
954 for src_push_front in 0..MAX {
955 // doesn't pop more values than are pushed
956 for src_pop_back in 0..(src_push_back + src_push_front) {
957 for src_pop_front in 0..(src_push_back + src_push_front - src_pop_back) {
959 let src = construct_vec_deque(
966 for dst_push_back in 0..MAX {
967 for dst_push_front in 0..MAX {
968 for dst_pop_back in 0..(dst_push_back + dst_push_front) {
970 in 0..(dst_push_back + dst_push_front - dst_pop_back)
972 let mut dst = construct_vec_deque(
978 let mut src = src.clone();
980 // Assert that appending `src` to `dst` gives the same order
981 // of values as iterating over both in sequence.
986 .collect::<Vec<usize>>();
987 dst.append(&mut src);
988 assert_eq!(dst, correct);
989 assert!(src.is_empty());
1000 struct DropCounter<'a> {
1004 impl Drop for DropCounter<'_> {
1005 fn drop(&mut self) {
1011 fn test_append_double_drop() {
1012 let (mut count_a, mut count_b) = (0, 0);
1014 let mut a = VecDeque::new();
1015 let mut b = VecDeque::new();
1016 a.push_back(DropCounter { count: &mut count_a });
1017 b.push_back(DropCounter { count: &mut count_b });
1021 assert_eq!(count_a, 1);
1022 assert_eq!(count_b, 1);
1027 let mut buf = VecDeque::new();
1029 buf.retain(|&x| x % 2 == 0);
1030 let v: Vec<_> = buf.into_iter().collect();
1031 assert_eq!(&v[..], &[2, 4]);
1035 fn test_extend_ref() {
1036 let mut v = VecDeque::new();
1038 v.extend(&[2, 3, 4]);
1040 assert_eq!(v.len(), 4);
1041 assert_eq!(v[0], 1);
1042 assert_eq!(v[1], 2);
1043 assert_eq!(v[2], 3);
1044 assert_eq!(v[3], 4);
1046 let mut w = VecDeque::new();
1051 assert_eq!(v.len(), 6);
1052 assert_eq!(v[0], 1);
1053 assert_eq!(v[1], 2);
1054 assert_eq!(v[2], 3);
1055 assert_eq!(v[3], 4);
1056 assert_eq!(v[4], 5);
1057 assert_eq!(v[5], 6);
1061 fn test_contains() {
1062 let mut v = VecDeque::new();
1063 v.extend(&[2, 3, 4]);
1065 assert!(v.contains(&3));
1066 assert!(!v.contains(&1));
1070 assert!(!v.contains(&3));
1074 fn assert_covariance() {
1075 fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
1081 fn test_is_empty() {
1082 let mut v = VecDeque::<i32>::new();
1083 assert!(v.is_empty());
1084 assert!(v.iter().is_empty());
1085 assert!(v.iter_mut().is_empty());
1086 v.extend(&[2, 3, 4]);
1087 assert!(!v.is_empty());
1088 assert!(!v.iter().is_empty());
1089 assert!(!v.iter_mut().is_empty());
1090 while let Some(_) = v.pop_front() {
1091 assert_eq!(v.is_empty(), v.len() == 0);
1092 assert_eq!(v.iter().is_empty(), v.iter().len() == 0);
1093 assert_eq!(v.iter_mut().is_empty(), v.iter_mut().len() == 0);
1095 assert!(v.is_empty());
1096 assert!(v.iter().is_empty());
1097 assert!(v.iter_mut().is_empty());
1098 assert!(v.into_iter().is_empty());
1102 fn test_reserve_exact_2() {
1103 // This is all the same as test_reserve
1105 let mut v = VecDeque::new();
1108 assert!(v.capacity() >= 2);
1114 assert!(v.capacity() >= 16);
1115 v.reserve_exact(16);
1116 assert!(v.capacity() >= 32);
1120 v.reserve_exact(16);
1121 assert!(v.capacity() >= 48)
1125 #[cfg(not(miri))] // Miri does not support signalling OOM
1126 fn test_try_reserve() {
1128 // These are the interesting cases:
1129 // * exactly isize::MAX should never trigger a CapacityOverflow (can be OOM)
1130 // * > isize::MAX should always fail
1131 // * On 16/32-bit should CapacityOverflow
1132 // * On 64-bit should OOM
1133 // * overflow may trigger when adding `len` to `cap` (in number of elements)
1134 // * overflow may trigger when multiplying `new_cap` by size_of::<T> (to get bytes)
1136 const MAX_CAP: usize = (isize::MAX as usize + 1) / 2 - 1;
1137 const MAX_USIZE: usize = usize::MAX;
1139 // On 16/32-bit, we check that allocations don't exceed isize::MAX,
1140 // on 64-bit, we assume the OS will give an OOM for such a ridiculous size.
1141 // Any platform that succeeds for these requests is technically broken with
1142 // ptr::offset because LLVM is the worst.
1143 let guards_against_isize = size_of::<usize>() < 8;
1146 // Note: basic stuff is checked by test_reserve
1147 let mut empty_bytes: VecDeque<u8> = VecDeque::new();
1149 // Check isize::MAX doesn't count as an overflow
1150 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP) {
1151 panic!("isize::MAX shouldn't trigger an overflow!");
1153 // Play it again, frank! (just to be sure)
1154 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP) {
1155 panic!("isize::MAX shouldn't trigger an overflow!");
1158 if guards_against_isize {
1159 // Check isize::MAX + 1 does count as overflow
1160 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP + 1) {
1161 } else { panic!("isize::MAX + 1 should trigger an overflow!") }
1163 // Check usize::MAX does count as overflow
1164 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_USIZE) {
1165 } else { panic!("usize::MAX should trigger an overflow!") }
1167 // Check isize::MAX is an OOM
1168 // VecDeque starts with capacity 7, always adds 1 to the capacity
1169 // and also rounds the number to next power of 2 so this is the
1170 // furthest we can go without triggering CapacityOverflow
1171 if let Err(AllocErr) = empty_bytes.try_reserve(MAX_CAP) {
1172 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1178 // Same basic idea, but with non-zero len
1179 let mut ten_bytes: VecDeque<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1181 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 10) {
1182 panic!("isize::MAX shouldn't trigger an overflow!");
1184 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 10) {
1185 panic!("isize::MAX shouldn't trigger an overflow!");
1187 if guards_against_isize {
1188 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 9) {
1189 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1191 if let Err(AllocErr) = ten_bytes.try_reserve(MAX_CAP - 9) {
1192 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1194 // Should always overflow in the add-to-len
1195 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_USIZE) {
1196 } else { panic!("usize::MAX should trigger an overflow!") }
1201 // Same basic idea, but with interesting type size
1202 let mut ten_u32s: VecDeque<u32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1204 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP/4 - 10) {
1205 panic!("isize::MAX shouldn't trigger an overflow!");
1207 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP/4 - 10) {
1208 panic!("isize::MAX shouldn't trigger an overflow!");
1210 if guards_against_isize {
1211 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP/4 - 9) {
1212 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1214 if let Err(AllocErr) = ten_u32s.try_reserve(MAX_CAP/4 - 9) {
1215 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1217 // Should fail in the mul-by-size
1218 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_USIZE - 20) {
1220 panic!("usize::MAX should trigger an overflow!");
1227 #[cfg(not(miri))] // Miri does not support signalling OOM
1228 fn test_try_reserve_exact() {
1230 // This is exactly the same as test_try_reserve with the method changed.
1231 // See that test for comments.
1233 const MAX_CAP: usize = (isize::MAX as usize + 1) / 2 - 1;
1234 const MAX_USIZE: usize = usize::MAX;
1236 let guards_against_isize = size_of::<usize>() < 8;
1239 let mut empty_bytes: VecDeque<u8> = VecDeque::new();
1241 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP) {
1242 panic!("isize::MAX shouldn't trigger an overflow!");
1244 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP) {
1245 panic!("isize::MAX shouldn't trigger an overflow!");
1248 if guards_against_isize {
1249 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP + 1) {
1250 } else { panic!("isize::MAX + 1 should trigger an overflow!") }
1252 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_USIZE) {
1253 } else { panic!("usize::MAX should trigger an overflow!") }
1255 // Check isize::MAX is an OOM
1256 // VecDeque starts with capacity 7, always adds 1 to the capacity
1257 // and also rounds the number to next power of 2 so this is the
1258 // furthest we can go without triggering CapacityOverflow
1259 if let Err(AllocErr) = empty_bytes.try_reserve_exact(MAX_CAP) {
1260 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1266 let mut ten_bytes: VecDeque<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1268 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 10) {
1269 panic!("isize::MAX shouldn't trigger an overflow!");
1271 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 10) {
1272 panic!("isize::MAX shouldn't trigger an overflow!");
1274 if guards_against_isize {
1275 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 9) {
1276 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1278 if let Err(AllocErr) = ten_bytes.try_reserve_exact(MAX_CAP - 9) {
1279 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1281 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_USIZE) {
1282 } else { panic!("usize::MAX should trigger an overflow!") }
1287 let mut ten_u32s: VecDeque<u32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1289 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 10) {
1290 panic!("isize::MAX shouldn't trigger an overflow!");
1292 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 10) {
1293 panic!("isize::MAX shouldn't trigger an overflow!");
1295 if guards_against_isize {
1296 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 9) {
1297 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1299 if let Err(AllocErr) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 9) {
1300 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1302 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_USIZE - 20) {
1303 } else { panic!("usize::MAX should trigger an overflow!") }
1309 fn test_rotate_nop() {
1310 let mut v: VecDeque<_> = (0..10).collect();
1311 assert_unchanged(&v);
1314 assert_unchanged(&v);
1317 assert_unchanged(&v);
1320 assert_unchanged(&v);
1323 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);
1353 assert_unchanged(&v);
1359 assert_unchanged(&v);
1361 fn assert_unchanged(v: &VecDeque<i32>) {
1362 assert_eq!(v, &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
1367 fn test_rotate_left_parts() {
1368 let mut v: VecDeque<_> = (1..=7).collect();
1370 assert_eq!(v.as_slices(), (&[3, 4, 5, 6, 7, 1][..], &[2][..]));
1372 assert_eq!(v.as_slices(), (&[5, 6, 7, 1][..], &[2, 3, 4][..]));
1374 assert_eq!(v.as_slices(), (&[7, 1][..], &[2, 3, 4, 5, 6][..]));
1376 assert_eq!(v.as_slices(), (&[2, 3, 4, 5, 6, 7, 1][..], &[][..]));
1378 assert_eq!(v.as_slices(), (&[4, 5, 6, 7, 1, 2][..], &[3][..]));
1380 assert_eq!(v.as_slices(), (&[6, 7, 1, 2][..], &[3, 4, 5][..]));
1382 assert_eq!(v.as_slices(), (&[1, 2][..], &[3, 4, 5, 6, 7][..]));
1386 fn test_rotate_right_parts() {
1387 let mut v: VecDeque<_> = (1..=7).collect();
1389 assert_eq!(v.as_slices(), (&[6, 7][..], &[1, 2, 3, 4, 5][..]));
1391 assert_eq!(v.as_slices(), (&[4, 5, 6, 7][..], &[1, 2, 3][..]));
1393 assert_eq!(v.as_slices(), (&[2, 3, 4, 5, 6, 7][..], &[1][..]));
1395 assert_eq!(v.as_slices(), (&[7, 1, 2, 3, 4, 5, 6][..], &[][..]));
1397 assert_eq!(v.as_slices(), (&[5, 6][..], &[7, 1, 2, 3, 4][..]));
1399 assert_eq!(v.as_slices(), (&[3, 4, 5, 6][..], &[7, 1, 2][..]));
1401 assert_eq!(v.as_slices(), (&[1, 2, 3, 4, 5, 6][..], &[7][..]));
1405 fn test_rotate_left_random() {
1407 6, 1, 0, 11, 12, 1, 11, 7, 9, 3, 6, 1,
1408 4, 0, 5, 1, 3, 1, 12, 8, 3, 1, 11, 11,
1409 9, 4, 12, 3, 12, 9, 11, 1, 7, 9, 7, 2,
1412 let mut v: VecDeque<_> = (0..n).collect();
1413 let mut total_shift = 0;
1414 for shift in shifts.iter().cloned() {
1415 v.rotate_left(shift);
1416 total_shift += shift;
1418 assert_eq!(v[i], (i + total_shift) % n);
1424 fn test_rotate_right_random() {
1426 6, 1, 0, 11, 12, 1, 11, 7, 9, 3, 6, 1,
1427 4, 0, 5, 1, 3, 1, 12, 8, 3, 1, 11, 11,
1428 9, 4, 12, 3, 12, 9, 11, 1, 7, 9, 7, 2,
1431 let mut v: VecDeque<_> = (0..n).collect();
1432 let mut total_shift = 0;
1433 for shift in shifts.iter().cloned() {
1434 v.rotate_right(shift);
1435 total_shift += shift;
1437 assert_eq!(v[(i + total_shift) % n], i);
1443 fn test_try_fold_empty() {
1444 assert_eq!(Some(0), VecDeque::<u32>::new().iter().try_fold(0, |_, _| None));
1448 fn test_try_fold_none() {
1449 let v: VecDeque<u32> = (0..12).collect();
1450 assert_eq!(None, v.into_iter().try_fold(0, |a, b|
1451 if b < 11 { Some(a + b) } else { None }));
1455 fn test_try_fold_ok() {
1456 let v: VecDeque<u32> = (0..12).collect();
1457 assert_eq!(Ok::<_, ()>(66), v.into_iter().try_fold(0, |a, b| Ok(a + b)));
1461 fn test_try_fold_unit() {
1462 let v: VecDeque<()> = std::iter::repeat(()).take(42).collect();
1463 assert_eq!(Some(()), v.into_iter().try_fold((), |(), ()| Some(())));
1467 fn test_try_fold_rotated() {
1468 let mut v: VecDeque<_> = (0..12).collect();
1475 assert_eq!(Ok::<_, ()>(66), v.iter().try_fold(0, |a, b| Ok(a + b)));