]> git.lizzy.rs Git - rust.git/blob - src/libcollectionstest/slice.rs
std: Remove deprecated functionality from 1.5
[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 #[should_panic]
871 fn test_overflow_does_not_cause_segfault() {
872     let mut v = vec![];
873     v.reserve_exact(!0);
874     v.push(1);
875     v.push(2);
876 }
877
878 #[test]
879 #[should_panic]
880 fn test_overflow_does_not_cause_segfault_managed() {
881     let mut v = vec![Rc::new(1)];
882     v.reserve_exact(!0);
883     v.push(Rc::new(2));
884 }
885
886 #[test]
887 fn test_mut_split_at() {
888     let mut values = [1u8,2,3,4,5];
889     {
890         let (left, right) = values.split_at_mut(2);
891         {
892             let left: &[_] = left;
893             assert!(left[..left.len()] == [1, 2]);
894         }
895         for p in left {
896             *p += 1;
897         }
898
899         {
900             let right: &[_] = right;
901             assert!(right[..right.len()] == [3, 4, 5]);
902         }
903         for p in right {
904             *p += 2;
905         }
906     }
907
908     assert!(values == [2, 3, 5, 6, 7]);
909 }
910
911 #[derive(Clone, PartialEq)]
912 struct Foo;
913
914 #[test]
915 fn test_iter_zero_sized() {
916     let mut v = vec![Foo, Foo, Foo];
917     assert_eq!(v.len(), 3);
918     let mut cnt = 0;
919
920     for f in &v {
921         assert!(*f == Foo);
922         cnt += 1;
923     }
924     assert_eq!(cnt, 3);
925
926     for f in &v[1..3] {
927         assert!(*f == Foo);
928         cnt += 1;
929     }
930     assert_eq!(cnt, 5);
931
932     for f in &mut v {
933         assert!(*f == Foo);
934         cnt += 1;
935     }
936     assert_eq!(cnt, 8);
937
938     for f in v {
939         assert!(f == Foo);
940         cnt += 1;
941     }
942     assert_eq!(cnt, 11);
943
944     let xs: [Foo; 3] = [Foo, Foo, Foo];
945     cnt = 0;
946     for f in &xs {
947         assert!(*f == Foo);
948         cnt += 1;
949     }
950     assert!(cnt == 3);
951 }
952
953 #[test]
954 fn test_shrink_to_fit() {
955     let mut xs = vec![0, 1, 2, 3];
956     for i in 4..100 {
957         xs.push(i)
958     }
959     assert_eq!(xs.capacity(), 128);
960     xs.shrink_to_fit();
961     assert_eq!(xs.capacity(), 100);
962     assert_eq!(xs, (0..100).collect::<Vec<_>>());
963 }
964
965 #[test]
966 fn test_starts_with() {
967     assert!(b"foobar".starts_with(b"foo"));
968     assert!(!b"foobar".starts_with(b"oob"));
969     assert!(!b"foobar".starts_with(b"bar"));
970     assert!(!b"foo".starts_with(b"foobar"));
971     assert!(!b"bar".starts_with(b"foobar"));
972     assert!(b"foobar".starts_with(b"foobar"));
973     let empty: &[u8] = &[];
974     assert!(empty.starts_with(empty));
975     assert!(!empty.starts_with(b"foo"));
976     assert!(b"foobar".starts_with(empty));
977 }
978
979 #[test]
980 fn test_ends_with() {
981     assert!(b"foobar".ends_with(b"bar"));
982     assert!(!b"foobar".ends_with(b"oba"));
983     assert!(!b"foobar".ends_with(b"foo"));
984     assert!(!b"foo".ends_with(b"foobar"));
985     assert!(!b"bar".ends_with(b"foobar"));
986     assert!(b"foobar".ends_with(b"foobar"));
987     let empty: &[u8] = &[];
988     assert!(empty.ends_with(empty));
989     assert!(!empty.ends_with(b"foo"));
990     assert!(b"foobar".ends_with(empty));
991 }
992
993 #[test]
994 fn test_mut_splitator() {
995     let mut xs = [0,1,0,2,3,0,0,4,5,0];
996     assert_eq!(xs.split_mut(|x| *x == 0).count(), 6);
997     for slice in xs.split_mut(|x| *x == 0) {
998         slice.reverse();
999     }
1000     assert!(xs == [0,1,0,3,2,0,0,5,4,0]);
1001
1002     let mut xs = [0,1,0,2,3,0,0,4,5,0,6,7];
1003     for slice in xs.split_mut(|x| *x == 0).take(5) {
1004         slice.reverse();
1005     }
1006     assert!(xs == [0,1,0,3,2,0,0,5,4,0,6,7]);
1007 }
1008
1009 #[test]
1010 fn test_mut_splitator_rev() {
1011     let mut xs = [1,2,0,3,4,0,0,5,6,0];
1012     for slice in xs.split_mut(|x| *x == 0).rev().take(4) {
1013         slice.reverse();
1014     }
1015     assert!(xs == [1,2,0,4,3,0,0,6,5,0]);
1016 }
1017
1018 #[test]
1019 fn test_get_mut() {
1020     let mut v = [0,1,2];
1021     assert_eq!(v.get_mut(3), None);
1022     v.get_mut(1).map(|e| *e = 7);
1023     assert_eq!(v[1], 7);
1024     let mut x = 2;
1025     assert_eq!(v.get_mut(2), Some(&mut x));
1026 }
1027
1028 #[test]
1029 fn test_mut_chunks() {
1030     let mut v = [0, 1, 2, 3, 4, 5, 6];
1031     assert_eq!(v.chunks_mut(2).len(), 4);
1032     for (i, chunk) in v.chunks_mut(3).enumerate() {
1033         for x in chunk {
1034             *x = i as u8;
1035         }
1036     }
1037     let result = [0, 0, 0, 1, 1, 1, 2];
1038     assert!(v == result);
1039 }
1040
1041 #[test]
1042 fn test_mut_chunks_rev() {
1043     let mut v = [0, 1, 2, 3, 4, 5, 6];
1044     for (i, chunk) in v.chunks_mut(3).rev().enumerate() {
1045         for x in chunk {
1046             *x = i as u8;
1047         }
1048     }
1049     let result = [2, 2, 2, 1, 1, 1, 0];
1050     assert!(v == result);
1051 }
1052
1053 #[test]
1054 #[should_panic]
1055 fn test_mut_chunks_0() {
1056     let mut v = [1, 2, 3, 4];
1057     let _it = v.chunks_mut(0);
1058 }
1059
1060 #[test]
1061 fn test_mut_last() {
1062     let mut x = [1, 2, 3, 4, 5];
1063     let h = x.last_mut();
1064     assert_eq!(*h.unwrap(), 5);
1065
1066     let y: &mut [i32] = &mut [];
1067     assert!(y.last_mut().is_none());
1068 }
1069
1070 #[test]
1071 fn test_to_vec() {
1072     let xs: Box<_> = box [1, 2, 3];
1073     let ys = xs.to_vec();
1074     assert_eq!(ys, [1, 2, 3]);
1075 }
1076
1077 #[test]
1078 fn test_box_slice_clone() {
1079     let data = vec![vec![0, 1], vec![0], vec![1]];
1080     let data2 = data.clone().into_boxed_slice().clone().to_vec();
1081
1082     assert_eq!(data, data2);
1083 }
1084
1085 #[test]
1086 fn test_box_slice_clone_panics() {
1087     use std::sync::Arc;
1088     use std::sync::atomic::{AtomicUsize, Ordering};
1089     use std::thread::spawn;
1090
1091     struct Canary {
1092         count: Arc<AtomicUsize>,
1093         panics: bool
1094     }
1095
1096     impl Drop for Canary {
1097         fn drop(&mut self) {
1098             self.count.fetch_add(1, Ordering::SeqCst);
1099         }
1100     }
1101
1102     impl Clone for Canary {
1103         fn clone(&self) -> Self {
1104             if self.panics { panic!() }
1105
1106             Canary {
1107                 count: self.count.clone(),
1108                 panics: self.panics
1109             }
1110         }
1111     }
1112
1113     let drop_count = Arc::new(AtomicUsize::new(0));
1114     let canary = Canary { count: drop_count.clone(), panics: false };
1115     let panic = Canary { count: drop_count.clone(), panics: true };
1116
1117     spawn(move || {
1118         // When xs is dropped, +5.
1119         let xs = vec![canary.clone(), canary.clone(), canary.clone(),
1120                       panic, canary].into_boxed_slice();
1121
1122         // When panic is cloned, +3.
1123         xs.clone();
1124     }).join().unwrap_err();
1125
1126     // Total = 8
1127     assert_eq!(drop_count.load(Ordering::SeqCst), 8);
1128 }
1129
1130 mod bench {
1131     use std::{mem, ptr};
1132     use std::__rand::{Rng, thread_rng};
1133
1134     use test::{Bencher, black_box};
1135
1136     #[bench]
1137     fn iterator(b: &mut Bencher) {
1138         // peculiar numbers to stop LLVM from optimising the summation
1139         // out.
1140         let v: Vec<_> = (0..100).map(|i| i ^ (i << 1) ^ (i >> 1)).collect();
1141
1142         b.iter(|| {
1143             let mut sum = 0;
1144             for x in &v {
1145                 sum += *x;
1146             }
1147             // sum == 11806, to stop dead code elimination.
1148             if sum == 0 {panic!()}
1149         })
1150     }
1151
1152     #[bench]
1153     fn mut_iterator(b: &mut Bencher) {
1154         let mut v = vec![0; 100];
1155
1156         b.iter(|| {
1157             let mut i = 0;
1158             for x in &mut v {
1159                 *x = i;
1160                 i += 1;
1161             }
1162         })
1163     }
1164
1165     #[bench]
1166     fn concat(b: &mut Bencher) {
1167         let xss: Vec<Vec<i32>> =
1168             (0..100).map(|i| (0..i).collect()).collect();
1169         b.iter(|| {
1170             xss.concat();
1171         });
1172     }
1173
1174     #[bench]
1175     fn join(b: &mut Bencher) {
1176         let xss: Vec<Vec<i32>> =
1177             (0..100).map(|i| (0..i).collect()).collect();
1178         b.iter(|| {
1179             xss.join(&0)
1180         });
1181     }
1182
1183     #[bench]
1184     fn push(b: &mut Bencher) {
1185         let mut vec = Vec::<i32>::new();
1186         b.iter(|| {
1187             vec.push(0);
1188             black_box(&vec);
1189         });
1190     }
1191
1192     #[bench]
1193     fn starts_with_same_vector(b: &mut Bencher) {
1194         let vec: Vec<_> = (0..100).collect();
1195         b.iter(|| {
1196             vec.starts_with(&vec)
1197         })
1198     }
1199
1200     #[bench]
1201     fn starts_with_single_element(b: &mut Bencher) {
1202         let vec: Vec<_> = vec![0];
1203         b.iter(|| {
1204             vec.starts_with(&vec)
1205         })
1206     }
1207
1208     #[bench]
1209     fn starts_with_diff_one_element_at_end(b: &mut Bencher) {
1210         let vec: Vec<_> = (0..100).collect();
1211         let mut match_vec: Vec<_> = (0..99).collect();
1212         match_vec.push(0);
1213         b.iter(|| {
1214             vec.starts_with(&match_vec)
1215         })
1216     }
1217
1218     #[bench]
1219     fn ends_with_same_vector(b: &mut Bencher) {
1220         let vec: Vec<_> = (0..100).collect();
1221         b.iter(|| {
1222             vec.ends_with(&vec)
1223         })
1224     }
1225
1226     #[bench]
1227     fn ends_with_single_element(b: &mut Bencher) {
1228         let vec: Vec<_> = vec![0];
1229         b.iter(|| {
1230             vec.ends_with(&vec)
1231         })
1232     }
1233
1234     #[bench]
1235     fn ends_with_diff_one_element_at_beginning(b: &mut Bencher) {
1236         let vec: Vec<_> = (0..100).collect();
1237         let mut match_vec: Vec<_> = (0..100).collect();
1238         match_vec[0] = 200;
1239         b.iter(|| {
1240             vec.starts_with(&match_vec)
1241         })
1242     }
1243
1244     #[bench]
1245     fn contains_last_element(b: &mut Bencher) {
1246         let vec: Vec<_> = (0..100).collect();
1247         b.iter(|| {
1248             vec.contains(&99)
1249         })
1250     }
1251
1252     #[bench]
1253     fn zero_1kb_from_elem(b: &mut Bencher) {
1254         b.iter(|| {
1255             vec![0u8; 1024]
1256         });
1257     }
1258
1259     #[bench]
1260     fn zero_1kb_set_memory(b: &mut Bencher) {
1261         b.iter(|| {
1262             let mut v = Vec::<u8>::with_capacity(1024);
1263             unsafe {
1264                 let vp = v.as_mut_ptr();
1265                 ptr::write_bytes(vp, 0, 1024);
1266                 v.set_len(1024);
1267             }
1268             v
1269         });
1270     }
1271
1272     #[bench]
1273     fn zero_1kb_loop_set(b: &mut Bencher) {
1274         b.iter(|| {
1275             let mut v = Vec::<u8>::with_capacity(1024);
1276             unsafe {
1277                 v.set_len(1024);
1278             }
1279             for i in 0..1024 {
1280                 v[i] = 0;
1281             }
1282         });
1283     }
1284
1285     #[bench]
1286     fn zero_1kb_mut_iter(b: &mut Bencher) {
1287         b.iter(|| {
1288             let mut v = Vec::<u8>::with_capacity(1024);
1289             unsafe {
1290                 v.set_len(1024);
1291             }
1292             for x in &mut v {
1293                 *x = 0;
1294             }
1295             v
1296         });
1297     }
1298
1299     #[bench]
1300     fn random_inserts(b: &mut Bencher) {
1301         let mut rng = thread_rng();
1302         b.iter(|| {
1303             let mut v = vec![(0, 0); 30];
1304             for _ in 0..100 {
1305                 let l = v.len();
1306                 v.insert(rng.gen::<usize>() % (l + 1),
1307                          (1, 1));
1308             }
1309         })
1310     }
1311     #[bench]
1312     fn random_removes(b: &mut Bencher) {
1313         let mut rng = thread_rng();
1314         b.iter(|| {
1315             let mut v = vec![(0, 0); 130];
1316             for _ in 0..100 {
1317                 let l = v.len();
1318                 v.remove(rng.gen::<usize>() % l);
1319             }
1320         })
1321     }
1322
1323     #[bench]
1324     fn sort_random_small(b: &mut Bencher) {
1325         let mut rng = thread_rng();
1326         b.iter(|| {
1327             let mut v: Vec<_> = rng.gen_iter::<u64>().take(5).collect();
1328             v.sort();
1329         });
1330         b.bytes = 5 * mem::size_of::<u64>() as u64;
1331     }
1332
1333     #[bench]
1334     fn sort_random_medium(b: &mut Bencher) {
1335         let mut rng = thread_rng();
1336         b.iter(|| {
1337             let mut v: Vec<_> = rng.gen_iter::<u64>().take(100).collect();
1338             v.sort();
1339         });
1340         b.bytes = 100 * mem::size_of::<u64>() as u64;
1341     }
1342
1343     #[bench]
1344     fn sort_random_large(b: &mut Bencher) {
1345         let mut rng = thread_rng();
1346         b.iter(|| {
1347             let mut v: Vec<_> = rng.gen_iter::<u64>().take(10000).collect();
1348             v.sort();
1349         });
1350         b.bytes = 10000 * mem::size_of::<u64>() as u64;
1351     }
1352
1353     #[bench]
1354     fn sort_sorted(b: &mut Bencher) {
1355         let mut v: Vec<_> = (0..10000).collect();
1356         b.iter(|| {
1357             v.sort();
1358         });
1359         b.bytes = (v.len() * mem::size_of_val(&v[0])) as u64;
1360     }
1361
1362     type BigSortable = (u64, u64, u64, u64);
1363
1364     #[bench]
1365     fn sort_big_random_small(b: &mut Bencher) {
1366         let mut rng = thread_rng();
1367         b.iter(|| {
1368             let mut v = rng.gen_iter::<BigSortable>().take(5)
1369                            .collect::<Vec<BigSortable>>();
1370             v.sort();
1371         });
1372         b.bytes = 5 * mem::size_of::<BigSortable>() as u64;
1373     }
1374
1375     #[bench]
1376     fn sort_big_random_medium(b: &mut Bencher) {
1377         let mut rng = thread_rng();
1378         b.iter(|| {
1379             let mut v = rng.gen_iter::<BigSortable>().take(100)
1380                            .collect::<Vec<BigSortable>>();
1381             v.sort();
1382         });
1383         b.bytes = 100 * mem::size_of::<BigSortable>() as u64;
1384     }
1385
1386     #[bench]
1387     fn sort_big_random_large(b: &mut Bencher) {
1388         let mut rng = thread_rng();
1389         b.iter(|| {
1390             let mut v = rng.gen_iter::<BigSortable>().take(10000)
1391                            .collect::<Vec<BigSortable>>();
1392             v.sort();
1393         });
1394         b.bytes = 10000 * mem::size_of::<BigSortable>() as u64;
1395     }
1396
1397     #[bench]
1398     fn sort_big_sorted(b: &mut Bencher) {
1399         let mut v: Vec<BigSortable> = (0..10000).map(|i| (i, i, i, i)).collect();
1400         b.iter(|| {
1401             v.sort();
1402         });
1403         b.bytes = (v.len() * mem::size_of_val(&v[0])) as u64;
1404     }
1405 }