6 #[cfg_attr(miri, ignore)] // Miri does not support benchmarks
7 fn bench_push_back_100(b
: &mut test
::Bencher
) {
8 let mut deq
= VecDeque
::with_capacity(101);
19 #[cfg_attr(miri, ignore)] // Miri does not support benchmarks
20 fn bench_push_front_100(b
: &mut test
::Bencher
) {
21 let mut deq
= VecDeque
::with_capacity(101);
32 #[cfg_attr(miri, ignore)] // Miri does not support benchmarks
33 fn bench_pop_back_100(b
: &mut test
::Bencher
) {
34 let mut deq
= VecDeque
::<i32>::with_capacity(101);
39 while !deq
.is_empty() {
40 test
::black_box(deq
.pop_back());
46 #[cfg_attr(miri, ignore)] // Miri does not support benchmarks
47 fn bench_pop_front_100(b
: &mut test
::Bencher
) {
48 let mut deq
= VecDeque
::<i32>::with_capacity(101);
53 while !deq
.is_empty() {
54 test
::black_box(deq
.pop_front());
60 fn test_swap_front_back_remove() {
62 // This test checks that every single combination of tail position and length is tested.
63 // Capacity 15 should be large enough to cover every case.
64 let mut tester
= VecDeque
::with_capacity(15);
65 let usable_cap
= tester
.capacity();
66 let final_len
= usable_cap
/ 2;
68 for len
in 0..final_len
{
69 let expected
: VecDeque
<_
> =
70 if back { (0..len).collect() }
else { (0..len).rev().collect() }
;
71 for tail_pos
in 0..usable_cap
{
72 tester
.tail
= tail_pos
;
73 tester
.head
= tail_pos
;
79 assert_eq
!(tester
.swap_remove_back(i
), Some(len
* 2 - 1 - i
));
86 let idx
= tester
.len() - 1 - i
;
87 assert_eq
!(tester
.swap_remove_front(idx
), Some(len
* 2 - 1 - i
));
90 assert
!(tester
.tail
< tester
.cap());
91 assert
!(tester
.head
< tester
.cap());
92 assert_eq
!(tester
, expected
);
102 // This test checks that every single combination of tail position, length, and
103 // insertion position is tested. Capacity 15 should be large enough to cover every case.
105 let mut tester
= VecDeque
::with_capacity(15);
106 // can't guarantee we got 15, so have to get what we got.
107 // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
108 // this test isn't covering what it wants to
109 let cap
= tester
.capacity();
111 // len is the length *after* insertion
113 // 0, 1, 2, .., len - 1
114 let expected
= (0..).take(len
).collect
::<VecDeque
<_
>>();
115 for tail_pos
in 0..cap
{
116 for to_insert
in 0..len
{
117 tester
.tail
= tail_pos
;
118 tester
.head
= tail_pos
;
124 tester
.insert(to_insert
, to_insert
);
125 assert
!(tester
.tail
< tester
.cap());
126 assert
!(tester
.head
< tester
.cap());
127 assert_eq
!(tester
, expected
);
135 // This test checks that every single combination of tail position, length, and
136 // removal position is tested. Capacity 15 should be large enough to cover every case.
138 let mut tester
= VecDeque
::with_capacity(15);
139 // can't guarantee we got 15, so have to get what we got.
140 // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
141 // this test isn't covering what it wants to
142 let cap
= tester
.capacity();
144 // len is the length *after* removal
145 for len
in 0..cap
- 1 {
146 // 0, 1, 2, .., len - 1
147 let expected
= (0..).take(len
).collect
::<VecDeque
<_
>>();
148 for tail_pos
in 0..cap
{
149 for to_remove
in 0..=len
{
150 tester
.tail
= tail_pos
;
151 tester
.head
= tail_pos
;
154 tester
.push_back(1234);
158 if to_remove
== len
{
159 tester
.push_back(1234);
161 tester
.remove(to_remove
);
162 assert
!(tester
.tail
< tester
.cap());
163 assert
!(tester
.head
< tester
.cap());
164 assert_eq
!(tester
, expected
);
172 let mut tester
: VecDeque
<usize> = VecDeque
::with_capacity(7);
174 let cap
= tester
.capacity();
176 for tail
in 0..=cap
{
177 for drain_start
in 0..=len
{
178 for drain_end
in drain_start
..=len
{
185 // Check that we drain the correct values
186 let drained
: VecDeque
<_
> = tester
.drain(drain_start
..drain_end
).collect();
187 let drained_expected
: VecDeque
<_
> = (drain_start
..drain_end
).collect();
188 assert_eq
!(drained
, drained_expected
);
190 // We shouldn't have changed the capacity or made the
191 // head or tail out of bounds
192 assert_eq
!(tester
.capacity(), cap
);
193 assert
!(tester
.tail
< tester
.cap());
194 assert
!(tester
.head
< tester
.cap());
196 // We should see the correct values in the VecDeque
197 let expected
: VecDeque
<_
> = (0..drain_start
).chain(drain_end
..len
).collect();
198 assert_eq
!(expected
, tester
);
206 fn test_shrink_to_fit() {
207 // This test checks that every single combination of head and tail position,
208 // is tested. Capacity 15 should be large enough to cover every case.
210 let mut tester
= VecDeque
::with_capacity(15);
211 // can't guarantee we got 15, so have to get what we got.
212 // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
213 // this test isn't covering what it wants to
214 let cap
= tester
.capacity();
216 let max_cap
= tester
.capacity();
219 // 0, 1, 2, .., len - 1
220 let expected
= (0..).take(len
).collect
::<VecDeque
<_
>>();
221 for tail_pos
in 0..=max_cap
{
222 tester
.tail
= tail_pos
;
223 tester
.head
= tail_pos
;
228 tester
.shrink_to_fit();
229 assert
!(tester
.capacity() <= cap
);
230 assert
!(tester
.tail
< tester
.cap());
231 assert
!(tester
.head
< tester
.cap());
232 assert_eq
!(tester
, expected
);
238 fn test_split_off() {
239 // This test checks that every single combination of tail position, length, and
240 // split position is tested. Capacity 15 should be large enough to cover every case.
242 let mut tester
= VecDeque
::with_capacity(15);
243 // can't guarantee we got 15, so have to get what we got.
244 // 15 would be great, but we will definitely get 2^k - 1, for k >= 4, or else
245 // this test isn't covering what it wants to
246 let cap
= tester
.capacity();
248 // len is the length *before* splitting
252 // 0, 1, 2, .., at - 1 (may be empty)
253 let expected_self
= (0..).take(at
).collect
::<VecDeque
<_
>>();
254 // at, at + 1, .., len - 1 (may be empty)
255 let expected_other
= (at
..).take(len
- at
).collect
::<VecDeque
<_
>>();
257 for tail_pos
in 0..cap
{
258 tester
.tail
= tail_pos
;
259 tester
.head
= tail_pos
;
263 let result
= tester
.split_off(at
);
264 assert
!(tester
.tail
< tester
.cap());
265 assert
!(tester
.head
< tester
.cap());
266 assert
!(result
.tail
< result
.cap());
267 assert
!(result
.head
< result
.cap());
268 assert_eq
!(tester
, expected_self
);
269 assert_eq
!(result
, expected_other
);
280 let mut vec
= Vec
::with_capacity(cap
);
283 let vd
= VecDeque
::from(vec
.clone());
284 assert
!(vd
.cap().is_power_of_two());
285 assert_eq
!(vd
.len(), vec
.len());
286 assert
!(vd
.into_iter().eq(vec
));
292 fn test_vec_from_vecdeque() {
295 fn create_vec_and_test_convert(capacity
: usize, offset
: usize, len
: usize) {
296 let mut vd
= VecDeque
::with_capacity(capacity
);
303 let vec
: Vec
<_
> = Vec
::from(vd
.clone());
304 assert_eq
!(vec
.len(), vd
.len());
305 assert
!(vec
.into_iter().eq(vd
));
308 #[cfg(not(miri))] // Miri is too slow
313 for cap_pwr
in 0..max_pwr
{
314 // Make capacity as a (2^x)-1, so that the ring size is 2^x
315 let cap
= (2i32.pow(cap_pwr
) - 1) as usize;
317 // In these cases there is enough free space to solve it with copies
318 for len
in 0..((cap
+ 1) / 2) {
319 // Test contiguous cases
320 for offset
in 0..(cap
- len
) {
321 create_vec_and_test_convert(cap
, offset
, len
)
324 // Test cases where block at end of buffer is bigger than block at start
325 for offset
in (cap
- len
)..(cap
- (len
/ 2)) {
326 create_vec_and_test_convert(cap
, offset
, len
)
329 // Test cases where block at start of buffer is bigger than block at end
330 for offset
in (cap
- (len
/ 2))..cap
{
331 create_vec_and_test_convert(cap
, offset
, len
)
335 // Now there's not (necessarily) space to straighten the ring with simple copies,
336 // the ring will use swapping when:
337 // (cap + 1 - offset) > (cap + 1 - len) && (len - (cap + 1 - offset)) > (cap + 1 - len))
338 // right block size > free space && left block size > free space
339 for len
in ((cap
+ 1) / 2)..cap
{
340 // Test contiguous cases
341 for offset
in 0..(cap
- len
) {
342 create_vec_and_test_convert(cap
, offset
, len
)
345 // Test cases where block at end of buffer is bigger than block at start
346 for offset
in (cap
- len
)..(cap
- (len
/ 2)) {
347 create_vec_and_test_convert(cap
, offset
, len
)
350 // Test cases where block at start of buffer is bigger than block at end
351 for offset
in (cap
- (len
/ 2))..cap
{
352 create_vec_and_test_convert(cap
, offset
, len
)
359 fn test_clone_from() {
365 let (vr
, ur
) = if longer
== 0 { (&m, &n) }
else { (&n, &m) }
;
366 let mut v
= VecDeque
::from(vr
.clone());
370 let mut u
= VecDeque
::from(ur
.clone());
382 fn test_vec_deque_truncate_drop() {
383 static mut DROPS
: u32 = 0;
394 let v
= vec
![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
395 for push_front
in 0..=v
.len() {
397 let mut tester
= VecDeque
::with_capacity(5);
398 for (index
, elem
) in v
.into_iter().enumerate() {
399 if index
< push_front
{
400 tester
.push_front(elem
);
402 tester
.push_back(elem
);
405 assert_eq
!(unsafe { DROPS }
, 0);
407 assert_eq
!(unsafe { DROPS }
, 2);
409 assert_eq
!(unsafe { DROPS }
, 5);
418 use crate::boxed
::Box
;
420 let mut dst
= VecDeque
::new();
421 dst
.push_front(Box
::new(1));
422 dst
.push_front(Box
::new(2));
423 assert_eq
!(*dst
.pop_back().unwrap(), 1);
425 let mut src
= VecDeque
::new();
426 src
.push_front(Box
::new(2));
427 dst
.append(&mut src
);