1 // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 use std
::collections
::VecDeque
;
13 use std
::collections
::vec_deque
::{Drain}
;
14 use std
::collections
::CollectionAllocErr
::*;
15 use std
::mem
::size_of
;
16 use std
::{usize, isize}
;
19 use self::Taggypar
::*;
23 let mut d
= VecDeque
::new();
24 assert_eq
!(d
.len(), 0);
28 assert_eq
!(d
.len(), 3);
30 assert_eq
!(d
.len(), 4);
31 assert_eq
!(*d
.front().unwrap(), 42);
32 assert_eq
!(*d
.back().unwrap(), 137);
33 let mut i
= d
.pop_front();
34 assert_eq
!(i
, Some(42));
36 assert_eq
!(i
, Some(137));
38 assert_eq
!(i
, Some(137));
40 assert_eq
!(i
, Some(17));
41 assert_eq
!(d
.len(), 0);
43 assert_eq
!(d
.len(), 1);
45 assert_eq
!(d
.len(), 2);
47 assert_eq
!(d
.len(), 3);
49 assert_eq
!(d
.len(), 4);
57 fn test_parameterized
<T
: Clone
+ PartialEq
+ Debug
>(a
: T
, b
: T
, c
: T
, d
: T
) {
58 let mut deq
= VecDeque
::new();
59 assert_eq
!(deq
.len(), 0);
60 deq
.push_front(a
.clone());
61 deq
.push_front(b
.clone());
62 deq
.push_back(c
.clone());
63 assert_eq
!(deq
.len(), 3);
64 deq
.push_back(d
.clone());
65 assert_eq
!(deq
.len(), 4);
66 assert_eq
!((*deq
.front().unwrap()).clone(), b
.clone());
67 assert_eq
!((*deq
.back().unwrap()).clone(), d
.clone());
68 assert_eq
!(deq
.pop_front().unwrap(), b
.clone());
69 assert_eq
!(deq
.pop_back().unwrap(), d
.clone());
70 assert_eq
!(deq
.pop_back().unwrap(), c
.clone());
71 assert_eq
!(deq
.pop_back().unwrap(), a
.clone());
72 assert_eq
!(deq
.len(), 0);
73 deq
.push_back(c
.clone());
74 assert_eq
!(deq
.len(), 1);
75 deq
.push_front(b
.clone());
76 assert_eq
!(deq
.len(), 2);
77 deq
.push_back(d
.clone());
78 assert_eq
!(deq
.len(), 3);
79 deq
.push_front(a
.clone());
80 assert_eq
!(deq
.len(), 4);
81 assert_eq
!(deq
[0].clone(), a
.clone());
82 assert_eq
!(deq
[1].clone(), b
.clone());
83 assert_eq
!(deq
[2].clone(), c
.clone());
84 assert_eq
!(deq
[3].clone(), d
.clone());
88 fn test_push_front_grow() {
89 let mut deq
= VecDeque
::new();
93 assert_eq
!(deq
.len(), 66);
96 assert_eq
!(deq
[i
], 65 - i
);
99 let mut deq
= VecDeque
::new();
105 assert_eq
!(deq
[i
], i
);
111 let mut deq
= VecDeque
::new();
115 assert_eq
!(deq
[1], 2);
120 fn test_index_out_of_bounds() {
121 let mut deq
= VecDeque
::new();
128 #[derive(Clone, PartialEq, Debug)]
132 Three(i32, i32, i32),
135 #[derive(Clone, PartialEq, Debug)]
142 #[derive(Clone, PartialEq, Debug)]
150 fn test_param_int() {
151 test_parameterized
::<i32>(5, 72, 64, 175);
155 fn test_param_taggy() {
156 test_parameterized
::<Taggy
>(One(1), Two(1, 2), Three(1, 2, 3), Two(17, 42));
160 fn test_param_taggypar() {
161 test_parameterized
::<Taggypar
<i32>>(Onepar
::<i32>(1),
163 Threepar
::<i32>(1, 2, 3),
164 Twopar
::<i32>(17, 42));
168 fn test_param_reccy() {
189 test_parameterized
::<RecCy
>(reccy1
, reccy2
, reccy3
, reccy4
);
193 fn test_with_capacity() {
194 let mut d
= VecDeque
::with_capacity(0);
196 assert_eq
!(d
.len(), 1);
197 let mut d
= VecDeque
::with_capacity(50);
199 assert_eq
!(d
.len(), 1);
203 fn test_with_capacity_non_power_two() {
204 let mut d3
= VecDeque
::with_capacity(3);
209 assert_eq
!(d3
.pop_front(), Some(1));
211 assert_eq
!(d3
.front(), None
);
218 assert_eq
!(d3
.pop_front(), Some(3));
220 // Pushing the lo past half way point to trigger
221 // the 'B' scenario for growth
228 // There used to be a bug here about how the
229 // VecDeque made growth assumptions about the
230 // underlying Vec which didn't hold and lead
232 // (Vec grows to next power of two)
233 // good- [9, 12, 15, X, X, X, X, |6]
234 // bug- [15, 12, X, X, X, |6, X, X]
235 assert_eq
!(d3
.pop_front(), Some(6));
237 // Which leads us to the following state which
238 // would be a failure case.
239 // bug- [15, 12, X, X, X, X, |X, X]
240 assert_eq
!(d3
.front(), Some(&9));
244 fn test_reserve_exact() {
245 let mut d
= VecDeque
::new();
248 assert
!(d
.capacity() >= 51);
253 let mut d
= VecDeque
::new();
256 assert
!(d
.capacity() >= 51);
261 let mut d
: VecDeque
<_
> = (0..5).collect();
264 assert_eq
!(d
.iter().cloned().collect
::<Vec
<_
>>(), [4, 2, 3, 1]);
269 let mut d
= VecDeque
::new();
270 assert_eq
!(d
.iter().next(), None
);
271 assert_eq
!(d
.iter().size_hint(), (0, Some(0)));
277 let b
: &[_
] = &[&0, &1, &2, &3, &4];
278 assert_eq
!(d
.iter().collect
::<Vec
<_
>>(), b
);
285 let b
: &[_
] = &[&8, &7, &6, &0, &1, &2, &3, &4];
286 assert_eq
!(d
.iter().collect
::<Vec
<_
>>(), b
);
289 let mut it
= d
.iter();
290 let mut len
= d
.len();
296 assert_eq
!(it
.size_hint(), (len
, Some(len
)))
304 let mut d
= VecDeque
::new();
305 assert_eq
!(d
.iter().rev().next(), None
);
311 let b
: &[_
] = &[&4, &3, &2, &1, &0];
312 assert_eq
!(d
.iter().rev().collect
::<Vec
<_
>>(), b
);
318 let b
: &[_
] = &[&4, &3, &2, &1, &0, &6, &7, &8];
319 assert_eq
!(d
.iter().rev().collect
::<Vec
<_
>>(), b
);
323 fn test_mut_rev_iter_wrap() {
324 let mut d
= VecDeque
::with_capacity(3);
325 assert
!(d
.iter_mut().rev().next().is_none());
330 assert_eq
!(d
.pop_front(), Some(1));
333 assert_eq
!(d
.iter_mut().rev().map(|x
| *x
).collect
::<Vec
<_
>>(),
339 let mut d
= VecDeque
::new();
340 assert
!(d
.iter_mut().next().is_none());
346 for (i
, elt
) in d
.iter_mut().enumerate() {
347 assert_eq
!(*elt
, 2 - i
);
352 let mut it
= d
.iter_mut();
353 assert_eq
!(*it
.next().unwrap(), 0);
354 assert_eq
!(*it
.next().unwrap(), 1);
355 assert_eq
!(*it
.next().unwrap(), 2);
356 assert
!(it
.next().is_none());
361 fn test_mut_rev_iter() {
362 let mut d
= VecDeque
::new();
363 assert
!(d
.iter_mut().rev().next().is_none());
369 for (i
, elt
) in d
.iter_mut().rev().enumerate() {
375 let mut it
= d
.iter_mut().rev();
376 assert_eq
!(*it
.next().unwrap(), 0);
377 assert_eq
!(*it
.next().unwrap(), 1);
378 assert_eq
!(*it
.next().unwrap(), 2);
379 assert
!(it
.next().is_none());
384 fn test_into_iter() {
388 let d
: VecDeque
<i32> = VecDeque
::new();
389 let mut iter
= d
.into_iter();
391 assert_eq
!(iter
.size_hint(), (0, Some(0)));
392 assert_eq
!(iter
.next(), None
);
393 assert_eq
!(iter
.size_hint(), (0, Some(0)));
398 let mut d
= VecDeque
::new();
403 let b
= vec
![0, 1, 2, 3, 4];
404 assert_eq
!(d
.into_iter().collect
::<Vec
<_
>>(), b
);
409 let mut d
= VecDeque
::new();
417 let b
= vec
![8, 7, 6, 0, 1, 2, 3, 4];
418 assert_eq
!(d
.into_iter().collect
::<Vec
<_
>>(), b
);
423 let mut d
= VecDeque
::new();
431 let mut it
= d
.into_iter();
432 assert_eq
!(it
.size_hint(), (8, Some(8)));
433 assert_eq
!(it
.next(), Some(8));
434 assert_eq
!(it
.size_hint(), (7, Some(7)));
435 assert_eq
!(it
.next_back(), Some(4));
436 assert_eq
!(it
.size_hint(), (6, Some(6)));
437 assert_eq
!(it
.next(), Some(7));
438 assert_eq
!(it
.size_hint(), (5, Some(5)));
447 let mut d
: VecDeque
<i32> = VecDeque
::new();
450 let mut iter
= d
.drain(..);
452 assert_eq
!(iter
.size_hint(), (0, Some(0)));
453 assert_eq
!(iter
.next(), None
);
454 assert_eq
!(iter
.size_hint(), (0, Some(0)));
457 assert
!(d
.is_empty());
462 let mut d
= VecDeque
::new();
467 assert_eq
!(d
.drain(..).collect
::<Vec
<_
>>(), [0, 1, 2, 3, 4]);
468 assert
!(d
.is_empty());
473 let mut d
= VecDeque
::new();
481 assert_eq
!(d
.drain(..).collect
::<Vec
<_
>>(), [8, 7, 6, 0, 1, 2, 3, 4]);
482 assert
!(d
.is_empty());
487 let mut d
: VecDeque
<_
> = VecDeque
::new();
496 let mut it
= d
.drain(..);
497 assert_eq
!(it
.size_hint(), (8, Some(8)));
498 assert_eq
!(it
.next(), Some(8));
499 assert_eq
!(it
.size_hint(), (7, Some(7)));
500 assert_eq
!(it
.next_back(), Some(4));
501 assert_eq
!(it
.size_hint(), (6, Some(6)));
502 assert_eq
!(it
.next(), Some(7));
503 assert_eq
!(it
.size_hint(), (5, Some(5)));
505 assert
!(d
.is_empty());
510 fn test_from_iter() {
511 let v
= vec
![1, 2, 3, 4, 5, 6, 7];
512 let deq
: VecDeque
<_
> = v
.iter().cloned().collect();
513 let u
: Vec
<_
> = deq
.iter().cloned().collect();
516 let seq
= (0..).step_by(2).take(256);
517 let deq
: VecDeque
<_
> = seq
.collect();
518 for (i
, &x
) in deq
.iter().enumerate() {
519 assert_eq
!(2 * i
, x
);
521 assert_eq
!(deq
.len(), 256);
526 let mut d
= VecDeque
::new();
531 assert_eq
!(d
.len(), 4);
532 let mut e
= d
.clone();
533 assert_eq
!(e
.len(), 4);
534 while !d
.is_empty() {
535 assert_eq
!(d
.pop_back(), e
.pop_back());
537 assert_eq
!(d
.len(), 0);
538 assert_eq
!(e
.len(), 0);
543 let mut d
= VecDeque
::new();
544 assert
!(d
== VecDeque
::with_capacity(0));
549 let mut e
= VecDeque
::with_capacity(0);
559 assert
!(e
== VecDeque
::new());
563 fn test_partial_eq_array() {
564 let d
= VecDeque
::<char>::new();
567 let mut d
= VecDeque
::new();
571 let mut d
= VecDeque
::new();
575 let mut d
= VecDeque
::new();
578 assert
!(d
== ['a'
, 'b'
]);
583 let mut x
= VecDeque
::new();
584 let mut y
= VecDeque
::new();
596 assert
!(::hash(&x
) == ::hash(&y
));
600 fn test_hash_after_rotation() {
601 // test that two deques hash equal even if elements are laid out differently
603 let mut ring
: VecDeque
<i32> = (0..len
as i32).collect();
604 let orig
= ring
.clone();
605 for _
in 0..ring
.capacity() {
606 // shift values 1 step to the right by pop, sub one, push
608 for elt
in &mut ring
{
611 ring
.push_back(len
- 1);
612 assert_eq
!(::hash(&orig
), ::hash(&ring
));
613 assert_eq
!(orig
, ring
);
614 assert_eq
!(ring
, orig
);
619 fn test_eq_after_rotation() {
620 // test that two deques are equal even if elements are laid out differently
622 let mut ring
: VecDeque
<i32> = (0..len
as i32).collect();
623 let mut shifted
= ring
.clone();
625 // shift values 1 step to the right by pop, sub one, push
627 for elt
in &mut ring
{
630 ring
.push_back(len
- 1);
634 for _
in 0..shifted
.capacity() {
636 for elt
in &mut shifted
{
639 shifted
.push_back(len
- 1);
640 assert_eq
!(shifted
, ring
);
641 assert_eq
!(ring
, shifted
);
647 let x
= VecDeque
::new();
648 let mut y
= VecDeque
::new();
660 let ringbuf
: VecDeque
<_
> = (0..10).collect();
661 assert_eq
!(format
!("{:?}", ringbuf
), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
663 let ringbuf
: VecDeque
<_
> = vec
!["just", "one", "test", "more"]
667 assert_eq
!(format
!("{:?}", ringbuf
),
668 "[\"just\", \"one\", \"test\", \"more\"]");
673 static mut DROPS
: i32 = 0;
683 let mut ring
= VecDeque
::new();
684 ring
.push_back(Elem
);
685 ring
.push_front(Elem
);
686 ring
.push_back(Elem
);
687 ring
.push_front(Elem
);
690 assert_eq
!(unsafe { DROPS }
, 4);
694 fn test_drop_with_pop() {
695 static mut DROPS
: i32 = 0;
705 let mut ring
= VecDeque
::new();
706 ring
.push_back(Elem
);
707 ring
.push_front(Elem
);
708 ring
.push_back(Elem
);
709 ring
.push_front(Elem
);
711 drop(ring
.pop_back());
712 drop(ring
.pop_front());
713 assert_eq
!(unsafe { DROPS }
, 2);
716 assert_eq
!(unsafe { DROPS }
, 4);
720 fn test_drop_clear() {
721 static mut DROPS
: i32 = 0;
731 let mut ring
= VecDeque
::new();
732 ring
.push_back(Elem
);
733 ring
.push_front(Elem
);
734 ring
.push_back(Elem
);
735 ring
.push_front(Elem
);
737 assert_eq
!(unsafe { DROPS }
, 4);
740 assert_eq
!(unsafe { DROPS }
, 4);
744 fn test_reserve_grow() {
745 // test growth path A
746 // [T o o H] -> [T o o H . . . . ]
747 let mut ring
= VecDeque
::with_capacity(4);
753 assert_eq
!(ring
.pop_front(), Some(i
));
756 // test growth path B
757 // [H T o o] -> [. T o o H . . . ]
758 let mut ring
= VecDeque
::with_capacity(4);
761 assert_eq
!(ring
.pop_front(), Some(i
));
768 assert_eq
!(ring
.pop_front(), Some(i
));
771 // test growth path C
772 // [o o H T] -> [o o H . . . . T ]
773 let mut ring
= VecDeque
::with_capacity(4);
776 assert_eq
!(ring
.pop_front(), Some(i
));
783 assert_eq
!(ring
.pop_front(), Some(i
));
789 let mut ring
= VecDeque
::new();
791 assert_eq
!(ring
.get(0), Some(&0));
792 assert_eq
!(ring
.get(1), None
);
795 assert_eq
!(ring
.get(0), Some(&0));
796 assert_eq
!(ring
.get(1), Some(&1));
797 assert_eq
!(ring
.get(2), None
);
800 assert_eq
!(ring
.get(0), Some(&0));
801 assert_eq
!(ring
.get(1), Some(&1));
802 assert_eq
!(ring
.get(2), Some(&2));
803 assert_eq
!(ring
.get(3), None
);
805 assert_eq
!(ring
.pop_front(), Some(0));
806 assert_eq
!(ring
.get(0), Some(&1));
807 assert_eq
!(ring
.get(1), Some(&2));
808 assert_eq
!(ring
.get(2), None
);
810 assert_eq
!(ring
.pop_front(), Some(1));
811 assert_eq
!(ring
.get(0), Some(&2));
812 assert_eq
!(ring
.get(1), None
);
814 assert_eq
!(ring
.pop_front(), Some(2));
815 assert_eq
!(ring
.get(0), None
);
816 assert_eq
!(ring
.get(1), None
);
821 let mut ring
= VecDeque
::new();
826 match ring
.get_mut(1) {
831 assert_eq
!(ring
.get_mut(0), Some(&mut 0));
832 assert_eq
!(ring
.get_mut(1), Some(&mut -1));
833 assert_eq
!(ring
.get_mut(2), Some(&mut 2));
834 assert_eq
!(ring
.get_mut(3), None
);
836 assert_eq
!(ring
.pop_front(), Some(0));
837 assert_eq
!(ring
.get_mut(0), Some(&mut -1));
838 assert_eq
!(ring
.get_mut(1), Some(&mut 2));
839 assert_eq
!(ring
.get_mut(2), None
);
844 let mut ring
= VecDeque
::new();
847 assert_eq
!(ring
.front(), Some(&10));
849 assert_eq
!(ring
.front(), Some(&20));
851 assert_eq
!(ring
.front(), None
);
855 fn test_as_slices() {
856 let mut ring
: VecDeque
<i32> = VecDeque
::with_capacity(127);
857 let cap
= ring
.capacity() as i32;
859 let last
= cap
- first
;
863 let (left
, right
) = ring
.as_slices();
864 let expected
: Vec
<_
> = (0..i
+ 1).collect();
865 assert_eq
!(left
, &expected
[..]);
866 assert_eq
!(right
, []);
871 let (left
, right
) = ring
.as_slices();
872 let expected_left
: Vec
<_
> = (-last
..j
+ 1).rev().collect();
873 let expected_right
: Vec
<_
> = (0..first
).collect();
874 assert_eq
!(left
, &expected_left
[..]);
875 assert_eq
!(right
, &expected_right
[..]);
878 assert_eq
!(ring
.len() as i32, cap
);
879 assert_eq
!(ring
.capacity() as i32, cap
);
883 fn test_as_mut_slices() {
884 let mut ring
: VecDeque
<i32> = VecDeque
::with_capacity(127);
885 let cap
= ring
.capacity() as i32;
887 let last
= cap
- first
;
891 let (left
, right
) = ring
.as_mut_slices();
892 let expected
: Vec
<_
> = (0..i
+ 1).collect();
893 assert_eq
!(left
, &expected
[..]);
894 assert_eq
!(right
, []);
899 let (left
, right
) = ring
.as_mut_slices();
900 let expected_left
: Vec
<_
> = (-last
..j
+ 1).rev().collect();
901 let expected_right
: Vec
<_
> = (0..first
).collect();
902 assert_eq
!(left
, &expected_left
[..]);
903 assert_eq
!(right
, &expected_right
[..]);
906 assert_eq
!(ring
.len() as i32, cap
);
907 assert_eq
!(ring
.capacity() as i32, cap
);
912 let mut a
: VecDeque
<_
> = vec
![1, 2, 3].into_iter().collect();
913 let mut b
: VecDeque
<_
> = vec
![4, 5, 6].into_iter().collect();
917 assert_eq
!(a
.iter().cloned().collect
::<Vec
<_
>>(), [1, 2, 3, 4, 5, 6]);
918 assert_eq
!(b
.iter().cloned().collect
::<Vec
<_
>>(), []);
920 // append nothing to something
922 assert_eq
!(a
.iter().cloned().collect
::<Vec
<_
>>(), [1, 2, 3, 4, 5, 6]);
923 assert_eq
!(b
.iter().cloned().collect
::<Vec
<_
>>(), []);
925 // append something to nothing
927 assert_eq
!(b
.iter().cloned().collect
::<Vec
<_
>>(), [1, 2, 3, 4, 5, 6]);
928 assert_eq
!(a
.iter().cloned().collect
::<Vec
<_
>>(), []);
932 fn test_append_permutations() {
933 fn construct_vec_deque(
938 ) -> VecDeque
<usize> {
939 let mut out
= VecDeque
::new();
940 for a
in 0..push_back
{
943 for b
in 0..push_front
{
944 out
.push_front(push_back
+ b
);
946 for _
in 0..pop_back
{
949 for _
in 0..pop_front
{
955 const MAX
: usize = 5;
957 // Many different permutations of both the `VecDeque` getting appended to
958 // and the one getting appended are generated to check `append`.
959 // This ensures all 6 code paths of `append` are tested.
960 for src_push_back
in 0..MAX
{
961 for src_push_front
in 0..MAX
{
962 // doesn't pop more values than are pushed
963 for src_pop_back
in 0..(src_push_back
+ src_push_front
) {
964 for src_pop_front
in 0..(src_push_back
+ src_push_front
- src_pop_back
) {
966 let src
= construct_vec_deque(
973 for dst_push_back
in 0..MAX
{
974 for dst_push_front
in 0..MAX
{
975 for dst_pop_back
in 0..(dst_push_back
+ dst_push_front
) {
977 in 0..(dst_push_back
+ dst_push_front
- dst_pop_back
)
979 let mut dst
= construct_vec_deque(
985 let mut src
= src
.clone();
987 // Assert that appending `src` to `dst` gives the same order
988 // of values as iterating over both in sequence.
993 .collect
::<Vec
<usize>>();
994 dst
.append(&mut src
);
995 assert_eq
!(dst
, correct
);
996 assert
!(src
.is_empty());
1007 struct DropCounter
<'a
> {
1011 impl<'a
> Drop
for DropCounter
<'a
> {
1012 fn drop(&mut self) {
1018 fn test_append_double_drop() {
1019 let (mut count_a
, mut count_b
) = (0, 0);
1021 let mut a
= VecDeque
::new();
1022 let mut b
= VecDeque
::new();
1023 a
.push_back(DropCounter { count: &mut count_a }
);
1024 b
.push_back(DropCounter { count: &mut count_b }
);
1028 assert_eq
!(count_a
, 1);
1029 assert_eq
!(count_b
, 1);
1034 let mut buf
= VecDeque
::new();
1036 buf
.retain(|&x
| x
% 2 == 0);
1037 let v
: Vec
<_
> = buf
.into_iter().collect();
1038 assert_eq
!(&v
[..], &[2, 4]);
1042 fn test_extend_ref() {
1043 let mut v
= VecDeque
::new();
1045 v
.extend(&[2, 3, 4]);
1047 assert_eq
!(v
.len(), 4);
1048 assert_eq
!(v
[0], 1);
1049 assert_eq
!(v
[1], 2);
1050 assert_eq
!(v
[2], 3);
1051 assert_eq
!(v
[3], 4);
1053 let mut w
= VecDeque
::new();
1058 assert_eq
!(v
.len(), 6);
1059 assert_eq
!(v
[0], 1);
1060 assert_eq
!(v
[1], 2);
1061 assert_eq
!(v
[2], 3);
1062 assert_eq
!(v
[3], 4);
1063 assert_eq
!(v
[4], 5);
1064 assert_eq
!(v
[5], 6);
1068 fn test_contains() {
1069 let mut v
= VecDeque
::new();
1070 v
.extend(&[2, 3, 4]);
1072 assert
!(v
.contains(&3));
1073 assert
!(!v
.contains(&1));
1077 assert
!(!v
.contains(&3));
1081 fn assert_covariance() {
1082 fn drain
<'new
>(d
: Drain
<'
static, &'
static str>) -> Drain
<'new
, &'new
str> {
1088 fn test_is_empty() {
1089 let mut v
= VecDeque
::<i32>::new();
1090 assert
!(v
.is_empty());
1091 assert
!(v
.iter().is_empty());
1092 assert
!(v
.iter_mut().is_empty());
1093 v
.extend(&[2, 3, 4]);
1094 assert
!(!v
.is_empty());
1095 assert
!(!v
.iter().is_empty());
1096 assert
!(!v
.iter_mut().is_empty());
1097 while let Some(_
) = v
.pop_front() {
1098 assert_eq
!(v
.is_empty(), v
.len() == 0);
1099 assert_eq
!(v
.iter().is_empty(), v
.iter().len() == 0);
1100 assert_eq
!(v
.iter_mut().is_empty(), v
.iter_mut().len() == 0);
1102 assert
!(v
.is_empty());
1103 assert
!(v
.iter().is_empty());
1104 assert
!(v
.iter_mut().is_empty());
1105 assert
!(v
.into_iter().is_empty());
1109 fn test_reserve_exact_2() {
1110 // This is all the same as test_reserve
1112 let mut v
= VecDeque
::new();
1115 assert
!(v
.capacity() >= 2);
1121 assert
!(v
.capacity() >= 16);
1122 v
.reserve_exact(16);
1123 assert
!(v
.capacity() >= 32);
1127 v
.reserve_exact(16);
1128 assert
!(v
.capacity() >= 48)
1132 fn test_try_reserve() {
1134 // These are the interesting cases:
1135 // * exactly isize::MAX should never trigger a CapacityOverflow (can be OOM)
1136 // * > isize::MAX should always fail
1137 // * On 16/32-bit should CapacityOverflow
1138 // * On 64-bit should OOM
1139 // * overflow may trigger when adding `len` to `cap` (in number of elements)
1140 // * overflow may trigger when multiplying `new_cap` by size_of::<T> (to get bytes)
1142 const MAX_CAP
: usize = (isize::MAX
as usize + 1) / 2 - 1;
1143 const MAX_USIZE
: usize = usize::MAX
;
1145 // On 16/32-bit, we check that allocations don't exceed isize::MAX,
1146 // on 64-bit, we assume the OS will give an OOM for such a ridiculous size.
1147 // Any platform that succeeds for these requests is technically broken with
1148 // ptr::offset because LLVM is the worst.
1149 let guards_against_isize
= size_of
::<usize>() < 8;
1152 // Note: basic stuff is checked by test_reserve
1153 let mut empty_bytes
: VecDeque
<u8> = VecDeque
::new();
1155 // Check isize::MAX doesn't count as an overflow
1156 if let Err(CapacityOverflow
) = empty_bytes
.try_reserve(MAX_CAP
) {
1157 panic
!("isize::MAX shouldn't trigger an overflow!");
1159 // Play it again, frank! (just to be sure)
1160 if let Err(CapacityOverflow
) = empty_bytes
.try_reserve(MAX_CAP
) {
1161 panic
!("isize::MAX shouldn't trigger an overflow!");
1164 if guards_against_isize
{
1165 // Check isize::MAX + 1 does count as overflow
1166 if let Err(CapacityOverflow
) = empty_bytes
.try_reserve(MAX_CAP
+ 1) {
1167 } else { panic!("isize::MAX + 1 should trigger an overflow!") }
1169 // Check usize::MAX does count as overflow
1170 if let Err(CapacityOverflow
) = empty_bytes
.try_reserve(MAX_USIZE
) {
1171 } else { panic!("usize::MAX should trigger an overflow!") }
1173 // Check isize::MAX is an OOM
1174 // VecDeque starts with capacity 7, always adds 1 to the capacity
1175 // and also rounds the number to next power of 2 so this is the
1176 // furthest we can go without triggering CapacityOverflow
1177 if let Err(AllocErr
) = empty_bytes
.try_reserve(MAX_CAP
) {
1178 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1184 // Same basic idea, but with non-zero len
1185 let mut ten_bytes
: VecDeque
<u8> = vec
![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1187 if let Err(CapacityOverflow
) = ten_bytes
.try_reserve(MAX_CAP
- 10) {
1188 panic
!("isize::MAX shouldn't trigger an overflow!");
1190 if let Err(CapacityOverflow
) = ten_bytes
.try_reserve(MAX_CAP
- 10) {
1191 panic
!("isize::MAX shouldn't trigger an overflow!");
1193 if guards_against_isize
{
1194 if let Err(CapacityOverflow
) = ten_bytes
.try_reserve(MAX_CAP
- 9) {
1195 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1197 if let Err(AllocErr
) = ten_bytes
.try_reserve(MAX_CAP
- 9) {
1198 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1200 // Should always overflow in the add-to-len
1201 if let Err(CapacityOverflow
) = ten_bytes
.try_reserve(MAX_USIZE
) {
1202 } else { panic!("usize::MAX should trigger an overflow!") }
1207 // Same basic idea, but with interesting type size
1208 let mut ten_u32s
: VecDeque
<u32> = vec
![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1210 if let Err(CapacityOverflow
) = ten_u32s
.try_reserve(MAX_CAP
/4 - 10) {
1211 panic
!("isize::MAX shouldn't trigger an overflow!");
1213 if let Err(CapacityOverflow
) = ten_u32s
.try_reserve(MAX_CAP
/4 - 10) {
1214 panic
!("isize::MAX shouldn't trigger an overflow!");
1216 if guards_against_isize
{
1217 if let Err(CapacityOverflow
) = ten_u32s
.try_reserve(MAX_CAP
/4 - 9) {
1218 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1220 if let Err(AllocErr
) = ten_u32s
.try_reserve(MAX_CAP
/4 - 9) {
1221 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1223 // Should fail in the mul-by-size
1224 if let Err(CapacityOverflow
) = ten_u32s
.try_reserve(MAX_USIZE
- 20) {
1226 panic
!("usize::MAX should trigger an overflow!");
1233 fn test_try_reserve_exact() {
1235 // This is exactly the same as test_try_reserve with the method changed.
1236 // See that test for comments.
1238 const MAX_CAP
: usize = (isize::MAX
as usize + 1) / 2 - 1;
1239 const MAX_USIZE
: usize = usize::MAX
;
1241 let guards_against_isize
= size_of
::<usize>() < 8;
1244 let mut empty_bytes
: VecDeque
<u8> = VecDeque
::new();
1246 if let Err(CapacityOverflow
) = empty_bytes
.try_reserve_exact(MAX_CAP
) {
1247 panic
!("isize::MAX shouldn't trigger an overflow!");
1249 if let Err(CapacityOverflow
) = empty_bytes
.try_reserve_exact(MAX_CAP
) {
1250 panic
!("isize::MAX shouldn't trigger an overflow!");
1253 if guards_against_isize
{
1254 if let Err(CapacityOverflow
) = empty_bytes
.try_reserve_exact(MAX_CAP
+ 1) {
1255 } else { panic!("isize::MAX + 1 should trigger an overflow!") }
1257 if let Err(CapacityOverflow
) = empty_bytes
.try_reserve_exact(MAX_USIZE
) {
1258 } else { panic!("usize::MAX should trigger an overflow!") }
1260 // Check isize::MAX is an OOM
1261 // VecDeque starts with capacity 7, always adds 1 to the capacity
1262 // and also rounds the number to next power of 2 so this is the
1263 // furthest we can go without triggering CapacityOverflow
1264 if let Err(AllocErr
) = empty_bytes
.try_reserve_exact(MAX_CAP
) {
1265 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1271 let mut ten_bytes
: VecDeque
<u8> = vec
![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1273 if let Err(CapacityOverflow
) = ten_bytes
.try_reserve_exact(MAX_CAP
- 10) {
1274 panic
!("isize::MAX shouldn't trigger an overflow!");
1276 if let Err(CapacityOverflow
) = ten_bytes
.try_reserve_exact(MAX_CAP
- 10) {
1277 panic
!("isize::MAX shouldn't trigger an overflow!");
1279 if guards_against_isize
{
1280 if let Err(CapacityOverflow
) = ten_bytes
.try_reserve_exact(MAX_CAP
- 9) {
1281 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1283 if let Err(AllocErr
) = ten_bytes
.try_reserve_exact(MAX_CAP
- 9) {
1284 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1286 if let Err(CapacityOverflow
) = ten_bytes
.try_reserve_exact(MAX_USIZE
) {
1287 } else { panic!("usize::MAX should trigger an overflow!") }
1292 let mut ten_u32s
: VecDeque
<u32> = vec
![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter().collect();
1294 if let Err(CapacityOverflow
) = ten_u32s
.try_reserve_exact(MAX_CAP
/4 - 10) {
1295 panic
!("isize::MAX shouldn't trigger an overflow!");
1297 if let Err(CapacityOverflow
) = ten_u32s
.try_reserve_exact(MAX_CAP
/4 - 10) {
1298 panic
!("isize::MAX shouldn't trigger an overflow!");
1300 if guards_against_isize
{
1301 if let Err(CapacityOverflow
) = ten_u32s
.try_reserve_exact(MAX_CAP
/4 - 9) {
1302 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1304 if let Err(AllocErr
) = ten_u32s
.try_reserve_exact(MAX_CAP
/4 - 9) {
1305 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1307 if let Err(CapacityOverflow
) = ten_u32s
.try_reserve_exact(MAX_USIZE
- 20) {
1308 } else { panic!("usize::MAX should trigger an overflow!") }