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;
18 use self::Taggypar::*;
22 let mut d = VecDeque::new();
23 assert_eq!(d.len(), 0);
27 assert_eq!(d.len(), 3);
29 assert_eq!(d.len(), 4);
30 assert_eq!(*d.front().unwrap(), 42);
31 assert_eq!(*d.back().unwrap(), 137);
32 let mut i = d.pop_front();
33 assert_eq!(i, Some(42));
35 assert_eq!(i, Some(137));
37 assert_eq!(i, Some(137));
39 assert_eq!(i, Some(17));
40 assert_eq!(d.len(), 0);
42 assert_eq!(d.len(), 1);
44 assert_eq!(d.len(), 2);
46 assert_eq!(d.len(), 3);
48 assert_eq!(d.len(), 4);
56 fn test_parameterized<T: Clone + PartialEq + Debug>(a: T, b: T, c: T, d: T) {
57 let mut deq = VecDeque::new();
58 assert_eq!(deq.len(), 0);
59 deq.push_front(a.clone());
60 deq.push_front(b.clone());
61 deq.push_back(c.clone());
62 assert_eq!(deq.len(), 3);
63 deq.push_back(d.clone());
64 assert_eq!(deq.len(), 4);
65 assert_eq!((*deq.front().unwrap()).clone(), b.clone());
66 assert_eq!((*deq.back().unwrap()).clone(), d.clone());
67 assert_eq!(deq.pop_front().unwrap(), b.clone());
68 assert_eq!(deq.pop_back().unwrap(), d.clone());
69 assert_eq!(deq.pop_back().unwrap(), c.clone());
70 assert_eq!(deq.pop_back().unwrap(), a.clone());
71 assert_eq!(deq.len(), 0);
72 deq.push_back(c.clone());
73 assert_eq!(deq.len(), 1);
74 deq.push_front(b.clone());
75 assert_eq!(deq.len(), 2);
76 deq.push_back(d.clone());
77 assert_eq!(deq.len(), 3);
78 deq.push_front(a.clone());
79 assert_eq!(deq.len(), 4);
80 assert_eq!(deq[0].clone(), a.clone());
81 assert_eq!(deq[1].clone(), b.clone());
82 assert_eq!(deq[2].clone(), c.clone());
83 assert_eq!(deq[3].clone(), d.clone());
87 fn test_push_front_grow() {
88 let mut deq = VecDeque::new();
92 assert_eq!(deq.len(), 66);
95 assert_eq!(deq[i], 65 - i);
98 let mut deq = VecDeque::new();
104 assert_eq!(deq[i], i);
110 let mut deq = VecDeque::new();
114 assert_eq!(deq[1], 2);
119 fn test_index_out_of_bounds() {
120 let mut deq = VecDeque::new();
128 fn bench_new(b: &mut test::Bencher) {
130 let ring: VecDeque<i32> = VecDeque::new();
131 test::black_box(ring);
136 fn bench_grow_1025(b: &mut test::Bencher) {
138 let mut deq = VecDeque::new();
142 test::black_box(deq);
147 fn bench_iter_1000(b: &mut test::Bencher) {
148 let ring: VecDeque<_> = (0..1000).collect();
155 test::black_box(sum);
160 fn bench_mut_iter_1000(b: &mut test::Bencher) {
161 let mut ring: VecDeque<_> = (0..1000).collect();
168 test::black_box(sum);
172 #[derive(Clone, PartialEq, Debug)]
176 Three(i32, i32, i32),
179 #[derive(Clone, PartialEq, Debug)]
186 #[derive(Clone, PartialEq, Debug)]
194 fn test_param_int() {
195 test_parameterized::<i32>(5, 72, 64, 175);
199 fn test_param_taggy() {
200 test_parameterized::<Taggy>(One(1), Two(1, 2), Three(1, 2, 3), Two(17, 42));
204 fn test_param_taggypar() {
205 test_parameterized::<Taggypar<i32>>(Onepar::<i32>(1),
207 Threepar::<i32>(1, 2, 3),
208 Twopar::<i32>(17, 42));
212 fn test_param_reccy() {
233 test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
237 fn test_with_capacity() {
238 let mut d = VecDeque::with_capacity(0);
240 assert_eq!(d.len(), 1);
241 let mut d = VecDeque::with_capacity(50);
243 assert_eq!(d.len(), 1);
247 fn test_with_capacity_non_power_two() {
248 let mut d3 = VecDeque::with_capacity(3);
253 assert_eq!(d3.pop_front(), Some(1));
255 assert_eq!(d3.front(), None);
262 assert_eq!(d3.pop_front(), Some(3));
264 // Pushing the lo past half way point to trigger
265 // the 'B' scenario for growth
272 // There used to be a bug here about how the
273 // VecDeque made growth assumptions about the
274 // underlying Vec which didn't hold and lead
276 // (Vec grows to next power of two)
277 // good- [9, 12, 15, X, X, X, X, |6]
278 // bug- [15, 12, X, X, X, |6, X, X]
279 assert_eq!(d3.pop_front(), Some(6));
281 // Which leads us to the following state which
282 // would be a failure case.
283 // bug- [15, 12, X, X, X, X, |X, X]
284 assert_eq!(d3.front(), Some(&9));
288 fn test_reserve_exact() {
289 let mut d = VecDeque::new();
292 assert!(d.capacity() >= 51);
297 let mut d = VecDeque::new();
300 assert!(d.capacity() >= 51);
305 let mut d: VecDeque<_> = (0..5).collect();
308 assert_eq!(d.iter().cloned().collect::<Vec<_>>(), [4, 2, 3, 1]);
313 let mut d = VecDeque::new();
314 assert_eq!(d.iter().next(), None);
315 assert_eq!(d.iter().size_hint(), (0, Some(0)));
321 let b: &[_] = &[&0, &1, &2, &3, &4];
322 assert_eq!(d.iter().collect::<Vec<_>>(), b);
329 let b: &[_] = &[&8, &7, &6, &0, &1, &2, &3, &4];
330 assert_eq!(d.iter().collect::<Vec<_>>(), b);
333 let mut it = d.iter();
334 let mut len = d.len();
340 assert_eq!(it.size_hint(), (len, Some(len)))
348 let mut d = VecDeque::new();
349 assert_eq!(d.iter().rev().next(), None);
355 let b: &[_] = &[&4, &3, &2, &1, &0];
356 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
362 let b: &[_] = &[&4, &3, &2, &1, &0, &6, &7, &8];
363 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
367 fn test_mut_rev_iter_wrap() {
368 let mut d = VecDeque::with_capacity(3);
369 assert!(d.iter_mut().rev().next().is_none());
374 assert_eq!(d.pop_front(), Some(1));
377 assert_eq!(d.iter_mut().rev().map(|x| *x).collect::<Vec<_>>(),
383 let mut d = VecDeque::new();
384 assert!(d.iter_mut().next().is_none());
390 for (i, elt) in d.iter_mut().enumerate() {
391 assert_eq!(*elt, 2 - i);
396 let mut it = d.iter_mut();
397 assert_eq!(*it.next().unwrap(), 0);
398 assert_eq!(*it.next().unwrap(), 1);
399 assert_eq!(*it.next().unwrap(), 2);
400 assert!(it.next().is_none());
405 fn test_mut_rev_iter() {
406 let mut d = VecDeque::new();
407 assert!(d.iter_mut().rev().next().is_none());
413 for (i, elt) in d.iter_mut().rev().enumerate() {
419 let mut it = d.iter_mut().rev();
420 assert_eq!(*it.next().unwrap(), 0);
421 assert_eq!(*it.next().unwrap(), 1);
422 assert_eq!(*it.next().unwrap(), 2);
423 assert!(it.next().is_none());
428 fn test_into_iter() {
432 let d: VecDeque<i32> = VecDeque::new();
433 let mut iter = d.into_iter();
435 assert_eq!(iter.size_hint(), (0, Some(0)));
436 assert_eq!(iter.next(), None);
437 assert_eq!(iter.size_hint(), (0, Some(0)));
442 let mut d = VecDeque::new();
447 let b = vec![0, 1, 2, 3, 4];
448 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
453 let mut d = VecDeque::new();
461 let b = vec![8, 7, 6, 0, 1, 2, 3, 4];
462 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
467 let mut d = VecDeque::new();
475 let mut it = d.into_iter();
476 assert_eq!(it.size_hint(), (8, Some(8)));
477 assert_eq!(it.next(), Some(8));
478 assert_eq!(it.size_hint(), (7, Some(7)));
479 assert_eq!(it.next_back(), Some(4));
480 assert_eq!(it.size_hint(), (6, Some(6)));
481 assert_eq!(it.next(), Some(7));
482 assert_eq!(it.size_hint(), (5, Some(5)));
491 let mut d: VecDeque<i32> = VecDeque::new();
494 let mut iter = d.drain(..);
496 assert_eq!(iter.size_hint(), (0, Some(0)));
497 assert_eq!(iter.next(), None);
498 assert_eq!(iter.size_hint(), (0, Some(0)));
501 assert!(d.is_empty());
506 let mut d = VecDeque::new();
511 assert_eq!(d.drain(..).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
512 assert!(d.is_empty());
517 let mut d = VecDeque::new();
525 assert_eq!(d.drain(..).collect::<Vec<_>>(), [8, 7, 6, 0, 1, 2, 3, 4]);
526 assert!(d.is_empty());
531 let mut d: VecDeque<_> = VecDeque::new();
540 let mut it = d.drain(..);
541 assert_eq!(it.size_hint(), (8, Some(8)));
542 assert_eq!(it.next(), Some(8));
543 assert_eq!(it.size_hint(), (7, Some(7)));
544 assert_eq!(it.next_back(), Some(4));
545 assert_eq!(it.size_hint(), (6, Some(6)));
546 assert_eq!(it.next(), Some(7));
547 assert_eq!(it.size_hint(), (5, Some(5)));
549 assert!(d.is_empty());
554 fn test_from_iter() {
555 let v = vec![1, 2, 3, 4, 5, 6, 7];
556 let deq: VecDeque<_> = v.iter().cloned().collect();
557 let u: Vec<_> = deq.iter().cloned().collect();
560 let seq = (0..).step_by(2).take(256);
561 let deq: VecDeque<_> = seq.collect();
562 for (i, &x) in deq.iter().enumerate() {
563 assert_eq!(2 * i, x);
565 assert_eq!(deq.len(), 256);
570 let mut d = VecDeque::new();
575 assert_eq!(d.len(), 4);
576 let mut e = d.clone();
577 assert_eq!(e.len(), 4);
578 while !d.is_empty() {
579 assert_eq!(d.pop_back(), e.pop_back());
581 assert_eq!(d.len(), 0);
582 assert_eq!(e.len(), 0);
587 let mut d = VecDeque::new();
588 assert!(d == VecDeque::with_capacity(0));
593 let mut e = VecDeque::with_capacity(0);
603 assert!(e == VecDeque::new());
607 fn test_partial_eq_array() {
608 let d = VecDeque::<char>::new();
611 let mut d = VecDeque::new();
615 let mut d = VecDeque::new();
619 let mut d = VecDeque::new();
622 assert!(d == ['a', 'b']);
627 let mut x = VecDeque::new();
628 let mut y = VecDeque::new();
640 assert!(::hash(&x) == ::hash(&y));
644 fn test_hash_after_rotation() {
645 // test that two deques hash equal even if elements are laid out differently
647 let mut ring: VecDeque<i32> = (0..len as i32).collect();
648 let orig = ring.clone();
649 for _ in 0..ring.capacity() {
650 // shift values 1 step to the right by pop, sub one, push
652 for elt in &mut ring {
655 ring.push_back(len - 1);
656 assert_eq!(::hash(&orig), ::hash(&ring));
657 assert_eq!(orig, ring);
658 assert_eq!(ring, orig);
663 fn test_eq_after_rotation() {
664 // test that two deques are equal even if elements are laid out differently
666 let mut ring: VecDeque<i32> = (0..len as i32).collect();
667 let mut shifted = ring.clone();
669 // shift values 1 step to the right by pop, sub one, push
671 for elt in &mut ring {
674 ring.push_back(len - 1);
678 for _ in 0..shifted.capacity() {
680 for elt in &mut shifted {
683 shifted.push_back(len - 1);
684 assert_eq!(shifted, ring);
685 assert_eq!(ring, shifted);
691 let x = VecDeque::new();
692 let mut y = VecDeque::new();
704 let ringbuf: VecDeque<_> = (0..10).collect();
705 assert_eq!(format!("{:?}", ringbuf), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
707 let ringbuf: VecDeque<_> = vec!["just", "one", "test", "more"]
711 assert_eq!(format!("{:?}", ringbuf),
712 "[\"just\", \"one\", \"test\", \"more\"]");
717 static mut DROPS: i32 = 0;
727 let mut ring = VecDeque::new();
728 ring.push_back(Elem);
729 ring.push_front(Elem);
730 ring.push_back(Elem);
731 ring.push_front(Elem);
734 assert_eq!(unsafe { DROPS }, 4);
738 fn test_drop_with_pop() {
739 static mut DROPS: i32 = 0;
749 let mut ring = VecDeque::new();
750 ring.push_back(Elem);
751 ring.push_front(Elem);
752 ring.push_back(Elem);
753 ring.push_front(Elem);
755 drop(ring.pop_back());
756 drop(ring.pop_front());
757 assert_eq!(unsafe { DROPS }, 2);
760 assert_eq!(unsafe { DROPS }, 4);
764 fn test_drop_clear() {
765 static mut DROPS: i32 = 0;
775 let mut ring = VecDeque::new();
776 ring.push_back(Elem);
777 ring.push_front(Elem);
778 ring.push_back(Elem);
779 ring.push_front(Elem);
781 assert_eq!(unsafe { DROPS }, 4);
784 assert_eq!(unsafe { DROPS }, 4);
788 fn test_reserve_grow() {
789 // test growth path A
790 // [T o o H] -> [T o o H . . . . ]
791 let mut ring = VecDeque::with_capacity(4);
797 assert_eq!(ring.pop_front(), Some(i));
800 // test growth path B
801 // [H T o o] -> [. T o o H . . . ]
802 let mut ring = VecDeque::with_capacity(4);
805 assert_eq!(ring.pop_front(), Some(i));
812 assert_eq!(ring.pop_front(), Some(i));
815 // test growth path C
816 // [o o H T] -> [o o H . . . . T ]
817 let mut ring = VecDeque::with_capacity(4);
820 assert_eq!(ring.pop_front(), Some(i));
827 assert_eq!(ring.pop_front(), Some(i));
833 let mut ring = VecDeque::new();
835 assert_eq!(ring.get(0), Some(&0));
836 assert_eq!(ring.get(1), None);
839 assert_eq!(ring.get(0), Some(&0));
840 assert_eq!(ring.get(1), Some(&1));
841 assert_eq!(ring.get(2), None);
844 assert_eq!(ring.get(0), Some(&0));
845 assert_eq!(ring.get(1), Some(&1));
846 assert_eq!(ring.get(2), Some(&2));
847 assert_eq!(ring.get(3), None);
849 assert_eq!(ring.pop_front(), Some(0));
850 assert_eq!(ring.get(0), Some(&1));
851 assert_eq!(ring.get(1), Some(&2));
852 assert_eq!(ring.get(2), None);
854 assert_eq!(ring.pop_front(), Some(1));
855 assert_eq!(ring.get(0), Some(&2));
856 assert_eq!(ring.get(1), None);
858 assert_eq!(ring.pop_front(), Some(2));
859 assert_eq!(ring.get(0), None);
860 assert_eq!(ring.get(1), None);
865 let mut ring = VecDeque::new();
870 match ring.get_mut(1) {
875 assert_eq!(ring.get_mut(0), Some(&mut 0));
876 assert_eq!(ring.get_mut(1), Some(&mut -1));
877 assert_eq!(ring.get_mut(2), Some(&mut 2));
878 assert_eq!(ring.get_mut(3), None);
880 assert_eq!(ring.pop_front(), Some(0));
881 assert_eq!(ring.get_mut(0), Some(&mut -1));
882 assert_eq!(ring.get_mut(1), Some(&mut 2));
883 assert_eq!(ring.get_mut(2), None);
888 let mut ring = VecDeque::new();
891 assert_eq!(ring.front(), Some(&10));
893 assert_eq!(ring.front(), Some(&20));
895 assert_eq!(ring.front(), None);
899 fn test_as_slices() {
900 let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
901 let cap = ring.capacity() as i32;
903 let last = cap - first;
907 let (left, right) = ring.as_slices();
908 let expected: Vec<_> = (0..i + 1).collect();
909 assert_eq!(left, &expected[..]);
910 assert_eq!(right, []);
915 let (left, right) = ring.as_slices();
916 let expected_left: Vec<_> = (-last..j + 1).rev().collect();
917 let expected_right: Vec<_> = (0..first).collect();
918 assert_eq!(left, &expected_left[..]);
919 assert_eq!(right, &expected_right[..]);
922 assert_eq!(ring.len() as i32, cap);
923 assert_eq!(ring.capacity() as i32, cap);
927 fn test_as_mut_slices() {
928 let mut ring: VecDeque<i32> = VecDeque::with_capacity(127);
929 let cap = ring.capacity() as i32;
931 let last = cap - first;
935 let (left, right) = ring.as_mut_slices();
936 let expected: Vec<_> = (0..i + 1).collect();
937 assert_eq!(left, &expected[..]);
938 assert_eq!(right, []);
943 let (left, right) = ring.as_mut_slices();
944 let expected_left: Vec<_> = (-last..j + 1).rev().collect();
945 let expected_right: Vec<_> = (0..first).collect();
946 assert_eq!(left, &expected_left[..]);
947 assert_eq!(right, &expected_right[..]);
950 assert_eq!(ring.len() as i32, cap);
951 assert_eq!(ring.capacity() as i32, cap);
956 let mut a: VecDeque<_> = vec![1, 2, 3].into_iter().collect();
957 let mut b: VecDeque<_> = vec![4, 5, 6].into_iter().collect();
961 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
962 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
964 // append nothing to something
966 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
967 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
969 // append something to nothing
971 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
972 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), []);
977 let mut buf = VecDeque::new();
979 buf.retain(|&x| x % 2 == 0);
980 let v: Vec<_> = buf.into_iter().collect();
981 assert_eq!(&v[..], &[2, 4]);
985 fn test_extend_ref() {
986 let mut v = VecDeque::new();
988 v.extend(&[2, 3, 4]);
990 assert_eq!(v.len(), 4);
996 let mut w = VecDeque::new();
1001 assert_eq!(v.len(), 6);
1002 assert_eq!(v[0], 1);
1003 assert_eq!(v[1], 2);
1004 assert_eq!(v[2], 3);
1005 assert_eq!(v[3], 4);
1006 assert_eq!(v[4], 5);
1007 assert_eq!(v[5], 6);
1011 fn test_contains() {
1012 let mut v = VecDeque::new();
1013 v.extend(&[2, 3, 4]);
1015 assert!(v.contains(&3));
1016 assert!(!v.contains(&1));
1020 assert!(!v.contains(&3));
1024 fn assert_covariance() {
1025 fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
1031 fn test_is_empty() {
1032 let mut v = VecDeque::<i32>::new();
1033 assert!(v.is_empty());
1034 assert!(v.iter().is_empty());
1035 assert!(v.iter_mut().is_empty());
1036 v.extend(&[2, 3, 4]);
1037 assert!(!v.is_empty());
1038 assert!(!v.iter().is_empty());
1039 assert!(!v.iter_mut().is_empty());
1040 while let Some(_) = v.pop_front() {
1041 assert_eq!(v.is_empty(), v.len() == 0);
1042 assert_eq!(v.iter().is_empty(), v.iter().len() == 0);
1043 assert_eq!(v.iter_mut().is_empty(), v.iter_mut().len() == 0);
1045 assert!(v.is_empty());
1046 assert!(v.iter().is_empty());
1047 assert!(v.iter_mut().is_empty());
1048 assert!(v.into_iter().is_empty());