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