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);
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]);
911 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
913 // append nothing to something
915 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
917 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
919 // append something to nothing
921 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
923 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), []);
928 fn test_append_permutations() {
929 fn construct_vec_deque(
934 ) -> VecDeque<usize> {
935 let mut out = VecDeque::new();
936 for a in 0..push_back {
939 for b in 0..push_front {
940 out.push_front(push_back + b);
942 for _ in 0..pop_back {
945 for _ in 0..pop_front {
951 const MAX: usize = 5;
953 // Many different permutations of both the `VecDeque` getting appended to
954 // and the one getting appended are generated to check `append`.
955 // This ensures all 6 code paths of `append` are tested.
956 for src_push_back in 0..MAX {
957 for src_push_front in 0..MAX {
958 // doesn't pop more values than are pushed
959 for src_pop_back in 0..(src_push_back + src_push_front) {
960 for src_pop_front in 0..(src_push_back + src_push_front - src_pop_back) {
962 let src = construct_vec_deque(
969 for dst_push_back in 0..MAX {
970 for dst_push_front in 0..MAX {
971 for dst_pop_back in 0..(dst_push_back + dst_push_front) {
973 in 0..(dst_push_back + dst_push_front - dst_pop_back)
975 let mut dst = construct_vec_deque(
981 let mut src = src.clone();
983 // Assert that appending `src` to `dst` gives the same order
984 // of values as iterating over both in sequence.
989 .collect::<Vec<usize>>();
990 dst.append(&mut src);
991 assert_eq!(dst, correct);
992 assert!(src.is_empty());
1003 struct DropCounter<'a> {
1007 impl Drop for DropCounter<'_> {
1008 fn drop(&mut self) {
1014 fn test_append_double_drop() {
1015 let (mut count_a, mut count_b) = (0, 0);
1017 let mut a = VecDeque::new();
1018 let mut b = VecDeque::new();
1019 a.push_back(DropCounter { count: &mut count_a });
1020 b.push_back(DropCounter { count: &mut count_b });
1024 assert_eq!(count_a, 1);
1025 assert_eq!(count_b, 1);
1030 let mut buf = VecDeque::new();
1032 buf.retain(|&x| x % 2 == 0);
1033 let v: Vec<_> = buf.into_iter().collect();
1034 assert_eq!(&v[..], &[2, 4]);
1038 fn test_extend_ref() {
1039 let mut v = VecDeque::new();
1041 v.extend(&[2, 3, 4]);
1043 assert_eq!(v.len(), 4);
1044 assert_eq!(v[0], 1);
1045 assert_eq!(v[1], 2);
1046 assert_eq!(v[2], 3);
1047 assert_eq!(v[3], 4);
1049 let mut w = VecDeque::new();
1054 assert_eq!(v.len(), 6);
1055 assert_eq!(v[0], 1);
1056 assert_eq!(v[1], 2);
1057 assert_eq!(v[2], 3);
1058 assert_eq!(v[3], 4);
1059 assert_eq!(v[4], 5);
1060 assert_eq!(v[5], 6);
1064 fn test_contains() {
1065 let mut v = VecDeque::new();
1066 v.extend(&[2, 3, 4]);
1068 assert!(v.contains(&3));
1069 assert!(!v.contains(&1));
1073 assert!(!v.contains(&3));
1077 fn assert_covariance() {
1078 fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
1084 fn test_is_empty() {
1085 let mut v = VecDeque::<i32>::new();
1086 assert!(v.is_empty());
1087 assert!(v.iter().is_empty());
1088 assert!(v.iter_mut().is_empty());
1089 v.extend(&[2, 3, 4]);
1090 assert!(!v.is_empty());
1091 assert!(!v.iter().is_empty());
1092 assert!(!v.iter_mut().is_empty());
1093 while let Some(_) = v.pop_front() {
1094 assert_eq!(v.is_empty(), v.len() == 0);
1095 assert_eq!(v.iter().is_empty(), v.iter().len() == 0);
1096 assert_eq!(v.iter_mut().is_empty(), v.iter_mut().len() == 0);
1098 assert!(v.is_empty());
1099 assert!(v.iter().is_empty());
1100 assert!(v.iter_mut().is_empty());
1101 assert!(v.into_iter().is_empty());
1105 fn test_reserve_exact_2() {
1106 // This is all the same as test_reserve
1108 let mut v = VecDeque::new();
1111 assert!(v.capacity() >= 2);
1117 assert!(v.capacity() >= 16);
1118 v.reserve_exact(16);
1119 assert!(v.capacity() >= 32);
1123 v.reserve_exact(16);
1124 assert!(v.capacity() >= 48)
1129 fn test_try_reserve() {
1131 // These are the interesting cases:
1132 // * exactly isize::MAX should never trigger a CapacityOverflow (can be OOM)
1133 // * > isize::MAX should always fail
1134 // * On 16/32-bit should CapacityOverflow
1135 // * On 64-bit should OOM
1136 // * overflow may trigger when adding `len` to `cap` (in number of elements)
1137 // * overflow may trigger when multiplying `new_cap` by size_of::<T> (to get bytes)
1139 const MAX_CAP: usize = (isize::MAX as usize + 1) / 2 - 1;
1140 const MAX_USIZE: usize = usize::MAX;
1142 // On 16/32-bit, we check that allocations don't exceed isize::MAX,
1143 // on 64-bit, we assume the OS will give an OOM for such a ridiculous size.
1144 // Any platform that succeeds for these requests is technically broken with
1145 // ptr::offset because LLVM is the worst.
1146 let guards_against_isize = size_of::<usize>() < 8;
1149 // Note: basic stuff is checked by test_reserve
1150 let mut empty_bytes: VecDeque<u8> = VecDeque::new();
1152 // Check isize::MAX doesn't count as an overflow
1153 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP) {
1154 panic!("isize::MAX shouldn't trigger an overflow!");
1156 // Play it again, frank! (just to be sure)
1157 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP) {
1158 panic!("isize::MAX shouldn't trigger an overflow!");
1161 if guards_against_isize {
1162 // Check isize::MAX + 1 does count as overflow
1163 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP + 1) {
1164 } else { panic!("isize::MAX + 1 should trigger an overflow!") }
1166 // Check usize::MAX does count as overflow
1167 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_USIZE) {
1168 } else { panic!("usize::MAX should trigger an overflow!") }
1170 // Check isize::MAX is an OOM
1171 // VecDeque starts with capacity 7, always adds 1 to the capacity
1172 // and also rounds the number to next power of 2 so this is the
1173 // furthest we can go without triggering CapacityOverflow
1174 if let Err(AllocErr) = empty_bytes.try_reserve(MAX_CAP) {
1175 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1181 // Same basic idea, but with non-zero len
1182 let mut ten_bytes: VecDeque<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1184 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 10) {
1185 panic!("isize::MAX shouldn't trigger an overflow!");
1187 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 10) {
1188 panic!("isize::MAX shouldn't trigger an overflow!");
1190 if guards_against_isize {
1191 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 9) {
1192 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1194 if let Err(AllocErr) = ten_bytes.try_reserve(MAX_CAP - 9) {
1195 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1197 // Should always overflow in the add-to-len
1198 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_USIZE) {
1199 } else { panic!("usize::MAX should trigger an overflow!") }
1204 // Same basic idea, but with interesting type size
1205 let mut ten_u32s: VecDeque<u32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1207 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP/4 - 10) {
1208 panic!("isize::MAX shouldn't trigger an overflow!");
1210 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP/4 - 10) {
1211 panic!("isize::MAX shouldn't trigger an overflow!");
1213 if guards_against_isize {
1214 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP/4 - 9) {
1215 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1217 if let Err(AllocErr) = ten_u32s.try_reserve(MAX_CAP/4 - 9) {
1218 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1220 // Should fail in the mul-by-size
1221 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_USIZE - 20) {
1223 panic!("usize::MAX should trigger an overflow!");
1231 fn test_try_reserve_exact() {
1233 // This is exactly the same as test_try_reserve with the method changed.
1234 // See that test for comments.
1236 const MAX_CAP: usize = (isize::MAX as usize + 1) / 2 - 1;
1237 const MAX_USIZE: usize = usize::MAX;
1239 let guards_against_isize = size_of::<usize>() < 8;
1242 let mut empty_bytes: VecDeque<u8> = VecDeque::new();
1244 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP) {
1245 panic!("isize::MAX shouldn't trigger an overflow!");
1247 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP) {
1248 panic!("isize::MAX shouldn't trigger an overflow!");
1251 if guards_against_isize {
1252 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP + 1) {
1253 } else { panic!("isize::MAX + 1 should trigger an overflow!") }
1255 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_USIZE) {
1256 } else { panic!("usize::MAX should trigger an overflow!") }
1258 // Check isize::MAX is an OOM
1259 // VecDeque starts with capacity 7, always adds 1 to the capacity
1260 // and also rounds the number to next power of 2 so this is the
1261 // furthest we can go without triggering CapacityOverflow
1262 if let Err(AllocErr) = empty_bytes.try_reserve_exact(MAX_CAP) {
1263 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1269 let mut ten_bytes: VecDeque<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1271 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 10) {
1272 panic!("isize::MAX shouldn't trigger an overflow!");
1274 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 10) {
1275 panic!("isize::MAX shouldn't trigger an overflow!");
1277 if guards_against_isize {
1278 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 9) {
1279 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1281 if let Err(AllocErr) = ten_bytes.try_reserve_exact(MAX_CAP - 9) {
1282 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1284 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_USIZE) {
1285 } else { panic!("usize::MAX should trigger an overflow!") }
1290 let mut ten_u32s: VecDeque<u32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
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 let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 10) {
1296 panic!("isize::MAX shouldn't trigger an overflow!");
1298 if guards_against_isize {
1299 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 9) {
1300 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1302 if let Err(AllocErr) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 9) {
1303 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1305 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_USIZE - 20) {
1306 } else { panic!("usize::MAX should trigger an overflow!") }
1312 fn test_rotate_nop() {
1313 let mut v: VecDeque<_> = (0..10).collect();
1314 assert_unchanged(&v);
1317 assert_unchanged(&v);
1320 assert_unchanged(&v);
1323 assert_unchanged(&v);
1326 assert_unchanged(&v);
1330 assert_unchanged(&v);
1334 assert_unchanged(&v);
1338 assert_unchanged(&v);
1342 assert_unchanged(&v);
1346 assert_unchanged(&v);
1350 assert_unchanged(&v);
1356 assert_unchanged(&v);
1362 assert_unchanged(&v);
1364 fn assert_unchanged(v: &VecDeque<i32>) {
1365 assert_eq!(v, &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
1370 fn test_rotate_left_parts() {
1371 let mut v: VecDeque<_> = (1..=7).collect();
1373 assert_eq!(v.as_slices(), (&[3, 4, 5, 6, 7, 1][..], &[2][..]));
1375 assert_eq!(v.as_slices(), (&[5, 6, 7, 1][..], &[2, 3, 4][..]));
1377 assert_eq!(v.as_slices(), (&[7, 1][..], &[2, 3, 4, 5, 6][..]));
1379 assert_eq!(v.as_slices(), (&[2, 3, 4, 5, 6, 7, 1][..], &[][..]));
1381 assert_eq!(v.as_slices(), (&[4, 5, 6, 7, 1, 2][..], &[3][..]));
1383 assert_eq!(v.as_slices(), (&[6, 7, 1, 2][..], &[3, 4, 5][..]));
1385 assert_eq!(v.as_slices(), (&[1, 2][..], &[3, 4, 5, 6, 7][..]));
1389 fn test_rotate_right_parts() {
1390 let mut v: VecDeque<_> = (1..=7).collect();
1392 assert_eq!(v.as_slices(), (&[6, 7][..], &[1, 2, 3, 4, 5][..]));
1394 assert_eq!(v.as_slices(), (&[4, 5, 6, 7][..], &[1, 2, 3][..]));
1396 assert_eq!(v.as_slices(), (&[2, 3, 4, 5, 6, 7][..], &[1][..]));
1398 assert_eq!(v.as_slices(), (&[7, 1, 2, 3, 4, 5, 6][..], &[][..]));
1400 assert_eq!(v.as_slices(), (&[5, 6][..], &[7, 1, 2, 3, 4][..]));
1402 assert_eq!(v.as_slices(), (&[3, 4, 5, 6][..], &[7, 1, 2][..]));
1404 assert_eq!(v.as_slices(), (&[1, 2, 3, 4, 5, 6][..], &[7][..]));
1408 fn test_rotate_left_random() {
1410 6, 1, 0, 11, 12, 1, 11, 7, 9, 3, 6, 1,
1411 4, 0, 5, 1, 3, 1, 12, 8, 3, 1, 11, 11,
1412 9, 4, 12, 3, 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,
1430 4, 0, 5, 1, 3, 1, 12, 8, 3, 1, 11, 11,
1431 9, 4, 12, 3, 12, 9, 11, 1, 7, 9, 7, 2,
1434 let mut v: VecDeque<_> = (0..n).collect();
1435 let mut total_shift = 0;
1436 for shift in shifts.iter().cloned() {
1437 v.rotate_right(shift);
1438 total_shift += shift;
1440 assert_eq!(v[(i + total_shift) % n], i);
1446 fn test_try_fold_empty() {
1447 assert_eq!(Some(0), VecDeque::<u32>::new().iter().try_fold(0, |_, _| None));
1451 fn test_try_fold_none() {
1452 let v: VecDeque<u32> = (0..12).collect();
1453 assert_eq!(None, v.into_iter().try_fold(0, |a, b|
1454 if b < 11 { Some(a + b) } else { None }));
1458 fn test_try_fold_ok() {
1459 let v: VecDeque<u32> = (0..12).collect();
1460 assert_eq!(Ok::<_, ()>(66), v.into_iter().try_fold(0, |a, b| Ok(a + b)));
1464 fn test_try_fold_unit() {
1465 let v: VecDeque<()> = std::iter::repeat(()).take(42).collect();
1466 assert_eq!(Some(()), v.into_iter().try_fold((), |(), ()| Some(())));
1470 fn test_try_fold_rotated() {
1471 let mut v: VecDeque<_> = (0..12).collect();
1478 assert_eq!(Ok::<_, ()>(66), v.iter().try_fold(0, |a, b| Ok(a + b)));