]> git.proxmox.com Git - rustc.git/blame - src/libcollectionstest/slice.rs
Imported Upstream version 1.3.0+dfsg1
[rustc.git] / src / libcollectionstest / slice.rs
CommitLineData
c34b1796
AL
1// Copyright 2012-2015 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.
4//
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.
10
11use std::cmp::Ordering::{Equal, Greater, Less};
12use std::default::Default;
13use std::iter::RandomAccessIterator;
14use std::mem;
9346a6ac 15use std::__rand::{Rng, thread_rng};
c34b1796
AL
16use std::rc::Rc;
17use std::slice::ElementSwaps;
18
19fn square(n: usize) -> usize { n * n }
20
21fn is_odd(n: &usize) -> bool { *n % 2 == 1 }
22
23#[test]
24fn test_from_fn() {
25 // Test on-stack from_fn.
26 let mut v: Vec<_> = (0..3).map(square).collect();
27 {
28 let v = v;
29 assert_eq!(v.len(), 3);
30 assert_eq!(v[0], 0);
31 assert_eq!(v[1], 1);
32 assert_eq!(v[2], 4);
33 }
34
35 // Test on-heap from_fn.
36 v = (0..5).map(square).collect();
37 {
38 let v = v;
39 assert_eq!(v.len(), 5);
40 assert_eq!(v[0], 0);
41 assert_eq!(v[1], 1);
42 assert_eq!(v[2], 4);
43 assert_eq!(v[3], 9);
44 assert_eq!(v[4], 16);
45 }
46}
47
48#[test]
49fn test_from_elem() {
50 // Test on-stack from_elem.
51 let mut v = vec![10, 10];
52 {
53 let v = v;
54 assert_eq!(v.len(), 2);
55 assert_eq!(v[0], 10);
56 assert_eq!(v[1], 10);
57 }
58
59 // Test on-heap from_elem.
60 v = vec![20; 6];
61 {
62 let v = &v[..];
63 assert_eq!(v[0], 20);
64 assert_eq!(v[1], 20);
65 assert_eq!(v[2], 20);
66 assert_eq!(v[3], 20);
67 assert_eq!(v[4], 20);
68 assert_eq!(v[5], 20);
69 }
70}
71
72#[test]
73fn test_is_empty() {
74 let xs: [i32; 0] = [];
75 assert!(xs.is_empty());
76 assert!(![0].is_empty());
77}
78
79#[test]
80fn test_len_divzero() {
81 type Z = [i8; 0];
82 let v0 : &[Z] = &[];
83 let v1 : &[Z] = &[[]];
84 let v2 : &[Z] = &[[], []];
85 assert_eq!(mem::size_of::<Z>(), 0);
86 assert_eq!(v0.len(), 0);
87 assert_eq!(v1.len(), 1);
88 assert_eq!(v2.len(), 2);
89}
90
91#[test]
92fn test_get() {
93 let mut a = vec![11];
94 assert_eq!(a.get(1), None);
95 a = vec![11, 12];
96 assert_eq!(a.get(1).unwrap(), &12);
97 a = vec![11, 12, 13];
98 assert_eq!(a.get(1).unwrap(), &12);
99}
100
101#[test]
102fn test_first() {
103 let mut a = vec![];
104 assert_eq!(a.first(), None);
105 a = vec![11];
106 assert_eq!(a.first().unwrap(), &11);
107 a = vec![11, 12];
108 assert_eq!(a.first().unwrap(), &11);
109}
110
111#[test]
112fn test_first_mut() {
113 let mut a = vec![];
114 assert_eq!(a.first_mut(), None);
115 a = vec![11];
116 assert_eq!(*a.first_mut().unwrap(), 11);
117 a = vec![11, 12];
118 assert_eq!(*a.first_mut().unwrap(), 11);
119}
120
121#[test]
c1a9b12d 122fn test_split_first() {
c34b1796
AL
123 let mut a = vec![11];
124 let b: &[i32] = &[];
c1a9b12d
SL
125 assert!(b.split_first().is_none());
126 assert_eq!(a.split_first(), Some((&11, b)));
c34b1796
AL
127 a = vec![11, 12];
128 let b: &[i32] = &[12];
c1a9b12d 129 assert_eq!(a.split_first(), Some((&11, b)));
c34b1796
AL
130}
131
132#[test]
c1a9b12d 133fn test_split_first_mut() {
c34b1796
AL
134 let mut a = vec![11];
135 let b: &mut [i32] = &mut [];
c1a9b12d
SL
136 assert!(b.split_first_mut().is_none());
137 assert!(a.split_first_mut() == Some((&mut 11, b)));
c34b1796
AL
138 a = vec![11, 12];
139 let b: &mut [_] = &mut [12];
c1a9b12d 140 assert!(a.split_first_mut() == Some((&mut 11, b)));
c34b1796
AL
141}
142
143#[test]
c1a9b12d 144fn test_split_last() {
c34b1796
AL
145 let mut a = vec![11];
146 let b: &[i32] = &[];
c1a9b12d
SL
147 assert!(b.split_last().is_none());
148 assert_eq!(a.split_last(), Some((&11, b)));
c34b1796
AL
149 a = vec![11, 12];
150 let b: &[_] = &[11];
c1a9b12d 151 assert_eq!(a.split_last(), Some((&12, b)));
c34b1796
AL
152}
153
154#[test]
c1a9b12d 155fn test_split_last_mut() {
c34b1796
AL
156 let mut a = vec![11];
157 let b: &mut [i32] = &mut [];
c1a9b12d
SL
158 assert!(b.split_last_mut().is_none());
159 assert!(a.split_last_mut() == Some((&mut 11, b)));
160
c34b1796
AL
161 a = vec![11, 12];
162 let b: &mut [_] = &mut [11];
c1a9b12d 163 assert!(a.split_last_mut() == Some((&mut 12, b)));
c34b1796
AL
164}
165
166#[test]
167fn test_last() {
168 let mut a = vec![];
169 assert_eq!(a.last(), None);
170 a = vec![11];
171 assert_eq!(a.last().unwrap(), &11);
172 a = vec![11, 12];
173 assert_eq!(a.last().unwrap(), &12);
174}
175
176#[test]
177fn test_last_mut() {
178 let mut a = vec![];
179 assert_eq!(a.last_mut(), None);
180 a = vec![11];
181 assert_eq!(*a.last_mut().unwrap(), 11);
182 a = vec![11, 12];
183 assert_eq!(*a.last_mut().unwrap(), 12);
184}
185
186#[test]
187fn test_slice() {
188 // Test fixed length vector.
189 let vec_fixed = [1, 2, 3, 4];
190 let v_a = vec_fixed[1..vec_fixed.len()].to_vec();
191 assert_eq!(v_a.len(), 3);
192
193 assert_eq!(v_a[0], 2);
194 assert_eq!(v_a[1], 3);
195 assert_eq!(v_a[2], 4);
196
197 // Test on stack.
198 let vec_stack: &[_] = &[1, 2, 3];
199 let v_b = vec_stack[1..3].to_vec();
200 assert_eq!(v_b.len(), 2);
201
202 assert_eq!(v_b[0], 2);
203 assert_eq!(v_b[1], 3);
204
205 // Test `Box<[T]>`
206 let vec_unique = vec![1, 2, 3, 4, 5, 6];
207 let v_d = vec_unique[1..6].to_vec();
208 assert_eq!(v_d.len(), 5);
209
210 assert_eq!(v_d[0], 2);
211 assert_eq!(v_d[1], 3);
212 assert_eq!(v_d[2], 4);
213 assert_eq!(v_d[3], 5);
214 assert_eq!(v_d[4], 6);
215}
216
217#[test]
218fn test_slice_from() {
219 let vec: &[_] = &[1, 2, 3, 4];
220 assert_eq!(&vec[..], vec);
221 let b: &[_] = &[3, 4];
222 assert_eq!(&vec[2..], b);
223 let b: &[_] = &[];
224 assert_eq!(&vec[4..], b);
225}
226
227#[test]
228fn test_slice_to() {
229 let vec: &[_] = &[1, 2, 3, 4];
230 assert_eq!(&vec[..4], vec);
231 let b: &[_] = &[1, 2];
232 assert_eq!(&vec[..2], b);
233 let b: &[_] = &[];
234 assert_eq!(&vec[..0], b);
235}
236
237
238#[test]
239fn test_pop() {
240 let mut v = vec![5];
241 let e = v.pop();
242 assert_eq!(v.len(), 0);
243 assert_eq!(e, Some(5));
244 let f = v.pop();
245 assert_eq!(f, None);
246 let g = v.pop();
247 assert_eq!(g, None);
248}
249
250#[test]
251fn test_swap_remove() {
252 let mut v = vec![1, 2, 3, 4, 5];
253 let mut e = v.swap_remove(0);
254 assert_eq!(e, 1);
255 assert_eq!(v, [5, 2, 3, 4]);
256 e = v.swap_remove(3);
257 assert_eq!(e, 4);
258 assert_eq!(v, [5, 2, 3]);
259}
260
261#[test]
262#[should_panic]
263fn test_swap_remove_fail() {
264 let mut v = vec![1];
265 let _ = v.swap_remove(0);
266 let _ = v.swap_remove(0);
267}
268
269#[test]
270fn test_swap_remove_noncopyable() {
271 // Tests that we don't accidentally run destructors twice.
272 let mut v: Vec<Box<_>> = Vec::new();
273 v.push(box 0u8);
274 v.push(box 0u8);
275 v.push(box 0u8);
276 let mut _e = v.swap_remove(0);
277 assert_eq!(v.len(), 2);
278 _e = v.swap_remove(1);
279 assert_eq!(v.len(), 1);
280 _e = v.swap_remove(0);
281 assert_eq!(v.len(), 0);
282}
283
284#[test]
285fn test_push() {
286 // Test on-stack push().
287 let mut v = vec![];
288 v.push(1);
289 assert_eq!(v.len(), 1);
290 assert_eq!(v[0], 1);
291
292 // Test on-heap push().
293 v.push(2);
294 assert_eq!(v.len(), 2);
295 assert_eq!(v[0], 1);
296 assert_eq!(v[1], 2);
297}
298
299#[test]
300fn test_truncate() {
301 let mut v: Vec<Box<_>> = vec![box 6,box 5,box 4];
302 v.truncate(1);
303 let v = v;
304 assert_eq!(v.len(), 1);
305 assert_eq!(*(v[0]), 6);
306 // If the unsafe block didn't drop things properly, we blow up here.
307}
308
309#[test]
310fn test_clear() {
311 let mut v: Vec<Box<_>> = vec![box 6,box 5,box 4];
312 v.clear();
313 assert_eq!(v.len(), 0);
314 // If the unsafe block didn't drop things properly, we blow up here.
315}
316
317#[test]
318fn test_dedup() {
319 fn case(a: Vec<i32>, b: Vec<i32>) {
320 let mut v = a;
321 v.dedup();
322 assert_eq!(v, b);
323 }
324 case(vec![], vec![]);
325 case(vec![1], vec![1]);
326 case(vec![1,1], vec![1]);
327 case(vec![1,2,3], vec![1,2,3]);
328 case(vec![1,1,2,3], vec![1,2,3]);
329 case(vec![1,2,2,3], vec![1,2,3]);
330 case(vec![1,2,3,3], vec![1,2,3]);
331 case(vec![1,1,2,2,2,3,3], vec![1,2,3]);
332}
333
334#[test]
335fn test_dedup_unique() {
336 let mut v0: Vec<Box<_>> = vec![box 1, box 1, box 2, box 3];
337 v0.dedup();
338 let mut v1: Vec<Box<_>> = vec![box 1, box 2, box 2, box 3];
339 v1.dedup();
340 let mut v2: Vec<Box<_>> = vec![box 1, box 2, box 3, box 3];
341 v2.dedup();
342 /*
343 * If the boxed pointers were leaked or otherwise misused, valgrind
344 * and/or rt should raise errors.
345 */
346}
347
348#[test]
349fn test_dedup_shared() {
350 let mut v0: Vec<Box<_>> = vec![box 1, box 1, box 2, box 3];
351 v0.dedup();
352 let mut v1: Vec<Box<_>> = vec![box 1, box 2, box 2, box 3];
353 v1.dedup();
354 let mut v2: Vec<Box<_>> = vec![box 1, box 2, box 3, box 3];
355 v2.dedup();
356 /*
357 * If the pointers were leaked or otherwise misused, valgrind and/or
358 * rt should raise errors.
359 */
360}
361
362#[test]
363fn test_retain() {
364 let mut v = vec![1, 2, 3, 4, 5];
365 v.retain(is_odd);
366 assert_eq!(v, [1, 3, 5]);
367}
368
369#[test]
370fn test_element_swaps() {
371 let mut v = [1, 2, 3];
372 for (i, (a, b)) in ElementSwaps::new(v.len()).enumerate() {
373 v.swap(a, b);
374 match i {
375 0 => assert!(v == [1, 3, 2]),
376 1 => assert!(v == [3, 1, 2]),
377 2 => assert!(v == [3, 2, 1]),
378 3 => assert!(v == [2, 3, 1]),
379 4 => assert!(v == [2, 1, 3]),
380 5 => assert!(v == [1, 2, 3]),
381 _ => panic!(),
382 }
383 }
384}
385
386#[test]
387fn test_lexicographic_permutations() {
388 let v : &mut[_] = &mut[1, 2, 3, 4, 5];
389 assert!(v.prev_permutation() == false);
390 assert!(v.next_permutation());
391 let b: &mut[_] = &mut[1, 2, 3, 5, 4];
392 assert!(v == b);
393 assert!(v.prev_permutation());
394 let b: &mut[_] = &mut[1, 2, 3, 4, 5];
395 assert!(v == b);
396 assert!(v.next_permutation());
397 assert!(v.next_permutation());
398 let b: &mut[_] = &mut[1, 2, 4, 3, 5];
399 assert!(v == b);
400 assert!(v.next_permutation());
401 let b: &mut[_] = &mut[1, 2, 4, 5, 3];
402 assert!(v == b);
403
404 let v : &mut[_] = &mut[1, 0, 0, 0];
405 assert!(v.next_permutation() == false);
406 assert!(v.prev_permutation());
407 let b: &mut[_] = &mut[0, 1, 0, 0];
408 assert!(v == b);
409 assert!(v.prev_permutation());
410 let b: &mut[_] = &mut[0, 0, 1, 0];
411 assert!(v == b);
412 assert!(v.prev_permutation());
413 let b: &mut[_] = &mut[0, 0, 0, 1];
414 assert!(v == b);
415 assert!(v.prev_permutation() == false);
416}
417
418#[test]
419fn test_lexicographic_permutations_empty_and_short() {
420 let empty : &mut[i32] = &mut[];
421 assert!(empty.next_permutation() == false);
422 let b: &mut[i32] = &mut[];
423 assert!(empty == b);
424 assert!(empty.prev_permutation() == false);
425 assert!(empty == b);
426
427 let one_elem : &mut[_] = &mut[4];
428 assert!(one_elem.prev_permutation() == false);
429 let b: &mut[_] = &mut[4];
430 assert!(one_elem == b);
431 assert!(one_elem.next_permutation() == false);
432 assert!(one_elem == b);
433
434 let two_elem : &mut[_] = &mut[1, 2];
435 assert!(two_elem.prev_permutation() == false);
436 let b : &mut[_] = &mut[1, 2];
437 let c : &mut[_] = &mut[2, 1];
438 assert!(two_elem == b);
439 assert!(two_elem.next_permutation());
440 assert!(two_elem == c);
441 assert!(two_elem.next_permutation() == false);
442 assert!(two_elem == c);
443 assert!(two_elem.prev_permutation());
444 assert!(two_elem == b);
445 assert!(two_elem.prev_permutation() == false);
446 assert!(two_elem == b);
447}
448
449#[test]
450fn test_position_elem() {
451 assert!([].position_elem(&1).is_none());
452
453 let v1 = vec![1, 2, 3, 3, 2, 5];
454 assert_eq!(v1.position_elem(&1), Some(0));
455 assert_eq!(v1.position_elem(&2), Some(1));
456 assert_eq!(v1.position_elem(&5), Some(5));
457 assert!(v1.position_elem(&4).is_none());
458}
459
460#[test]
461fn test_binary_search() {
462 assert_eq!([1,2,3,4,5].binary_search(&5).ok(), Some(4));
463 assert_eq!([1,2,3,4,5].binary_search(&4).ok(), Some(3));
464 assert_eq!([1,2,3,4,5].binary_search(&3).ok(), Some(2));
465 assert_eq!([1,2,3,4,5].binary_search(&2).ok(), Some(1));
466 assert_eq!([1,2,3,4,5].binary_search(&1).ok(), Some(0));
467
468 assert_eq!([2,4,6,8,10].binary_search(&1).ok(), None);
469 assert_eq!([2,4,6,8,10].binary_search(&5).ok(), None);
470 assert_eq!([2,4,6,8,10].binary_search(&4).ok(), Some(1));
471 assert_eq!([2,4,6,8,10].binary_search(&10).ok(), Some(4));
472
473 assert_eq!([2,4,6,8].binary_search(&1).ok(), None);
474 assert_eq!([2,4,6,8].binary_search(&5).ok(), None);
475 assert_eq!([2,4,6,8].binary_search(&4).ok(), Some(1));
476 assert_eq!([2,4,6,8].binary_search(&8).ok(), Some(3));
477
478 assert_eq!([2,4,6].binary_search(&1).ok(), None);
479 assert_eq!([2,4,6].binary_search(&5).ok(), None);
480 assert_eq!([2,4,6].binary_search(&4).ok(), Some(1));
481 assert_eq!([2,4,6].binary_search(&6).ok(), Some(2));
482
483 assert_eq!([2,4].binary_search(&1).ok(), None);
484 assert_eq!([2,4].binary_search(&5).ok(), None);
485 assert_eq!([2,4].binary_search(&2).ok(), Some(0));
486 assert_eq!([2,4].binary_search(&4).ok(), Some(1));
487
488 assert_eq!([2].binary_search(&1).ok(), None);
489 assert_eq!([2].binary_search(&5).ok(), None);
490 assert_eq!([2].binary_search(&2).ok(), Some(0));
491
492 assert_eq!([].binary_search(&1).ok(), None);
493 assert_eq!([].binary_search(&5).ok(), None);
494
495 assert!([1,1,1,1,1].binary_search(&1).ok() != None);
496 assert!([1,1,1,1,2].binary_search(&1).ok() != None);
497 assert!([1,1,1,2,2].binary_search(&1).ok() != None);
498 assert!([1,1,2,2,2].binary_search(&1).ok() != None);
499 assert_eq!([1,2,2,2,2].binary_search(&1).ok(), Some(0));
500
501 assert_eq!([1,2,3,4,5].binary_search(&6).ok(), None);
502 assert_eq!([1,2,3,4,5].binary_search(&0).ok(), None);
503}
504
505#[test]
506fn test_reverse() {
507 let mut v = vec![10, 20];
508 assert_eq!(v[0], 10);
509 assert_eq!(v[1], 20);
510 v.reverse();
511 assert_eq!(v[0], 20);
512 assert_eq!(v[1], 10);
513
514 let mut v3 = Vec::<i32>::new();
515 v3.reverse();
516 assert!(v3.is_empty());
517}
518
519#[test]
520fn test_sort() {
521 for len in 4..25 {
522 for _ in 0..100 {
523 let mut v: Vec<_> = thread_rng().gen_iter::<i32>().take(len).collect();
524 let mut v1 = v.clone();
525
526 v.sort();
527 assert!(v.windows(2).all(|w| w[0] <= w[1]));
528
529 v1.sort_by(|a, b| a.cmp(b));
530 assert!(v1.windows(2).all(|w| w[0] <= w[1]));
531
532 v1.sort_by(|a, b| b.cmp(a));
533 assert!(v1.windows(2).all(|w| w[0] >= w[1]));
534 }
535 }
536
537 // shouldn't panic
538 let mut v: [i32; 0] = [];
539 v.sort();
540
541 let mut v = [0xDEADBEEFu64];
542 v.sort();
543 assert!(v == [0xDEADBEEF]);
544}
545
546#[test]
547fn test_sort_stability() {
548 for len in 4..25 {
549 for _ in 0..10 {
550 let mut counts = [0; 10];
551
552 // create a vector like [(6, 1), (5, 1), (6, 2), ...],
553 // where the first item of each tuple is random, but
554 // the second item represents which occurrence of that
555 // number this element is, i.e. the second elements
556 // will occur in sorted order.
557 let mut v: Vec<_> = (0..len).map(|_| {
558 let n = thread_rng().gen::<usize>() % 10;
559 counts[n] += 1;
560 (n, counts[n])
561 }).collect();
562
563 // only sort on the first element, so an unstable sort
564 // may mix up the counts.
565 v.sort_by(|&(a,_), &(b,_)| a.cmp(&b));
566
567 // this comparison includes the count (the second item
568 // of the tuple), so elements with equal first items
569 // will need to be ordered with increasing
570 // counts... i.e. exactly asserting that this sort is
571 // stable.
572 assert!(v.windows(2).all(|w| w[0] <= w[1]));
573 }
574 }
575}
576
577#[test]
578fn test_concat() {
579 let v: [Vec<i32>; 0] = [];
580 let c = v.concat();
581 assert_eq!(c, []);
582 let d = [vec![1], vec![2, 3]].concat();
583 assert_eq!(d, [1, 2, 3]);
584
585 let v: &[&[_]] = &[&[1], &[2, 3]];
c1a9b12d 586 assert_eq!(v.join(&0), [1, 0, 2, 3]);
c34b1796 587 let v: &[&[_]] = &[&[1], &[2], &[3]];
c1a9b12d 588 assert_eq!(v.join(&0), [1, 0, 2, 0, 3]);
c34b1796
AL
589}
590
591#[test]
c1a9b12d 592fn test_join() {
c34b1796 593 let v: [Vec<i32>; 0] = [];
c1a9b12d
SL
594 assert_eq!(v.join(&0), []);
595 assert_eq!([vec![1], vec![2, 3]].join(&0), [1, 0, 2, 3]);
596 assert_eq!([vec![1], vec![2], vec![3]].join(&0), [1, 0, 2, 0, 3]);
c34b1796
AL
597
598 let v: [&[_]; 2] = [&[1], &[2, 3]];
c1a9b12d 599 assert_eq!(v.join(&0), [1, 0, 2, 3]);
c34b1796 600 let v: [&[_]; 3] = [&[1], &[2], &[3]];
c1a9b12d 601 assert_eq!(v.join(&0), [1, 0, 2, 0, 3]);
c34b1796
AL
602}
603
604#[test]
605fn test_insert() {
606 let mut a = vec![1, 2, 4];
607 a.insert(2, 3);
608 assert_eq!(a, [1, 2, 3, 4]);
609
610 let mut a = vec![1, 2, 3];
611 a.insert(0, 0);
612 assert_eq!(a, [0, 1, 2, 3]);
613
614 let mut a = vec![1, 2, 3];
615 a.insert(3, 4);
616 assert_eq!(a, [1, 2, 3, 4]);
617
618 let mut a = vec![];
619 a.insert(0, 1);
620 assert_eq!(a, [1]);
621}
622
623#[test]
624#[should_panic]
625fn test_insert_oob() {
626 let mut a = vec![1, 2, 3];
627 a.insert(4, 5);
628}
629
630#[test]
631fn test_remove() {
632 let mut a = vec![1, 2, 3, 4];
633
634 assert_eq!(a.remove(2), 3);
635 assert_eq!(a, [1, 2, 4]);
636
637 assert_eq!(a.remove(2), 4);
638 assert_eq!(a, [1, 2]);
639
640 assert_eq!(a.remove(0), 1);
641 assert_eq!(a, [2]);
642
643 assert_eq!(a.remove(0), 2);
644 assert_eq!(a, []);
645}
646
647#[test]
648#[should_panic]
649fn test_remove_fail() {
650 let mut a = vec![1];
651 let _ = a.remove(0);
652 let _ = a.remove(0);
653}
654
655#[test]
656fn test_capacity() {
657 let mut v = vec![0];
658 v.reserve_exact(10);
659 assert!(v.capacity() >= 11);
660}
661
662#[test]
663fn test_slice_2() {
664 let v = vec![1, 2, 3, 4, 5];
665 let v = &v[1..3];
666 assert_eq!(v.len(), 2);
667 assert_eq!(v[0], 2);
668 assert_eq!(v[1], 3);
669}
670
671#[test]
672#[should_panic]
673fn test_permute_fail() {
674 let v: [(Box<_>, Rc<_>); 4] =
675 [(box 0, Rc::new(0)), (box 0, Rc::new(0)),
676 (box 0, Rc::new(0)), (box 0, Rc::new(0))];
677 let mut i = 0;
678 for _ in v.permutations() {
679 if i == 2 {
680 panic!()
681 }
682 i += 1;
683 }
684}
685
686#[test]
687fn test_total_ord() {
688 let c = &[1, 2, 3];
689 [1, 2, 3, 4][..].cmp(c) == Greater;
690 let c = &[1, 2, 3, 4];
691 [1, 2, 3][..].cmp(c) == Less;
692 let c = &[1, 2, 3, 6];
693 [1, 2, 3, 4][..].cmp(c) == Equal;
694 let c = &[1, 2, 3, 4, 5, 6];
695 [1, 2, 3, 4, 5, 5, 5, 5][..].cmp(c) == Less;
696 let c = &[1, 2, 3, 4];
697 [2, 2][..].cmp(c) == Greater;
698}
699
700#[test]
701fn test_iterator() {
702 let xs = [1, 2, 5, 10, 11];
703 let mut it = xs.iter();
704 assert_eq!(it.size_hint(), (5, Some(5)));
705 assert_eq!(it.next().unwrap(), &1);
706 assert_eq!(it.size_hint(), (4, Some(4)));
707 assert_eq!(it.next().unwrap(), &2);
708 assert_eq!(it.size_hint(), (3, Some(3)));
709 assert_eq!(it.next().unwrap(), &5);
710 assert_eq!(it.size_hint(), (2, Some(2)));
711 assert_eq!(it.next().unwrap(), &10);
712 assert_eq!(it.size_hint(), (1, Some(1)));
713 assert_eq!(it.next().unwrap(), &11);
714 assert_eq!(it.size_hint(), (0, Some(0)));
715 assert!(it.next().is_none());
716}
717
718#[test]
719fn test_random_access_iterator() {
720 let xs = [1, 2, 5, 10, 11];
721 let mut it = xs.iter();
722
723 assert_eq!(it.indexable(), 5);
724 assert_eq!(it.idx(0).unwrap(), &1);
725 assert_eq!(it.idx(2).unwrap(), &5);
726 assert_eq!(it.idx(4).unwrap(), &11);
727 assert!(it.idx(5).is_none());
728
729 assert_eq!(it.next().unwrap(), &1);
730 assert_eq!(it.indexable(), 4);
731 assert_eq!(it.idx(0).unwrap(), &2);
732 assert_eq!(it.idx(3).unwrap(), &11);
733 assert!(it.idx(4).is_none());
734
735 assert_eq!(it.next().unwrap(), &2);
736 assert_eq!(it.indexable(), 3);
737 assert_eq!(it.idx(1).unwrap(), &10);
738 assert!(it.idx(3).is_none());
739
740 assert_eq!(it.next().unwrap(), &5);
741 assert_eq!(it.indexable(), 2);
742 assert_eq!(it.idx(1).unwrap(), &11);
743
744 assert_eq!(it.next().unwrap(), &10);
745 assert_eq!(it.indexable(), 1);
746 assert_eq!(it.idx(0).unwrap(), &11);
747 assert!(it.idx(1).is_none());
748
749 assert_eq!(it.next().unwrap(), &11);
750 assert_eq!(it.indexable(), 0);
751 assert!(it.idx(0).is_none());
752
753 assert!(it.next().is_none());
754}
755
756#[test]
757fn test_iter_size_hints() {
758 let mut xs = [1, 2, 5, 10, 11];
759 assert_eq!(xs.iter().size_hint(), (5, Some(5)));
760 assert_eq!(xs.iter_mut().size_hint(), (5, Some(5)));
761}
762
763#[test]
764fn test_iter_clone() {
765 let xs = [1, 2, 5];
766 let mut it = xs.iter();
767 it.next();
768 let mut jt = it.clone();
769 assert_eq!(it.next(), jt.next());
770 assert_eq!(it.next(), jt.next());
771 assert_eq!(it.next(), jt.next());
772}
773
774#[test]
775fn test_mut_iterator() {
776 let mut xs = [1, 2, 3, 4, 5];
777 for x in &mut xs {
778 *x += 1;
779 }
780 assert!(xs == [2, 3, 4, 5, 6])
781}
782
783#[test]
784fn test_rev_iterator() {
785
786 let xs = [1, 2, 5, 10, 11];
787 let ys = [11, 10, 5, 2, 1];
788 let mut i = 0;
789 for &x in xs.iter().rev() {
790 assert_eq!(x, ys[i]);
791 i += 1;
792 }
793 assert_eq!(i, 5);
794}
795
796#[test]
797fn test_mut_rev_iterator() {
798 let mut xs = [1, 2, 3, 4, 5];
799 for (i,x) in xs.iter_mut().rev().enumerate() {
800 *x += i;
801 }
802 assert!(xs == [5, 5, 5, 5, 5])
803}
804
805#[test]
806fn test_move_iterator() {
807 let xs = vec![1,2,3,4,5];
808 assert_eq!(xs.into_iter().fold(0, |a: usize, b: usize| 10*a + b), 12345);
809}
810
811#[test]
812fn test_move_rev_iterator() {
813 let xs = vec![1,2,3,4,5];
814 assert_eq!(xs.into_iter().rev().fold(0, |a: usize, b: usize| 10*a + b), 54321);
815}
816
817#[test]
818fn test_splitator() {
819 let xs = &[1,2,3,4,5];
820
821 let splits: &[&[_]] = &[&[1], &[3], &[5]];
822 assert_eq!(xs.split(|x| *x % 2 == 0).collect::<Vec<_>>(),
823 splits);
824 let splits: &[&[_]] = &[&[], &[2,3,4,5]];
825 assert_eq!(xs.split(|x| *x == 1).collect::<Vec<_>>(),
826 splits);
827 let splits: &[&[_]] = &[&[1,2,3,4], &[]];
828 assert_eq!(xs.split(|x| *x == 5).collect::<Vec<_>>(),
829 splits);
830 let splits: &[&[_]] = &[&[1,2,3,4,5]];
831 assert_eq!(xs.split(|x| *x == 10).collect::<Vec<_>>(),
832 splits);
833 let splits: &[&[_]] = &[&[], &[], &[], &[], &[], &[]];
834 assert_eq!(xs.split(|_| true).collect::<Vec<&[i32]>>(),
835 splits);
836
837 let xs: &[i32] = &[];
838 let splits: &[&[i32]] = &[&[]];
839 assert_eq!(xs.split(|x| *x == 5).collect::<Vec<&[i32]>>(), splits);
840}
841
842#[test]
843fn test_splitnator() {
844 let xs = &[1,2,3,4,5];
845
846 let splits: &[&[_]] = &[&[1,2,3,4,5]];
847 assert_eq!(xs.splitn(1, |x| *x % 2 == 0).collect::<Vec<_>>(),
848 splits);
849 let splits: &[&[_]] = &[&[1], &[3,4,5]];
850 assert_eq!(xs.splitn(2, |x| *x % 2 == 0).collect::<Vec<_>>(),
851 splits);
852 let splits: &[&[_]] = &[&[], &[], &[], &[4,5]];
853 assert_eq!(xs.splitn(4, |_| true).collect::<Vec<_>>(),
854 splits);
855
856 let xs: &[i32] = &[];
857 let splits: &[&[i32]] = &[&[]];
858 assert_eq!(xs.splitn(2, |x| *x == 5).collect::<Vec<_>>(), splits);
859}
860
861#[test]
862fn test_splitnator_mut() {
863 let xs = &mut [1,2,3,4,5];
864
865 let splits: &[&mut[_]] = &[&mut [1,2,3,4,5]];
866 assert_eq!(xs.splitn_mut(1, |x| *x % 2 == 0).collect::<Vec<_>>(),
867 splits);
868 let splits: &[&mut[_]] = &[&mut [1], &mut [3,4,5]];
869 assert_eq!(xs.splitn_mut(2, |x| *x % 2 == 0).collect::<Vec<_>>(),
870 splits);
871 let splits: &[&mut[_]] = &[&mut [], &mut [], &mut [], &mut [4,5]];
872 assert_eq!(xs.splitn_mut(4, |_| true).collect::<Vec<_>>(),
873 splits);
874
875 let xs: &mut [i32] = &mut [];
876 let splits: &[&mut[i32]] = &[&mut []];
877 assert_eq!(xs.splitn_mut(2, |x| *x == 5).collect::<Vec<_>>(),
878 splits);
879}
880
881#[test]
882fn test_rsplitator() {
883 let xs = &[1,2,3,4,5];
884
885 let splits: &[&[_]] = &[&[5], &[3], &[1]];
886 assert_eq!(xs.split(|x| *x % 2 == 0).rev().collect::<Vec<_>>(),
887 splits);
888 let splits: &[&[_]] = &[&[2,3,4,5], &[]];
889 assert_eq!(xs.split(|x| *x == 1).rev().collect::<Vec<_>>(),
890 splits);
891 let splits: &[&[_]] = &[&[], &[1,2,3,4]];
892 assert_eq!(xs.split(|x| *x == 5).rev().collect::<Vec<_>>(),
893 splits);
894 let splits: &[&[_]] = &[&[1,2,3,4,5]];
895 assert_eq!(xs.split(|x| *x == 10).rev().collect::<Vec<_>>(),
896 splits);
897
898 let xs: &[i32] = &[];
899 let splits: &[&[i32]] = &[&[]];
900 assert_eq!(xs.split(|x| *x == 5).rev().collect::<Vec<&[i32]>>(), splits);
901}
902
903#[test]
904fn test_rsplitnator() {
905 let xs = &[1,2,3,4,5];
906
907 let splits: &[&[_]] = &[&[1,2,3,4,5]];
908 assert_eq!(xs.rsplitn(1, |x| *x % 2 == 0).collect::<Vec<_>>(),
909 splits);
910 let splits: &[&[_]] = &[&[5], &[1,2,3]];
911 assert_eq!(xs.rsplitn(2, |x| *x % 2 == 0).collect::<Vec<_>>(),
912 splits);
913 let splits: &[&[_]] = &[&[], &[], &[], &[1,2]];
914 assert_eq!(xs.rsplitn(4, |_| true).collect::<Vec<_>>(),
915 splits);
916
917 let xs: &[i32] = &[];
918 let splits: &[&[i32]] = &[&[]];
919 assert_eq!(xs.rsplitn(2, |x| *x == 5).collect::<Vec<&[i32]>>(), splits);
920 assert!(xs.rsplitn(0, |x| *x % 2 == 0).next().is_none());
921}
922
923#[test]
924fn test_windowsator() {
925 let v = &[1,2,3,4];
926
927 let wins: &[&[_]] = &[&[1,2], &[2,3], &[3,4]];
928 assert_eq!(v.windows(2).collect::<Vec<_>>(), wins);
929
930 let wins: &[&[_]] = &[&[1,2,3], &[2,3,4]];
931 assert_eq!(v.windows(3).collect::<Vec<_>>(), wins);
932 assert!(v.windows(6).next().is_none());
933
934 let wins: &[&[_]] = &[&[3,4], &[2,3], &[1,2]];
935 assert_eq!(v.windows(2).rev().collect::<Vec<&[_]>>(), wins);
936 let mut it = v.windows(2);
937 assert_eq!(it.indexable(), 3);
938 let win: &[_] = &[1,2];
939 assert_eq!(it.idx(0).unwrap(), win);
940 let win: &[_] = &[2,3];
941 assert_eq!(it.idx(1).unwrap(), win);
942 let win: &[_] = &[3,4];
943 assert_eq!(it.idx(2).unwrap(), win);
944 assert_eq!(it.idx(3), None);
945}
946
947#[test]
948#[should_panic]
949fn test_windowsator_0() {
950 let v = &[1,2,3,4];
951 let _it = v.windows(0);
952}
953
954#[test]
955fn test_chunksator() {
956 let v = &[1,2,3,4,5];
957
958 assert_eq!(v.chunks(2).len(), 3);
959
960 let chunks: &[&[_]] = &[&[1,2], &[3,4], &[5]];
961 assert_eq!(v.chunks(2).collect::<Vec<_>>(), chunks);
962 let chunks: &[&[_]] = &[&[1,2,3], &[4,5]];
963 assert_eq!(v.chunks(3).collect::<Vec<_>>(), chunks);
964 let chunks: &[&[_]] = &[&[1,2,3,4,5]];
965 assert_eq!(v.chunks(6).collect::<Vec<_>>(), chunks);
966
967 let chunks: &[&[_]] = &[&[5], &[3,4], &[1,2]];
968 assert_eq!(v.chunks(2).rev().collect::<Vec<_>>(), chunks);
969 let mut it = v.chunks(2);
970 assert_eq!(it.indexable(), 3);
971
972 let chunk: &[_] = &[1,2];
973 assert_eq!(it.idx(0).unwrap(), chunk);
974 let chunk: &[_] = &[3,4];
975 assert_eq!(it.idx(1).unwrap(), chunk);
976 let chunk: &[_] = &[5];
977 assert_eq!(it.idx(2).unwrap(), chunk);
978 assert_eq!(it.idx(3), None);
979}
980
981#[test]
982#[should_panic]
983fn test_chunksator_0() {
984 let v = &[1,2,3,4];
985 let _it = v.chunks(0);
986}
987
988#[test]
989fn test_move_from() {
990 let mut a = [1,2,3,4,5];
991 let b = vec![6,7,8];
992 assert_eq!(a.move_from(b, 0, 3), 3);
993 assert!(a == [6,7,8,4,5]);
994 let mut a = [7,2,8,1];
995 let b = vec![3,1,4,1,5,9];
996 assert_eq!(a.move_from(b, 0, 6), 4);
997 assert!(a == [3,1,4,1]);
998 let mut a = [1,2,3,4];
999 let b = vec![5,6,7,8,9,0];
1000 assert_eq!(a.move_from(b, 2, 3), 1);
1001 assert!(a == [7,2,3,4]);
1002 let mut a = [1,2,3,4,5];
1003 let b = vec![5,6,7,8,9,0];
1004 assert_eq!(a[2..4].move_from(b,1,6), 2);
1005 assert!(a == [1,2,6,7,5]);
1006}
1007
1008#[test]
1009fn test_reverse_part() {
1010 let mut values = [1,2,3,4,5];
1011 values[1..4].reverse();
1012 assert!(values == [1,4,3,2,5]);
1013}
1014
1015#[test]
1016fn test_show() {
1017 macro_rules! test_show_vec {
1018 ($x:expr, $x_str:expr) => ({
1019 let (x, x_str) = ($x, $x_str);
1020 assert_eq!(format!("{:?}", x), x_str);
1021 assert_eq!(format!("{:?}", x), x_str);
1022 })
1023 }
1024 let empty = Vec::<i32>::new();
1025 test_show_vec!(empty, "[]");
1026 test_show_vec!(vec![1], "[1]");
1027 test_show_vec!(vec![1, 2, 3], "[1, 2, 3]");
1028 test_show_vec!(vec![vec![], vec![1], vec![1, 1]],
1029 "[[], [1], [1, 1]]");
1030
1031 let empty_mut: &mut [i32] = &mut[];
1032 test_show_vec!(empty_mut, "[]");
1033 let v = &mut[1];
1034 test_show_vec!(v, "[1]");
1035 let v = &mut[1, 2, 3];
1036 test_show_vec!(v, "[1, 2, 3]");
1037 let v: &mut[&mut[_]] = &mut[&mut[], &mut[1], &mut[1, 1]];
1038 test_show_vec!(v, "[[], [1], [1, 1]]");
1039}
1040
1041#[test]
1042fn test_vec_default() {
1043 macro_rules! t {
1044 ($ty:ty) => {{
1045 let v: $ty = Default::default();
1046 assert!(v.is_empty());
1047 }}
1048 }
1049
1050 t!(&[i32]);
1051 t!(Vec<i32>);
1052}
1053
1054#[test]
1055fn test_bytes_set_memory() {
1056 use std::slice::bytes::MutableByteVector;
1057
1058 let mut values = [1,2,3,4,5];
1059 values[0..5].set_memory(0xAB);
1060 assert!(values == [0xAB, 0xAB, 0xAB, 0xAB, 0xAB]);
1061 values[2..4].set_memory(0xFF);
1062 assert!(values == [0xAB, 0xAB, 0xFF, 0xFF, 0xAB]);
1063}
1064
1065#[test]
1066#[should_panic]
1067fn test_overflow_does_not_cause_segfault() {
1068 let mut v = vec![];
1069 v.reserve_exact(!0);
1070 v.push(1);
1071 v.push(2);
1072}
1073
1074#[test]
1075#[should_panic]
1076fn test_overflow_does_not_cause_segfault_managed() {
1077 let mut v = vec![Rc::new(1)];
1078 v.reserve_exact(!0);
1079 v.push(Rc::new(2));
1080}
1081
1082#[test]
1083fn test_mut_split_at() {
1084 let mut values = [1u8,2,3,4,5];
1085 {
1086 let (left, right) = values.split_at_mut(2);
1087 {
1088 let left: &[_] = left;
1089 assert!(left[..left.len()] == [1, 2]);
1090 }
1091 for p in left {
1092 *p += 1;
1093 }
1094
1095 {
1096 let right: &[_] = right;
1097 assert!(right[..right.len()] == [3, 4, 5]);
1098 }
1099 for p in right {
1100 *p += 2;
1101 }
1102 }
1103
1104 assert!(values == [2, 3, 5, 6, 7]);
1105}
1106
1107#[derive(Clone, PartialEq)]
1108struct Foo;
1109
1110#[test]
1111fn test_iter_zero_sized() {
1112 let mut v = vec![Foo, Foo, Foo];
1113 assert_eq!(v.len(), 3);
1114 let mut cnt = 0;
1115
1116 for f in &v {
1117 assert!(*f == Foo);
1118 cnt += 1;
1119 }
1120 assert_eq!(cnt, 3);
1121
1122 for f in &v[1..3] {
1123 assert!(*f == Foo);
1124 cnt += 1;
1125 }
1126 assert_eq!(cnt, 5);
1127
1128 for f in &mut v {
1129 assert!(*f == Foo);
1130 cnt += 1;
1131 }
1132 assert_eq!(cnt, 8);
1133
1134 for f in v {
1135 assert!(f == Foo);
1136 cnt += 1;
1137 }
1138 assert_eq!(cnt, 11);
1139
1140 let xs: [Foo; 3] = [Foo, Foo, Foo];
1141 cnt = 0;
1142 for f in &xs {
1143 assert!(*f == Foo);
1144 cnt += 1;
1145 }
1146 assert!(cnt == 3);
1147}
1148
1149#[test]
1150fn test_shrink_to_fit() {
1151 let mut xs = vec![0, 1, 2, 3];
1152 for i in 4..100 {
1153 xs.push(i)
1154 }
1155 assert_eq!(xs.capacity(), 128);
1156 xs.shrink_to_fit();
1157 assert_eq!(xs.capacity(), 100);
1158 assert_eq!(xs, (0..100).collect::<Vec<_>>());
1159}
1160
1161#[test]
1162fn test_starts_with() {
1163 assert!(b"foobar".starts_with(b"foo"));
1164 assert!(!b"foobar".starts_with(b"oob"));
1165 assert!(!b"foobar".starts_with(b"bar"));
1166 assert!(!b"foo".starts_with(b"foobar"));
1167 assert!(!b"bar".starts_with(b"foobar"));
1168 assert!(b"foobar".starts_with(b"foobar"));
1169 let empty: &[u8] = &[];
1170 assert!(empty.starts_with(empty));
1171 assert!(!empty.starts_with(b"foo"));
1172 assert!(b"foobar".starts_with(empty));
1173}
1174
1175#[test]
1176fn test_ends_with() {
1177 assert!(b"foobar".ends_with(b"bar"));
1178 assert!(!b"foobar".ends_with(b"oba"));
1179 assert!(!b"foobar".ends_with(b"foo"));
1180 assert!(!b"foo".ends_with(b"foobar"));
1181 assert!(!b"bar".ends_with(b"foobar"));
1182 assert!(b"foobar".ends_with(b"foobar"));
1183 let empty: &[u8] = &[];
1184 assert!(empty.ends_with(empty));
1185 assert!(!empty.ends_with(b"foo"));
1186 assert!(b"foobar".ends_with(empty));
1187}
1188
1189#[test]
1190fn test_mut_splitator() {
1191 let mut xs = [0,1,0,2,3,0,0,4,5,0];
1192 assert_eq!(xs.split_mut(|x| *x == 0).count(), 6);
1193 for slice in xs.split_mut(|x| *x == 0) {
1194 slice.reverse();
1195 }
1196 assert!(xs == [0,1,0,3,2,0,0,5,4,0]);
1197
1198 let mut xs = [0,1,0,2,3,0,0,4,5,0,6,7];
1199 for slice in xs.split_mut(|x| *x == 0).take(5) {
1200 slice.reverse();
1201 }
1202 assert!(xs == [0,1,0,3,2,0,0,5,4,0,6,7]);
1203}
1204
1205#[test]
1206fn test_mut_splitator_rev() {
1207 let mut xs = [1,2,0,3,4,0,0,5,6,0];
1208 for slice in xs.split_mut(|x| *x == 0).rev().take(4) {
1209 slice.reverse();
1210 }
1211 assert!(xs == [1,2,0,4,3,0,0,6,5,0]);
1212}
1213
1214#[test]
1215fn test_get_mut() {
1216 let mut v = [0,1,2];
1217 assert_eq!(v.get_mut(3), None);
1218 v.get_mut(1).map(|e| *e = 7);
1219 assert_eq!(v[1], 7);
1220 let mut x = 2;
1221 assert_eq!(v.get_mut(2), Some(&mut x));
1222}
1223
1224#[test]
1225fn test_mut_chunks() {
1226 let mut v = [0, 1, 2, 3, 4, 5, 6];
1227 assert_eq!(v.chunks_mut(2).len(), 4);
1228 for (i, chunk) in v.chunks_mut(3).enumerate() {
1229 for x in chunk {
1230 *x = i as u8;
1231 }
1232 }
1233 let result = [0, 0, 0, 1, 1, 1, 2];
1234 assert!(v == result);
1235}
1236
1237#[test]
1238fn test_mut_chunks_rev() {
1239 let mut v = [0, 1, 2, 3, 4, 5, 6];
1240 for (i, chunk) in v.chunks_mut(3).rev().enumerate() {
1241 for x in chunk {
1242 *x = i as u8;
1243 }
1244 }
1245 let result = [2, 2, 2, 1, 1, 1, 0];
1246 assert!(v == result);
1247}
1248
1249#[test]
1250#[should_panic]
1251fn test_mut_chunks_0() {
1252 let mut v = [1, 2, 3, 4];
1253 let _it = v.chunks_mut(0);
1254}
1255
1256#[test]
1257fn test_mut_last() {
1258 let mut x = [1, 2, 3, 4, 5];
1259 let h = x.last_mut();
1260 assert_eq!(*h.unwrap(), 5);
1261
1262 let y: &mut [i32] = &mut [];
1263 assert!(y.last_mut().is_none());
1264}
1265
1266#[test]
1267fn test_to_vec() {
1268 let xs: Box<_> = box [1, 2, 3];
1269 let ys = xs.to_vec();
1270 assert_eq!(ys, [1, 2, 3]);
1271}
1272
c1a9b12d
SL
1273#[test]
1274fn test_box_slice_clone() {
1275 let data = vec![vec![0, 1], vec![0], vec![1]];
1276 let data2 = data.clone().into_boxed_slice().clone().to_vec();
1277
1278 assert_eq!(data, data2);
1279}
1280
1281#[test]
1282fn test_box_slice_clone_panics() {
1283 use std::sync::Arc;
1284 use std::sync::atomic::{AtomicUsize, Ordering};
1285 use std::thread::spawn;
1286
1287 struct Canary {
1288 count: Arc<AtomicUsize>,
1289 panics: bool
1290 }
1291
1292 impl Drop for Canary {
1293 fn drop(&mut self) {
1294 self.count.fetch_add(1, Ordering::SeqCst);
1295 }
1296 }
1297
1298 impl Clone for Canary {
1299 fn clone(&self) -> Self {
1300 if self.panics { panic!() }
1301
1302 Canary {
1303 count: self.count.clone(),
1304 panics: self.panics
1305 }
1306 }
1307 }
1308
1309 let drop_count = Arc::new(AtomicUsize::new(0));
1310 let canary = Canary { count: drop_count.clone(), panics: false };
1311 let panic = Canary { count: drop_count.clone(), panics: true };
1312
1313 spawn(move || {
1314 // When xs is dropped, +5.
1315 let xs = vec![canary.clone(), canary.clone(), canary.clone(),
1316 panic, canary].into_boxed_slice();
1317
1318 // When panic is cloned, +3.
1319 xs.clone();
1320 }).join().unwrap_err();
1321
1322 // Total = 8
1323 assert_eq!(drop_count.load(Ordering::SeqCst), 8);
1324}
1325
c34b1796
AL
1326mod bench {
1327 use std::iter::repeat;
1328 use std::{mem, ptr};
9346a6ac 1329 use std::__rand::{Rng, thread_rng};
c34b1796
AL
1330
1331 use test::{Bencher, black_box};
1332
1333 #[bench]
1334 fn iterator(b: &mut Bencher) {
1335 // peculiar numbers to stop LLVM from optimising the summation
1336 // out.
1337 let v: Vec<_> = (0..100).map(|i| i ^ (i << 1) ^ (i >> 1)).collect();
1338
1339 b.iter(|| {
1340 let mut sum = 0;
1341 for x in &v {
1342 sum += *x;
1343 }
1344 // sum == 11806, to stop dead code elimination.
1345 if sum == 0 {panic!()}
1346 })
1347 }
1348
1349 #[bench]
1350 fn mut_iterator(b: &mut Bencher) {
c1a9b12d 1351 let mut v = vec![0; 100];
c34b1796
AL
1352
1353 b.iter(|| {
1354 let mut i = 0;
1355 for x in &mut v {
1356 *x = i;
1357 i += 1;
1358 }
1359 })
1360 }
1361
1362 #[bench]
1363 fn concat(b: &mut Bencher) {
1364 let xss: Vec<Vec<i32>> =
1365 (0..100).map(|i| (0..i).collect()).collect();
1366 b.iter(|| {
1367 xss.concat();
1368 });
1369 }
1370
1371 #[bench]
c1a9b12d 1372 fn join(b: &mut Bencher) {
c34b1796
AL
1373 let xss: Vec<Vec<i32>> =
1374 (0..100).map(|i| (0..i).collect()).collect();
1375 b.iter(|| {
c1a9b12d 1376 xss.join(&0)
c34b1796
AL
1377 });
1378 }
1379
1380 #[bench]
1381 fn push(b: &mut Bencher) {
1382 let mut vec = Vec::<i32>::new();
1383 b.iter(|| {
1384 vec.push(0);
1385 black_box(&vec);
1386 });
1387 }
1388
1389 #[bench]
1390 fn starts_with_same_vector(b: &mut Bencher) {
1391 let vec: Vec<_> = (0..100).collect();
1392 b.iter(|| {
1393 vec.starts_with(&vec)
1394 })
1395 }
1396
1397 #[bench]
1398 fn starts_with_single_element(b: &mut Bencher) {
1399 let vec: Vec<_> = vec![0];
1400 b.iter(|| {
1401 vec.starts_with(&vec)
1402 })
1403 }
1404
1405 #[bench]
1406 fn starts_with_diff_one_element_at_end(b: &mut Bencher) {
1407 let vec: Vec<_> = (0..100).collect();
1408 let mut match_vec: Vec<_> = (0..99).collect();
1409 match_vec.push(0);
1410 b.iter(|| {
1411 vec.starts_with(&match_vec)
1412 })
1413 }
1414
1415 #[bench]
1416 fn ends_with_same_vector(b: &mut Bencher) {
1417 let vec: Vec<_> = (0..100).collect();
1418 b.iter(|| {
1419 vec.ends_with(&vec)
1420 })
1421 }
1422
1423 #[bench]
1424 fn ends_with_single_element(b: &mut Bencher) {
1425 let vec: Vec<_> = vec![0];
1426 b.iter(|| {
1427 vec.ends_with(&vec)
1428 })
1429 }
1430
1431 #[bench]
1432 fn ends_with_diff_one_element_at_beginning(b: &mut Bencher) {
1433 let vec: Vec<_> = (0..100).collect();
1434 let mut match_vec: Vec<_> = (0..100).collect();
1435 match_vec[0] = 200;
1436 b.iter(|| {
1437 vec.starts_with(&match_vec)
1438 })
1439 }
1440
1441 #[bench]
1442 fn contains_last_element(b: &mut Bencher) {
1443 let vec: Vec<_> = (0..100).collect();
1444 b.iter(|| {
1445 vec.contains(&99)
1446 })
1447 }
1448
1449 #[bench]
1450 fn zero_1kb_from_elem(b: &mut Bencher) {
1451 b.iter(|| {
c1a9b12d 1452 vec![0u8; 1024]
c34b1796
AL
1453 });
1454 }
1455
1456 #[bench]
1457 fn zero_1kb_set_memory(b: &mut Bencher) {
1458 b.iter(|| {
1459 let mut v = Vec::<u8>::with_capacity(1024);
1460 unsafe {
1461 let vp = v.as_mut_ptr();
1462 ptr::write_bytes(vp, 0, 1024);
1463 v.set_len(1024);
1464 }
1465 v
1466 });
1467 }
1468
1469 #[bench]
1470 fn zero_1kb_loop_set(b: &mut Bencher) {
1471 b.iter(|| {
1472 let mut v = Vec::<u8>::with_capacity(1024);
1473 unsafe {
1474 v.set_len(1024);
1475 }
1476 for i in 0..1024 {
1477 v[i] = 0;
1478 }
1479 });
1480 }
1481
1482 #[bench]
1483 fn zero_1kb_mut_iter(b: &mut Bencher) {
1484 b.iter(|| {
1485 let mut v = Vec::<u8>::with_capacity(1024);
1486 unsafe {
1487 v.set_len(1024);
1488 }
1489 for x in &mut v {
1490 *x = 0;
1491 }
1492 v
1493 });
1494 }
1495
1496 #[bench]
1497 fn random_inserts(b: &mut Bencher) {
9346a6ac 1498 let mut rng = thread_rng();
c34b1796 1499 b.iter(|| {
c1a9b12d 1500 let mut v = vec![(0, 0); 30];
c34b1796
AL
1501 for _ in 0..100 {
1502 let l = v.len();
1503 v.insert(rng.gen::<usize>() % (l + 1),
1504 (1, 1));
1505 }
1506 })
1507 }
1508 #[bench]
1509 fn random_removes(b: &mut Bencher) {
9346a6ac 1510 let mut rng = thread_rng();
c34b1796 1511 b.iter(|| {
c1a9b12d 1512 let mut v = vec![(0, 0); 130];
c34b1796
AL
1513 for _ in 0..100 {
1514 let l = v.len();
1515 v.remove(rng.gen::<usize>() % l);
1516 }
1517 })
1518 }
1519
1520 #[bench]
1521 fn sort_random_small(b: &mut Bencher) {
9346a6ac 1522 let mut rng = thread_rng();
c34b1796
AL
1523 b.iter(|| {
1524 let mut v: Vec<_> = rng.gen_iter::<u64>().take(5).collect();
1525 v.sort();
1526 });
1527 b.bytes = 5 * mem::size_of::<u64>() as u64;
1528 }
1529
1530 #[bench]
1531 fn sort_random_medium(b: &mut Bencher) {
9346a6ac 1532 let mut rng = thread_rng();
c34b1796
AL
1533 b.iter(|| {
1534 let mut v: Vec<_> = rng.gen_iter::<u64>().take(100).collect();
1535 v.sort();
1536 });
1537 b.bytes = 100 * mem::size_of::<u64>() as u64;
1538 }
1539
1540 #[bench]
1541 fn sort_random_large(b: &mut Bencher) {
9346a6ac 1542 let mut rng = thread_rng();
c34b1796
AL
1543 b.iter(|| {
1544 let mut v: Vec<_> = rng.gen_iter::<u64>().take(10000).collect();
1545 v.sort();
1546 });
1547 b.bytes = 10000 * mem::size_of::<u64>() as u64;
1548 }
1549
1550 #[bench]
1551 fn sort_sorted(b: &mut Bencher) {
1552 let mut v: Vec<_> = (0..10000).collect();
1553 b.iter(|| {
1554 v.sort();
1555 });
1556 b.bytes = (v.len() * mem::size_of_val(&v[0])) as u64;
1557 }
1558
1559 type BigSortable = (u64, u64, u64, u64);
1560
1561 #[bench]
1562 fn sort_big_random_small(b: &mut Bencher) {
9346a6ac 1563 let mut rng = thread_rng();
c34b1796
AL
1564 b.iter(|| {
1565 let mut v = rng.gen_iter::<BigSortable>().take(5)
1566 .collect::<Vec<BigSortable>>();
1567 v.sort();
1568 });
1569 b.bytes = 5 * mem::size_of::<BigSortable>() as u64;
1570 }
1571
1572 #[bench]
1573 fn sort_big_random_medium(b: &mut Bencher) {
9346a6ac 1574 let mut rng = thread_rng();
c34b1796
AL
1575 b.iter(|| {
1576 let mut v = rng.gen_iter::<BigSortable>().take(100)
1577 .collect::<Vec<BigSortable>>();
1578 v.sort();
1579 });
1580 b.bytes = 100 * mem::size_of::<BigSortable>() as u64;
1581 }
1582
1583 #[bench]
1584 fn sort_big_random_large(b: &mut Bencher) {
9346a6ac 1585 let mut rng = thread_rng();
c34b1796
AL
1586 b.iter(|| {
1587 let mut v = rng.gen_iter::<BigSortable>().take(10000)
1588 .collect::<Vec<BigSortable>>();
1589 v.sort();
1590 });
1591 b.bytes = 10000 * mem::size_of::<BigSortable>() as u64;
1592 }
1593
1594 #[bench]
1595 fn sort_big_sorted(b: &mut Bencher) {
1596 let mut v: Vec<BigSortable> = (0..10000).map(|i| (i, i, i, i)).collect();
1597 b.iter(|| {
1598 v.sort();
1599 });
1600 b.bytes = (v.len() * mem::size_of_val(&v[0])) as u64;
1601 }
1602}