5 use std::{usize, isize};
6 use std::vec::{Drain, IntoIter};
7 use std::collections::CollectionAllocErr::*;
9 struct DropCounter<'a> {
13 impl Drop for DropCounter<'_> {
20 fn test_small_vec_struct() {
21 assert!(size_of::<Vec<u8>>() == size_of::<usize>() * 3);
25 fn test_double_drop() {
31 let (mut count_x, mut count_y) = (0, 0);
37 tv.x.push(DropCounter { count: &mut count_x });
38 tv.y.push(DropCounter { count: &mut count_y });
40 // If Vec had a drop flag, here is where it would be zeroed.
41 // Instead, it should rely on its internal state to prevent
42 // doing anything significant when dropped multiple times.
45 // Here tv goes out of scope, tv.y should be dropped, but not tv.x.
48 assert_eq!(count_x, 1);
49 assert_eq!(count_y, 1);
54 let mut v = Vec::new();
55 assert_eq!(v.capacity(), 0);
58 assert!(v.capacity() >= 2);
64 assert!(v.capacity() >= 16);
66 assert!(v.capacity() >= 32);
71 assert!(v.capacity() >= 33)
75 fn test_zst_capacity() {
76 assert_eq!(Vec::<()>::new().capacity(), usize::max_value());
81 let mut v = Vec::new();
82 let mut w = Vec::new();
101 v.extend(w.clone()); // specializes to `append`
102 assert!(v.iter().eq(w.iter().chain(w.iter())));
105 #[derive(PartialEq, Debug)]
108 let mut a = Vec::new();
109 let b = vec![Foo, Foo];
112 assert_eq!(a, &[Foo, Foo]);
117 let mut x = Vec::new();
118 let y = vec![DropCounter { count: &mut count_x }];
121 assert_eq!(count_x, 1);
125 fn test_extend_ref() {
126 let mut v = vec![1, 2];
127 v.extend(&[3, 4, 5]);
129 assert_eq!(v.len(), 5);
130 assert_eq!(v, [1, 2, 3, 4, 5]);
135 assert_eq!(v.len(), 7);
136 assert_eq!(v, [1, 2, 3, 4, 5, 6, 7]);
140 fn test_slice_from_mut() {
141 let mut values = vec![1, 2, 3, 4, 5];
143 let slice = &mut values[2..];
144 assert!(slice == [3, 4, 5]);
150 assert!(values == [1, 2, 5, 6, 7]);
154 fn test_slice_to_mut() {
155 let mut values = vec![1, 2, 3, 4, 5];
157 let slice = &mut values[..2];
158 assert!(slice == [1, 2]);
164 assert!(values == [2, 3, 3, 4, 5]);
168 fn test_split_at_mut() {
169 let mut values = vec![1, 2, 3, 4, 5];
171 let (left, right) = values.split_at_mut(2);
173 let left: &[_] = left;
174 assert!(&left[..left.len()] == &[1, 2]);
181 let right: &[_] = right;
182 assert!(&right[..right.len()] == &[3, 4, 5]);
189 assert_eq!(values, [2, 3, 5, 6, 7]);
194 let v: Vec<i32> = vec![];
195 let w = vec![1, 2, 3];
197 assert_eq!(v, v.clone());
201 // they should be disjoint in memory.
202 assert!(w.as_ptr() != z.as_ptr())
206 fn test_clone_from() {
208 let three: Vec<Box<_>> = vec![box 1, box 2, box 3];
209 let two: Vec<Box<_>> = vec![box 4, box 5];
211 v.clone_from(&three);
212 assert_eq!(v, three);
215 v.clone_from(&three);
216 assert_eq!(v, three);
223 v.clone_from(&three);
229 let mut vec = vec![1, 2, 3, 4];
230 vec.retain(|&x| x % 2 == 0);
231 assert_eq!(vec, [2, 4]);
236 fn case(a: Vec<i32>, b: Vec<i32>) {
241 case(vec![], vec![]);
242 case(vec![1], vec![1]);
243 case(vec![1, 1], vec![1]);
244 case(vec![1, 2, 3], vec![1, 2, 3]);
245 case(vec![1, 1, 2, 3], vec![1, 2, 3]);
246 case(vec![1, 2, 2, 3], vec![1, 2, 3]);
247 case(vec![1, 2, 3, 3], vec![1, 2, 3]);
248 case(vec![1, 1, 2, 2, 2, 3, 3], vec![1, 2, 3]);
252 fn test_dedup_by_key() {
253 fn case(a: Vec<i32>, b: Vec<i32>) {
255 v.dedup_by_key(|i| *i / 10);
258 case(vec![], vec![]);
259 case(vec![10], vec![10]);
260 case(vec![10, 11], vec![10]);
261 case(vec![10, 20, 30], vec![10, 20, 30]);
262 case(vec![10, 11, 20, 30], vec![10, 20, 30]);
263 case(vec![10, 20, 21, 30], vec![10, 20, 30]);
264 case(vec![10, 20, 30, 31], vec![10, 20, 30]);
265 case(vec![10, 11, 20, 21, 22, 30, 31], vec![10, 20, 30]);
270 let mut vec = vec!["foo", "bar", "Bar", "baz", "bar"];
271 vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
273 assert_eq!(vec, ["foo", "bar", "baz", "bar"]);
275 let mut vec = vec![("foo", 1), ("foo", 2), ("bar", 3), ("bar", 4), ("bar", 5)];
276 vec.dedup_by(|a, b| a.0 == b.0 && { b.1 += a.1; true });
278 assert_eq!(vec, [("foo", 3), ("bar", 12)]);
282 fn test_dedup_unique() {
283 let mut v0: Vec<Box<_>> = vec![box 1, box 1, box 2, box 3];
285 let mut v1: Vec<Box<_>> = vec![box 1, box 2, box 2, box 3];
287 let mut v2: Vec<Box<_>> = vec![box 1, box 2, box 3, box 3];
289 // If the boxed pointers were leaked or otherwise misused, valgrind
290 // and/or rt should raise errors.
294 fn zero_sized_values() {
295 let mut v = Vec::new();
296 assert_eq!(v.len(), 0);
298 assert_eq!(v.len(), 1);
300 assert_eq!(v.len(), 2);
301 assert_eq!(v.pop(), Some(()));
302 assert_eq!(v.pop(), Some(()));
303 assert_eq!(v.pop(), None);
305 assert_eq!(v.iter().count(), 0);
307 assert_eq!(v.iter().count(), 1);
309 assert_eq!(v.iter().count(), 2);
313 assert_eq!(v.iter_mut().count(), 2);
315 assert_eq!(v.iter_mut().count(), 3);
317 assert_eq!(v.iter_mut().count(), 4);
319 for &mut () in &mut v {}
323 assert_eq!(v.iter_mut().count(), 0);
327 fn test_partition() {
328 assert_eq!(vec![].into_iter().partition(|x: &i32| *x < 3),
330 assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 4),
331 (vec![1, 2, 3], vec![]));
332 assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 2),
333 (vec![1], vec![2, 3]));
334 assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 0),
335 (vec![], vec![1, 2, 3]));
339 fn test_zip_unzip() {
340 let z1 = vec![(1, 4), (2, 5), (3, 6)];
342 let (left, right): (Vec<_>, Vec<_>) = z1.iter().cloned().unzip();
344 assert_eq!((1, 4), (left[0], right[0]));
345 assert_eq!((2, 5), (left[1], right[1]));
346 assert_eq!((3, 6), (left[2], right[2]));
350 fn test_vec_truncate_drop() {
351 static mut DROPS: u32 = 0;
361 let mut v = vec![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
362 assert_eq!(unsafe { DROPS }, 0);
364 assert_eq!(unsafe { DROPS }, 2);
366 assert_eq!(unsafe { DROPS }, 5);
371 fn test_vec_truncate_fail() {
373 impl Drop for BadElem {
375 let BadElem(ref mut x) = *self;
377 panic!("BadElem panic: 0xbadbeef")
382 let mut v = vec![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
388 let vec = vec![1, 2, 3];
389 assert!(vec[1] == 2);
394 fn test_index_out_of_bounds() {
395 let vec = vec![1, 2, 3];
401 fn test_slice_out_of_bounds_1() {
402 let x = vec![1, 2, 3, 4, 5];
408 fn test_slice_out_of_bounds_2() {
409 let x = vec![1, 2, 3, 4, 5];
415 fn test_slice_out_of_bounds_3() {
416 let x = vec![1, 2, 3, 4, 5];
422 fn test_slice_out_of_bounds_4() {
423 let x = vec![1, 2, 3, 4, 5];
429 fn test_slice_out_of_bounds_5() {
430 let x = vec![1, 2, 3, 4, 5];
436 fn test_swap_remove_empty() {
437 let mut vec = Vec::<i32>::new();
442 fn test_move_items() {
443 let vec = vec![1, 2, 3];
444 let mut vec2 = vec![];
448 assert_eq!(vec2, [1, 2, 3]);
452 fn test_move_items_reverse() {
453 let vec = vec![1, 2, 3];
454 let mut vec2 = vec![];
455 for i in vec.into_iter().rev() {
458 assert_eq!(vec2, [3, 2, 1]);
462 fn test_move_items_zero_sized() {
463 let vec = vec![(), (), ()];
464 let mut vec2 = vec![];
468 assert_eq!(vec2, [(), (), ()]);
472 fn test_drain_items() {
473 let mut vec = vec![1, 2, 3];
474 let mut vec2 = vec![];
475 for i in vec.drain(..) {
479 assert_eq!(vec2, [1, 2, 3]);
483 fn test_drain_items_reverse() {
484 let mut vec = vec![1, 2, 3];
485 let mut vec2 = vec![];
486 for i in vec.drain(..).rev() {
490 assert_eq!(vec2, [3, 2, 1]);
494 fn test_drain_items_zero_sized() {
495 let mut vec = vec![(), (), ()];
496 let mut vec2 = vec![];
497 for i in vec.drain(..) {
501 assert_eq!(vec2, [(), (), ()]);
506 fn test_drain_out_of_bounds() {
507 let mut v = vec![1, 2, 3, 4, 5];
512 fn test_drain_range() {
513 let mut v = vec![1, 2, 3, 4, 5];
514 for _ in v.drain(4..) {
516 assert_eq!(v, &[1, 2, 3, 4]);
518 let mut v: Vec<_> = (1..6).map(|x| x.to_string()).collect();
519 for _ in v.drain(1..4) {
521 assert_eq!(v, &[1.to_string(), 5.to_string()]);
523 let mut v: Vec<_> = (1..6).map(|x| x.to_string()).collect();
524 for _ in v.drain(1..4).rev() {
526 assert_eq!(v, &[1.to_string(), 5.to_string()]);
528 let mut v: Vec<_> = vec![(); 5];
529 for _ in v.drain(1..4).rev() {
531 assert_eq!(v, &[(), ()]);
535 fn test_drain_inclusive_range() {
536 let mut v = vec!['a', 'b', 'c', 'd', 'e'];
537 for _ in v.drain(1..=3) {
539 assert_eq!(v, &['a', 'e']);
541 let mut v: Vec<_> = (0..=5).map(|x| x.to_string()).collect();
542 for _ in v.drain(1..=5) {
544 assert_eq!(v, &["0".to_string()]);
546 let mut v: Vec<String> = (0..=5).map(|x| x.to_string()).collect();
547 for _ in v.drain(0..=5) {
549 assert_eq!(v, Vec::<String>::new());
551 let mut v: Vec<_> = (0..=5).map(|x| x.to_string()).collect();
552 for _ in v.drain(0..=3) {
554 assert_eq!(v, &["4".to_string(), "5".to_string()]);
556 let mut v: Vec<_> = (0..=1).map(|x| x.to_string()).collect();
557 for _ in v.drain(..=0) {
559 assert_eq!(v, &["1".to_string()]);
563 fn test_drain_max_vec_size() {
564 let mut v = Vec::<()>::with_capacity(usize::max_value());
565 unsafe { v.set_len(usize::max_value()); }
566 for _ in v.drain(usize::max_value() - 1..) {
568 assert_eq!(v.len(), usize::max_value() - 1);
570 let mut v = Vec::<()>::with_capacity(usize::max_value());
571 unsafe { v.set_len(usize::max_value()); }
572 for _ in v.drain(usize::max_value() - 1..=usize::max_value() - 1) {
574 assert_eq!(v.len(), usize::max_value() - 1);
579 fn test_drain_inclusive_out_of_bounds() {
580 let mut v = vec![1, 2, 3, 4, 5];
586 let mut v = vec![1, 2, 3, 4, 5];
587 let a = [10, 11, 12];
588 v.splice(2..4, a.iter().cloned());
589 assert_eq!(v, &[1, 2, 10, 11, 12, 5]);
590 v.splice(1..3, Some(20));
591 assert_eq!(v, &[1, 20, 11, 12, 5]);
595 fn test_splice_inclusive_range() {
596 let mut v = vec![1, 2, 3, 4, 5];
597 let a = [10, 11, 12];
598 let t1: Vec<_> = v.splice(2..=3, a.iter().cloned()).collect();
599 assert_eq!(v, &[1, 2, 10, 11, 12, 5]);
600 assert_eq!(t1, &[3, 4]);
601 let t2: Vec<_> = v.splice(1..=2, Some(20)).collect();
602 assert_eq!(v, &[1, 20, 11, 12, 5]);
603 assert_eq!(t2, &[2, 10]);
608 fn test_splice_out_of_bounds() {
609 let mut v = vec![1, 2, 3, 4, 5];
610 let a = [10, 11, 12];
611 v.splice(5..6, a.iter().cloned());
616 fn test_splice_inclusive_out_of_bounds() {
617 let mut v = vec![1, 2, 3, 4, 5];
618 let a = [10, 11, 12];
619 v.splice(5..=5, a.iter().cloned());
623 fn test_splice_items_zero_sized() {
624 let mut vec = vec![(), (), ()];
626 let t: Vec<_> = vec.splice(1..2, vec2.iter().cloned()).collect();
627 assert_eq!(vec, &[(), ()]);
628 assert_eq!(t, &[()]);
632 fn test_splice_unbounded() {
633 let mut vec = vec![1, 2, 3, 4, 5];
634 let t: Vec<_> = vec.splice(.., None).collect();
635 assert_eq!(vec, &[]);
636 assert_eq!(t, &[1, 2, 3, 4, 5]);
640 fn test_splice_forget() {
641 let mut v = vec![1, 2, 3, 4, 5];
642 let a = [10, 11, 12];
643 std::mem::forget(v.splice(2..4, a.iter().cloned()));
644 assert_eq!(v, &[1, 2]);
648 fn test_into_boxed_slice() {
649 let xs = vec![1, 2, 3];
650 let ys = xs.into_boxed_slice();
651 assert_eq!(&*ys, [1, 2, 3]);
656 let mut vec = vec![1, 2, 3];
657 let mut vec2 = vec![4, 5, 6];
658 vec.append(&mut vec2);
659 assert_eq!(vec, [1, 2, 3, 4, 5, 6]);
660 assert_eq!(vec2, []);
664 fn test_split_off() {
665 let mut vec = vec![1, 2, 3, 4, 5, 6];
666 let vec2 = vec.split_off(4);
667 assert_eq!(vec, [1, 2, 3, 4]);
668 assert_eq!(vec2, [5, 6]);
672 fn test_into_iter_as_slice() {
673 let vec = vec!['a', 'b', 'c'];
674 let mut into_iter = vec.into_iter();
675 assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
676 let _ = into_iter.next().unwrap();
677 assert_eq!(into_iter.as_slice(), &['b', 'c']);
678 let _ = into_iter.next().unwrap();
679 let _ = into_iter.next().unwrap();
680 assert_eq!(into_iter.as_slice(), &[]);
684 fn test_into_iter_as_mut_slice() {
685 let vec = vec!['a', 'b', 'c'];
686 let mut into_iter = vec.into_iter();
687 assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
688 into_iter.as_mut_slice()[0] = 'x';
689 into_iter.as_mut_slice()[1] = 'y';
690 assert_eq!(into_iter.next().unwrap(), 'x');
691 assert_eq!(into_iter.as_slice(), &['y', 'c']);
695 fn test_into_iter_debug() {
696 let vec = vec!['a', 'b', 'c'];
697 let into_iter = vec.into_iter();
698 let debug = format!("{:?}", into_iter);
699 assert_eq!(debug, "IntoIter(['a', 'b', 'c'])");
703 fn test_into_iter_count() {
704 assert_eq!(vec![1, 2, 3].into_iter().count(), 3);
708 fn test_into_iter_clone() {
709 fn iter_equal<I: Iterator<Item = i32>>(it: I, slice: &[i32]) {
710 let v: Vec<i32> = it.collect();
711 assert_eq!(&v[..], slice);
713 let mut it = vec![1, 2, 3].into_iter();
714 iter_equal(it.clone(), &[1, 2, 3]);
715 assert_eq!(it.next(), Some(1));
716 let mut it = it.rev();
717 iter_equal(it.clone(), &[3, 2]);
718 assert_eq!(it.next(), Some(3));
719 iter_equal(it.clone(), &[2]);
720 assert_eq!(it.next(), Some(2));
721 iter_equal(it.clone(), &[]);
722 assert_eq!(it.next(), None);
727 let borrowed: &[_] = &["borrowed", "(slice)"];
728 let owned = vec!["owned", "(vec)"];
729 match (Cow::from(owned.clone()), Cow::from(borrowed)) {
730 (Cow::Owned(o), Cow::Borrowed(b)) => assert!(o == owned && b == borrowed),
731 _ => panic!("invalid `Cow::from`"),
737 let borrowed: &[_] = &["borrowed", "(slice)"];
738 let owned = vec!["owned", "(vec)"];
739 assert_eq!(Vec::from(Cow::Borrowed(borrowed)), vec!["borrowed", "(slice)"]);
740 assert_eq!(Vec::from(Cow::Owned(owned)), vec!["owned", "(vec)"]);
744 fn assert_covariance() {
745 fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
748 fn into_iter<'new>(i: IntoIter<&'static str>) -> IntoIter<&'new str> {
754 fn from_into_inner() {
755 let vec = vec![1, 2, 3];
756 let ptr = vec.as_ptr();
757 let vec = vec.into_iter().collect::<Vec<_>>();
758 assert_eq!(vec, [1, 2, 3]);
759 assert_eq!(vec.as_ptr(), ptr);
761 let ptr = &vec[1] as *const _;
762 let mut it = vec.into_iter();
764 let vec = it.collect::<Vec<_>>();
765 assert_eq!(vec, [2, 3]);
766 assert!(ptr != vec.as_ptr());
770 fn overaligned_allocations() {
773 let mut v = vec![Foo(273)];
776 assert!(v[0].0 == 273);
777 assert!(v.as_ptr() as usize & 0xff == 0);
779 assert!(v[0].0 == 273);
780 assert!(v.as_ptr() as usize & 0xff == 0);
785 fn drain_filter_empty() {
786 let mut vec: Vec<i32> = vec![];
789 let mut iter = vec.drain_filter(|_| true);
790 assert_eq!(iter.size_hint(), (0, Some(0)));
791 assert_eq!(iter.next(), None);
792 assert_eq!(iter.size_hint(), (0, Some(0)));
793 assert_eq!(iter.next(), None);
794 assert_eq!(iter.size_hint(), (0, Some(0)));
796 assert_eq!(vec.len(), 0);
797 assert_eq!(vec, vec![]);
801 fn drain_filter_zst() {
802 let mut vec = vec![(), (), (), (), ()];
803 let initial_len = vec.len();
806 let mut iter = vec.drain_filter(|_| true);
807 assert_eq!(iter.size_hint(), (0, Some(initial_len)));
808 while let Some(_) = iter.next() {
810 assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
812 assert_eq!(iter.size_hint(), (0, Some(0)));
813 assert_eq!(iter.next(), None);
814 assert_eq!(iter.size_hint(), (0, Some(0)));
817 assert_eq!(count, initial_len);
818 assert_eq!(vec.len(), 0);
819 assert_eq!(vec, vec![]);
823 fn drain_filter_false() {
824 let mut vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
826 let initial_len = vec.len();
829 let mut iter = vec.drain_filter(|_| false);
830 assert_eq!(iter.size_hint(), (0, Some(initial_len)));
831 for _ in iter.by_ref() {
834 assert_eq!(iter.size_hint(), (0, Some(0)));
835 assert_eq!(iter.next(), None);
836 assert_eq!(iter.size_hint(), (0, Some(0)));
839 assert_eq!(count, 0);
840 assert_eq!(vec.len(), initial_len);
841 assert_eq!(vec, vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
845 fn drain_filter_true() {
846 let mut vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
848 let initial_len = vec.len();
851 let mut iter = vec.drain_filter(|_| true);
852 assert_eq!(iter.size_hint(), (0, Some(initial_len)));
853 while let Some(_) = iter.next() {
855 assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
857 assert_eq!(iter.size_hint(), (0, Some(0)));
858 assert_eq!(iter.next(), None);
859 assert_eq!(iter.size_hint(), (0, Some(0)));
862 assert_eq!(count, initial_len);
863 assert_eq!(vec.len(), 0);
864 assert_eq!(vec, vec![]);
868 fn drain_filter_complex() {
870 { // [+xxx++++++xxxxx++++x+x++]
871 let mut vec = vec![1,
873 7, 9, 11, 13, 15, 17,
881 let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
882 assert_eq!(removed.len(), 10);
883 assert_eq!(removed, vec![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
885 assert_eq!(vec.len(), 14);
886 assert_eq!(vec, vec![1, 7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]);
889 { // [xxx++++++xxxxx++++x+x++]
890 let mut vec = vec![2, 4, 6,
891 7, 9, 11, 13, 15, 17,
899 let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
900 assert_eq!(removed.len(), 10);
901 assert_eq!(removed, vec![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
903 assert_eq!(vec.len(), 13);
904 assert_eq!(vec, vec![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]);
907 { // [xxx++++++xxxxx++++x+x]
908 let mut vec = vec![2, 4, 6,
909 7, 9, 11, 13, 15, 17,
916 let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
917 assert_eq!(removed.len(), 10);
918 assert_eq!(removed, vec![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
920 assert_eq!(vec.len(), 11);
921 assert_eq!(vec, vec![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35]);
924 { // [xxxxxxxxxx+++++++++++]
925 let mut vec = vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20,
926 1, 3, 5, 7, 9, 11, 13, 15, 17, 19];
928 let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
929 assert_eq!(removed.len(), 10);
930 assert_eq!(removed, vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
932 assert_eq!(vec.len(), 10);
933 assert_eq!(vec, vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
936 { // [+++++++++++xxxxxxxxxx]
937 let mut vec = vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19,
938 2, 4, 6, 8, 10, 12, 14, 16, 18, 20];
940 let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
941 assert_eq!(removed.len(), 10);
942 assert_eq!(removed, vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
944 assert_eq!(vec.len(), 10);
945 assert_eq!(vec, vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
950 fn test_reserve_exact() {
951 // This is all the same as test_reserve
953 let mut v = Vec::new();
954 assert_eq!(v.capacity(), 0);
957 assert!(v.capacity() >= 2);
963 assert!(v.capacity() >= 16);
965 assert!(v.capacity() >= 32);
970 assert!(v.capacity() >= 33)
974 fn test_try_reserve() {
976 // These are the interesting cases:
977 // * exactly isize::MAX should never trigger a CapacityOverflow (can be OOM)
978 // * > isize::MAX should always fail
979 // * On 16/32-bit should CapacityOverflow
980 // * On 64-bit should OOM
981 // * overflow may trigger when adding `len` to `cap` (in number of elements)
982 // * overflow may trigger when multiplying `new_cap` by size_of::<T> (to get bytes)
984 const MAX_CAP: usize = isize::MAX as usize;
985 const MAX_USIZE: usize = usize::MAX;
987 // On 16/32-bit, we check that allocations don't exceed isize::MAX,
988 // on 64-bit, we assume the OS will give an OOM for such a ridiculous size.
989 // Any platform that succeeds for these requests is technically broken with
990 // ptr::offset because LLVM is the worst.
991 let guards_against_isize = size_of::<usize>() < 8;
994 // Note: basic stuff is checked by test_reserve
995 let mut empty_bytes: Vec<u8> = Vec::new();
997 // Check isize::MAX doesn't count as an overflow
998 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP) {
999 panic!("isize::MAX shouldn't trigger an overflow!");
1001 // Play it again, frank! (just to be sure)
1002 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP) {
1003 panic!("isize::MAX shouldn't trigger an overflow!");
1006 if guards_against_isize {
1007 // Check isize::MAX + 1 does count as overflow
1008 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP + 1) {
1009 } else { panic!("isize::MAX + 1 should trigger an overflow!") }
1011 // Check usize::MAX does count as overflow
1012 if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_USIZE) {
1013 } else { panic!("usize::MAX should trigger an overflow!") }
1015 // Check isize::MAX + 1 is an OOM
1016 if let Err(AllocErr) = empty_bytes.try_reserve(MAX_CAP + 1) {
1017 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1019 // Check usize::MAX is an OOM
1020 if let Err(AllocErr) = empty_bytes.try_reserve(MAX_USIZE) {
1021 } else { panic!("usize::MAX should trigger an OOM!") }
1027 // Same basic idea, but with non-zero len
1028 let mut ten_bytes: Vec<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1030 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 10) {
1031 panic!("isize::MAX shouldn't trigger an overflow!");
1033 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 10) {
1034 panic!("isize::MAX shouldn't trigger an overflow!");
1036 if guards_against_isize {
1037 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 9) {
1038 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1040 if let Err(AllocErr) = ten_bytes.try_reserve(MAX_CAP - 9) {
1041 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1043 // Should always overflow in the add-to-len
1044 if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_USIZE) {
1045 } else { panic!("usize::MAX should trigger an overflow!") }
1050 // Same basic idea, but with interesting type size
1051 let mut ten_u32s: Vec<u32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1053 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP/4 - 10) {
1054 panic!("isize::MAX shouldn't trigger an overflow!");
1056 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP/4 - 10) {
1057 panic!("isize::MAX shouldn't trigger an overflow!");
1059 if guards_against_isize {
1060 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP/4 - 9) {
1061 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1063 if let Err(AllocErr) = ten_u32s.try_reserve(MAX_CAP/4 - 9) {
1064 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1066 // Should fail in the mul-by-size
1067 if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_USIZE - 20) {
1069 panic!("usize::MAX should trigger an overflow!");
1076 fn test_try_reserve_exact() {
1078 // This is exactly the same as test_try_reserve with the method changed.
1079 // See that test for comments.
1081 const MAX_CAP: usize = isize::MAX as usize;
1082 const MAX_USIZE: usize = usize::MAX;
1084 let guards_against_isize = size_of::<usize>() < 8;
1087 let mut empty_bytes: Vec<u8> = Vec::new();
1089 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP) {
1090 panic!("isize::MAX shouldn't trigger an overflow!");
1092 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP) {
1093 panic!("isize::MAX shouldn't trigger an overflow!");
1096 if guards_against_isize {
1097 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP + 1) {
1098 } else { panic!("isize::MAX + 1 should trigger an overflow!") }
1100 if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_USIZE) {
1101 } else { panic!("usize::MAX should trigger an overflow!") }
1103 if let Err(AllocErr) = empty_bytes.try_reserve_exact(MAX_CAP + 1) {
1104 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1106 if let Err(AllocErr) = empty_bytes.try_reserve_exact(MAX_USIZE) {
1107 } else { panic!("usize::MAX should trigger an OOM!") }
1113 let mut ten_bytes: Vec<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1115 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 10) {
1116 panic!("isize::MAX shouldn't trigger an overflow!");
1118 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 10) {
1119 panic!("isize::MAX shouldn't trigger an overflow!");
1121 if guards_against_isize {
1122 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 9) {
1123 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1125 if let Err(AllocErr) = ten_bytes.try_reserve_exact(MAX_CAP - 9) {
1126 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1128 if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_USIZE) {
1129 } else { panic!("usize::MAX should trigger an overflow!") }
1134 let mut ten_u32s: Vec<u32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1136 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 10) {
1137 panic!("isize::MAX shouldn't trigger an overflow!");
1139 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 10) {
1140 panic!("isize::MAX shouldn't trigger an overflow!");
1142 if guards_against_isize {
1143 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 9) {
1144 } else { panic!("isize::MAX + 1 should trigger an overflow!"); }
1146 if let Err(AllocErr) = ten_u32s.try_reserve_exact(MAX_CAP/4 - 9) {
1147 } else { panic!("isize::MAX + 1 should trigger an OOM!") }
1149 if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_USIZE - 20) {
1150 } else { panic!("usize::MAX should trigger an overflow!") }