4 #[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
5 fn bench_push_back_100(b: &mut test::Bencher) {
6 let mut deq = VecDeque::with_capacity(101);
17 #[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
18 fn bench_push_front_100(b: &mut test::Bencher) {
19 let mut deq = VecDeque::with_capacity(101);
30 #[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
31 fn bench_pop_back_100(b: &mut test::Bencher) {
32 let mut deq = VecDeque::<i32>::with_capacity(101);
37 while !deq.is_empty() {
38 test::black_box(deq.pop_back());
44 #[cfg_attr(miri, ignore)] // isolated Miri does not support benchmarks
45 fn bench_pop_front_100(b: &mut test::Bencher) {
46 let mut deq = VecDeque::<i32>::with_capacity(101);
51 while !deq.is_empty() {
52 test::black_box(deq.pop_front());
58 fn test_swap_front_back_remove() {
60 // This test checks that every single combination of tail position and length is tested.
61 // Capacity 15 should be large enough to cover every case.
62 let mut tester = VecDeque::with_capacity(15);
63 let usable_cap = tester.capacity();
64 let final_len = usable_cap / 2;
66 for len in 0..final_len {
67 let expected: VecDeque<_> =
68 if back { (0..len).collect() } else { (0..len).rev().collect() };
69 for tail_pos in 0..usable_cap {
70 tester.tail = tail_pos;
71 tester.head = tail_pos;
77 assert_eq!(tester.swap_remove_back(i), Some(len * 2 - 1 - i));
84 let idx = tester.len() - 1 - i;
85 assert_eq!(tester.swap_remove_front(idx), Some(len * 2 - 1 - i));
88 assert!(tester.tail < tester.cap());
89 assert!(tester.head < tester.cap());
90 assert_eq!(tester, expected);
100 // This test checks that every single combination of tail position, length, and
101 // insertion position is tested. Capacity 15 should be large enough to cover every case.
103 let mut tester = VecDeque::with_capacity(15);
104 // can't guarantee we got 15, so have to get what we got.
105 // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
106 // this test isn't covering what it wants to
107 let cap = tester.capacity();
109 // len is the length *after* insertion
110 let minlen = if cfg!(miri) { cap - 1 } else { 1 }; // Miri is too slow
111 for len in minlen..cap {
112 // 0, 1, 2, .., len - 1
113 let expected = (0..).take(len).collect::<VecDeque<_>>();
114 for tail_pos in 0..cap {
115 for to_insert in 0..len {
116 tester.tail = tail_pos;
117 tester.head = tail_pos;
123 tester.insert(to_insert, to_insert);
124 assert!(tester.tail < tester.cap());
125 assert!(tester.head < tester.cap());
126 assert_eq!(tester, expected);
133 fn make_contiguous_big_tail() {
134 let mut tester = VecDeque::with_capacity(15);
141 tester.push_front(i);
145 assert_eq!(tester.capacity(), 15);
146 assert_eq!((&[9, 8, 7, 6, 5, 4, 3] as &[_], &[0, 1, 2] as &[_]), tester.as_slices());
148 let expected_start = tester.head;
149 tester.make_contiguous();
150 assert_eq!(tester.tail, expected_start);
151 assert_eq!((&[9, 8, 7, 6, 5, 4, 3, 0, 1, 2] as &[_], &[] as &[_]), tester.as_slices());
155 fn make_contiguous_big_head() {
156 let mut tester = VecDeque::with_capacity(15);
163 tester.push_front(i);
167 let expected_start = 0;
168 tester.make_contiguous();
169 assert_eq!(tester.tail, expected_start);
170 assert_eq!((&[9, 8, 0, 1, 2, 3, 4, 5, 6, 7] as &[_], &[] as &[_]), tester.as_slices());
174 fn make_contiguous_small_free() {
175 let mut tester = VecDeque::with_capacity(15);
177 for i in 'A' as u8..'I' as u8 {
178 tester.push_back(i as char);
181 for i in 'I' as u8..'N' as u8 {
182 tester.push_front(i as char);
186 let expected_start = 0;
187 tester.make_contiguous();
188 assert_eq!(tester.tail, expected_start);
190 (&['M', 'L', 'K', 'J', 'I', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] as &[_], &[] as &[_]),
195 for i in 'I' as u8..'N' as u8 {
196 tester.push_back(i as char);
199 for i in 'A' as u8..'I' as u8 {
200 tester.push_front(i as char);
204 let expected_start = 0;
205 tester.make_contiguous();
206 assert_eq!(tester.tail, expected_start);
208 (&['H', 'G', 'F', 'E', 'D', 'C', 'B', 'A', 'I', 'J', 'K', 'L', 'M'] as &[_], &[] as &[_]),
214 fn make_contiguous_head_to_end() {
215 let mut dq = VecDeque::with_capacity(3);
219 dq.make_contiguous();
220 let expected_tail = 0;
221 let expected_head = 3;
222 assert_eq!(expected_tail, dq.tail);
223 assert_eq!(expected_head, dq.head);
224 assert_eq!((&['A', 'B', 'C'] as &[_], &[] as &[_]), dq.as_slices());
228 fn make_contiguous_head_to_end_2() {
229 // Another test case for #79808, taken from #80293.
231 let mut dq = VecDeque::from_iter(0..6);
237 dq.make_contiguous();
238 let collected: Vec<_> = dq.iter().copied().collect();
239 assert_eq!(dq.as_slices(), (&collected[..], &[] as &[_]));
244 // This test checks that every single combination of tail position, length, and
245 // removal position is tested. Capacity 15 should be large enough to cover every case.
247 let mut tester = VecDeque::with_capacity(15);
248 // can't guarantee we got 15, so have to get what we got.
249 // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
250 // this test isn't covering what it wants to
251 let cap = tester.capacity();
253 // len is the length *after* removal
254 let minlen = if cfg!(miri) { cap - 2 } else { 0 }; // Miri is too slow
255 for len in minlen..cap - 1 {
256 // 0, 1, 2, .., len - 1
257 let expected = (0..).take(len).collect::<VecDeque<_>>();
258 for tail_pos in 0..cap {
259 for to_remove in 0..=len {
260 tester.tail = tail_pos;
261 tester.head = tail_pos;
264 tester.push_back(1234);
268 if to_remove == len {
269 tester.push_back(1234);
271 tester.remove(to_remove);
272 assert!(tester.tail < tester.cap());
273 assert!(tester.head < tester.cap());
274 assert_eq!(tester, expected);
282 let mut tester: VecDeque<usize> = VecDeque::with_capacity(7);
284 let cap = tester.capacity();
285 let minlen = if cfg!(miri) { cap - 1 } else { 0 }; // Miri is too slow
286 for len in minlen..=cap {
287 for tail in 0..=cap {
288 for start in 0..=len {
289 for end in start..=len {
296 // Check that we iterate over the correct values
297 let range: VecDeque<_> = tester.range(start..end).copied().collect();
298 let expected: VecDeque<_> = (start..end).collect();
299 assert_eq!(range, expected);
307 fn test_range_mut() {
308 let mut tester: VecDeque<usize> = VecDeque::with_capacity(7);
310 let cap = tester.capacity();
312 for tail in 0..=cap {
313 for start in 0..=len {
314 for end in start..=len {
321 let head_was = tester.head;
322 let tail_was = tester.tail;
324 // Check that we iterate over the correct values
325 let range: VecDeque<_> = tester.range_mut(start..end).map(|v| *v).collect();
326 let expected: VecDeque<_> = (start..end).collect();
327 assert_eq!(range, expected);
329 // We shouldn't have changed the capacity or made the
330 // head or tail out of bounds
331 assert_eq!(tester.capacity(), cap);
332 assert_eq!(tester.tail, tail_was);
333 assert_eq!(tester.head, head_was);
342 let mut tester: VecDeque<usize> = VecDeque::with_capacity(7);
344 let cap = tester.capacity();
346 for tail in 0..=cap {
347 for drain_start in 0..=len {
348 for drain_end in drain_start..=len {
355 // Check that we drain the correct values
356 let drained: VecDeque<_> = tester.drain(drain_start..drain_end).collect();
357 let drained_expected: VecDeque<_> = (drain_start..drain_end).collect();
358 assert_eq!(drained, drained_expected);
360 // We shouldn't have changed the capacity or made the
361 // head or tail out of bounds
362 assert_eq!(tester.capacity(), cap);
363 assert!(tester.tail < tester.cap());
364 assert!(tester.head < tester.cap());
366 // We should see the correct values in the VecDeque
367 let expected: VecDeque<_> = (0..drain_start).chain(drain_end..len).collect();
368 assert_eq!(expected, tester);
376 fn test_shrink_to_fit() {
377 // This test checks that every single combination of head and tail position,
378 // is tested. Capacity 15 should be large enough to cover every case.
380 let mut tester = VecDeque::with_capacity(15);
381 // can't guarantee we got 15, so have to get what we got.
382 // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
383 // this test isn't covering what it wants to
384 let cap = tester.capacity();
386 let max_cap = tester.capacity();
389 // 0, 1, 2, .., len - 1
390 let expected = (0..).take(len).collect::<VecDeque<_>>();
391 for tail_pos in 0..=max_cap {
392 tester.tail = tail_pos;
393 tester.head = tail_pos;
398 tester.shrink_to_fit();
399 assert!(tester.capacity() <= cap);
400 assert!(tester.tail < tester.cap());
401 assert!(tester.head < tester.cap());
402 assert_eq!(tester, expected);
408 fn test_split_off() {
409 // This test checks that every single combination of tail position, length, and
410 // split position is tested. Capacity 15 should be large enough to cover every case.
412 let mut tester = VecDeque::with_capacity(15);
413 // can't guarantee we got 15, so have to get what we got.
414 // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
415 // this test isn't covering what it wants to
416 let cap = tester.capacity();
418 // len is the length *before* splitting
419 let minlen = if cfg!(miri) { cap - 1 } else { 0 }; // Miri is too slow
420 for len in minlen..cap {
423 // 0, 1, 2, .., at - 1 (may be empty)
424 let expected_self = (0..).take(at).collect::<VecDeque<_>>();
425 // at, at + 1, .., len - 1 (may be empty)
426 let expected_other = (at..).take(len - at).collect::<VecDeque<_>>();
428 for tail_pos in 0..cap {
429 tester.tail = tail_pos;
430 tester.head = tail_pos;
434 let result = tester.split_off(at);
435 assert!(tester.tail < tester.cap());
436 assert!(tester.head < tester.cap());
437 assert!(result.tail < result.cap());
438 assert!(result.head < result.cap());
439 assert_eq!(tester, expected_self);
440 assert_eq!(result, expected_other);
451 let mut vec = Vec::with_capacity(cap);
454 let vd = VecDeque::from(vec.clone());
455 assert!(vd.cap().is_power_of_two());
456 assert_eq!(vd.len(), vec.len());
457 assert!(vd.into_iter().eq(vec));
461 let vec = Vec::from([(); MAXIMUM_ZST_CAPACITY - 1]);
462 let vd = VecDeque::from(vec.clone());
463 assert!(vd.cap().is_power_of_two());
464 assert_eq!(vd.len(), vec.len());
468 #[should_panic = "capacity overflow"]
469 fn test_from_vec_zst_overflow() {
471 let vec = Vec::from([(); MAXIMUM_ZST_CAPACITY]);
472 let vd = VecDeque::from(vec.clone()); // no room for +1
473 assert!(vd.cap().is_power_of_two());
474 assert_eq!(vd.len(), vec.len());
478 fn test_vec_from_vecdeque() {
481 fn create_vec_and_test_convert(capacity: usize, offset: usize, len: usize) {
482 let mut vd = VecDeque::with_capacity(capacity);
489 let vec: Vec<_> = Vec::from(vd.clone());
490 assert_eq!(vec.len(), vd.len());
491 assert!(vec.into_iter().eq(vd));
495 let max_pwr = if cfg!(miri) { 5 } else { 7 };
497 for cap_pwr in 0..max_pwr {
498 // Make capacity as a (2^x)-1, so that the ring size is 2^x
499 let cap = (2i32.pow(cap_pwr) - 1) as usize;
501 // In these cases there is enough free space to solve it with copies
502 for len in 0..((cap + 1) / 2) {
503 // Test contiguous cases
504 for offset in 0..(cap - len) {
505 create_vec_and_test_convert(cap, offset, len)
508 // Test cases where block at end of buffer is bigger than block at start
509 for offset in (cap - len)..(cap - (len / 2)) {
510 create_vec_and_test_convert(cap, offset, len)
513 // Test cases where block at start of buffer is bigger than block at end
514 for offset in (cap - (len / 2))..cap {
515 create_vec_and_test_convert(cap, offset, len)
519 // Now there's not (necessarily) space to straighten the ring with simple copies,
520 // the ring will use swapping when:
521 // (cap + 1 - offset) > (cap + 1 - len) && (len - (cap + 1 - offset)) > (cap + 1 - len))
522 // right block size > free space && left block size > free space
523 for len in ((cap + 1) / 2)..cap {
524 // Test contiguous cases
525 for offset in 0..(cap - len) {
526 create_vec_and_test_convert(cap, offset, len)
529 // Test cases where block at end of buffer is bigger than block at start
530 for offset in (cap - len)..(cap - (len / 2)) {
531 create_vec_and_test_convert(cap, offset, len)
534 // Test cases where block at start of buffer is bigger than block at end
535 for offset in (cap - (len / 2))..cap {
536 create_vec_and_test_convert(cap, offset, len)
543 fn test_clone_from() {
546 let limit = if cfg!(miri) { 4 } else { 8 }; // Miri is too slow
547 for pfv in 0..limit {
548 for pfu in 0..limit {
550 let (vr, ur) = if longer == 0 { (&m, &n) } else { (&n, &m) };
551 let mut v = VecDeque::from(vr.clone());
555 let mut u = VecDeque::from(ur.clone());
567 fn test_vec_deque_truncate_drop() {
568 static mut DROPS: u32 = 0;
579 let v = vec![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
580 for push_front in 0..=v.len() {
582 let mut tester = VecDeque::with_capacity(5);
583 for (index, elem) in v.into_iter().enumerate() {
584 if index < push_front {
585 tester.push_front(elem);
587 tester.push_back(elem);
590 assert_eq!(unsafe { DROPS }, 0);
592 assert_eq!(unsafe { DROPS }, 2);
594 assert_eq!(unsafe { DROPS }, 5);
603 use crate::boxed::Box;
605 let mut dst = VecDeque::new();
606 dst.push_front(Box::new(1));
607 dst.push_front(Box::new(2));
608 assert_eq!(*dst.pop_back().unwrap(), 1);
610 let mut src = VecDeque::new();
611 src.push_front(Box::new(2));
612 dst.append(&mut src);
621 use core::num::Wrapping;
623 // This is a valid, albeit rather bad hash function implementation.
624 struct SimpleHasher(Wrapping<u64>);
626 impl Hasher for SimpleHasher {
627 fn finish(&self) -> u64 {
631 fn write(&mut self, bytes: &[u8]) {
632 // This particular implementation hashes value 24 in addition to bytes.
633 // Such an implementation is valid as Hasher only guarantees equivalence
634 // for the exact same set of calls to its methods.
635 for &v in iter::once(&24).chain(bytes) {
636 self.0 = Wrapping(31) * self.0 + Wrapping(u64::from(v));
641 fn hash_code(value: impl Hash) -> u64 {
642 let mut hasher = SimpleHasher(Wrapping(1));
643 value.hash(&mut hasher);
647 // This creates two deques for which values returned by as_slices
649 let vda: VecDeque<u8> = (0..10).collect();
650 let mut vdb = VecDeque::with_capacity(10);
652 (0..5).rev().for_each(|elem| vdb.push_front(elem));
653 assert_ne!(vda.as_slices(), vdb.as_slices());
654 assert_eq!(vda, vdb);
655 assert_eq!(hash_code(vda), hash_code(vdb));