]> git.lizzy.rs Git - rust.git/blob - src/libcollections/slice.rs
Rollup merge of #42149 - dvyukov:license, r=brson
[rust.git] / src / libcollections / 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 //! A dynamically-sized view into a contiguous sequence, `[T]`.
12 //!
13 //! Slices are a view into a block of memory represented as a pointer and a
14 //! length.
15 //!
16 //! ```
17 //! // slicing a Vec
18 //! let vec = vec![1, 2, 3];
19 //! let int_slice = &vec[..];
20 //! // coercing an array to a slice
21 //! let str_slice: &[&str] = &["one", "two", "three"];
22 //! ```
23 //!
24 //! Slices are either mutable or shared. The shared slice type is `&[T]`,
25 //! while the mutable slice type is `&mut [T]`, where `T` represents the element
26 //! type. For example, you can mutate the block of memory that a mutable slice
27 //! points to:
28 //!
29 //! ```
30 //! let x = &mut [1, 2, 3];
31 //! x[1] = 7;
32 //! assert_eq!(x, &[1, 7, 3]);
33 //! ```
34 //!
35 //! Here are some of the things this module contains:
36 //!
37 //! ## Structs
38 //!
39 //! There are several structs that are useful for slices, such as [`Iter`], which
40 //! represents iteration over a slice.
41 //!
42 //! ## Trait Implementations
43 //!
44 //! There are several implementations of common traits for slices. Some examples
45 //! include:
46 //!
47 //! * [`Clone`]
48 //! * [`Eq`], [`Ord`] - for slices whose element type are [`Eq`] or [`Ord`].
49 //! * [`Hash`] - for slices whose element type is [`Hash`].
50 //!
51 //! ## Iteration
52 //!
53 //! The slices implement `IntoIterator`. The iterator yields references to the
54 //! slice elements.
55 //!
56 //! ```
57 //! let numbers = &[0, 1, 2];
58 //! for n in numbers {
59 //!     println!("{} is a number!", n);
60 //! }
61 //! ```
62 //!
63 //! The mutable slice yields mutable references to the elements:
64 //!
65 //! ```
66 //! let mut scores = [7, 8, 9];
67 //! for score in &mut scores[..] {
68 //!     *score += 1;
69 //! }
70 //! ```
71 //!
72 //! This iterator yields mutable references to the slice's elements, so while
73 //! the element type of the slice is `i32`, the element type of the iterator is
74 //! `&mut i32`.
75 //!
76 //! * [`.iter`] and [`.iter_mut`] are the explicit methods to return the default
77 //!   iterators.
78 //! * Further methods that return iterators are [`.split`], [`.splitn`],
79 //!   [`.chunks`], [`.windows`] and more.
80 //!
81 //! *[See also the slice primitive type](../../std/primitive.slice.html).*
82 //!
83 //! [`Clone`]: ../../std/clone/trait.Clone.html
84 //! [`Eq`]: ../../std/cmp/trait.Eq.html
85 //! [`Ord`]: ../../std/cmp/trait.Ord.html
86 //! [`Iter`]: struct.Iter.html
87 //! [`Hash`]: ../../std/hash/trait.Hash.html
88 //! [`.iter`]: ../../std/primitive.slice.html#method.iter
89 //! [`.iter_mut`]: ../../std/primitive.slice.html#method.iter_mut
90 //! [`.split`]: ../../std/primitive.slice.html#method.split
91 //! [`.splitn`]: ../../std/primitive.slice.html#method.splitn
92 //! [`.chunks`]: ../../std/primitive.slice.html#method.chunks
93 //! [`.windows`]: ../../std/primitive.slice.html#method.windows
94 #![stable(feature = "rust1", since = "1.0.0")]
95
96 // Many of the usings in this module are only used in the test configuration.
97 // It's cleaner to just turn off the unused_imports warning than to fix them.
98 #![cfg_attr(test, allow(unused_imports, dead_code))]
99
100 use alloc::boxed::Box;
101 use core::cmp::Ordering::{self, Less};
102 use core::mem::size_of;
103 use core::mem;
104 use core::ptr;
105 use core::slice as core_slice;
106
107 use borrow::{Borrow, BorrowMut, ToOwned};
108 use vec::Vec;
109
110 #[stable(feature = "rust1", since = "1.0.0")]
111 pub use core::slice::{Chunks, Windows};
112 #[stable(feature = "rust1", since = "1.0.0")]
113 pub use core::slice::{Iter, IterMut};
114 #[stable(feature = "rust1", since = "1.0.0")]
115 pub use core::slice::{SplitMut, ChunksMut, Split};
116 #[stable(feature = "rust1", since = "1.0.0")]
117 pub use core::slice::{SplitN, RSplitN, SplitNMut, RSplitNMut};
118 #[unstable(feature = "slice_rsplit", issue = "41020")]
119 pub use core::slice::{RSplit, RSplitMut};
120 #[stable(feature = "rust1", since = "1.0.0")]
121 pub use core::slice::{from_raw_parts, from_raw_parts_mut};
122 #[unstable(feature = "slice_get_slice", issue = "35729")]
123 pub use core::slice::SliceIndex;
124
125 ////////////////////////////////////////////////////////////////////////////////
126 // Basic slice extension methods
127 ////////////////////////////////////////////////////////////////////////////////
128
129 // HACK(japaric) needed for the implementation of `vec!` macro during testing
130 // NB see the hack module in this file for more details
131 #[cfg(test)]
132 pub use self::hack::into_vec;
133
134 // HACK(japaric) needed for the implementation of `Vec::clone` during testing
135 // NB see the hack module in this file for more details
136 #[cfg(test)]
137 pub use self::hack::to_vec;
138
139 // HACK(japaric): With cfg(test) `impl [T]` is not available, these three
140 // functions are actually methods that are in `impl [T]` but not in
141 // `core::slice::SliceExt` - we need to supply these functions for the
142 // `test_permutations` test
143 mod hack {
144     use alloc::boxed::Box;
145     use core::mem;
146
147     #[cfg(test)]
148     use string::ToString;
149     use vec::Vec;
150
151     pub fn into_vec<T>(mut b: Box<[T]>) -> Vec<T> {
152         unsafe {
153             let xs = Vec::from_raw_parts(b.as_mut_ptr(), b.len(), b.len());
154             mem::forget(b);
155             xs
156         }
157     }
158
159     #[inline]
160     pub fn to_vec<T>(s: &[T]) -> Vec<T>
161         where T: Clone
162     {
163         let mut vector = Vec::with_capacity(s.len());
164         vector.extend_from_slice(s);
165         vector
166     }
167 }
168
169 #[lang = "slice"]
170 #[cfg(not(test))]
171 impl<T> [T] {
172     /// Returns the number of elements in the slice.
173     ///
174     /// # Example
175     ///
176     /// ```
177     /// let a = [1, 2, 3];
178     /// assert_eq!(a.len(), 3);
179     /// ```
180     #[stable(feature = "rust1", since = "1.0.0")]
181     #[inline]
182     pub fn len(&self) -> usize {
183         core_slice::SliceExt::len(self)
184     }
185
186     /// Returns `true` if the slice has a length of 0.
187     ///
188     /// # Example
189     ///
190     /// ```
191     /// let a = [1, 2, 3];
192     /// assert!(!a.is_empty());
193     /// ```
194     #[stable(feature = "rust1", since = "1.0.0")]
195     #[inline]
196     pub fn is_empty(&self) -> bool {
197         core_slice::SliceExt::is_empty(self)
198     }
199
200     /// Returns the first element of the slice, or `None` if it is empty.
201     ///
202     /// # Examples
203     ///
204     /// ```
205     /// let v = [10, 40, 30];
206     /// assert_eq!(Some(&10), v.first());
207     ///
208     /// let w: &[i32] = &[];
209     /// assert_eq!(None, w.first());
210     /// ```
211     #[stable(feature = "rust1", since = "1.0.0")]
212     #[inline]
213     pub fn first(&self) -> Option<&T> {
214         core_slice::SliceExt::first(self)
215     }
216
217     /// Returns a mutable pointer to the first element of the slice, or `None` if it is empty.
218     ///
219     /// # Examples
220     ///
221     /// ```
222     /// let x = &mut [0, 1, 2];
223     ///
224     /// if let Some(first) = x.first_mut() {
225     ///     *first = 5;
226     /// }
227     /// assert_eq!(x, &[5, 1, 2]);
228     /// ```
229     #[stable(feature = "rust1", since = "1.0.0")]
230     #[inline]
231     pub fn first_mut(&mut self) -> Option<&mut T> {
232         core_slice::SliceExt::first_mut(self)
233     }
234
235     /// Returns the first and all the rest of the elements of the slice, or `None` if it is empty.
236     ///
237     /// # Examples
238     ///
239     /// ```
240     /// let x = &[0, 1, 2];
241     ///
242     /// if let Some((first, elements)) = x.split_first() {
243     ///     assert_eq!(first, &0);
244     ///     assert_eq!(elements, &[1, 2]);
245     /// }
246     /// ```
247     #[stable(feature = "slice_splits", since = "1.5.0")]
248     #[inline]
249     pub fn split_first(&self) -> Option<(&T, &[T])> {
250         core_slice::SliceExt::split_first(self)
251     }
252
253     /// Returns the first and all the rest of the elements of the slice, or `None` if it is empty.
254     ///
255     /// # Examples
256     ///
257     /// ```
258     /// let x = &mut [0, 1, 2];
259     ///
260     /// if let Some((first, elements)) = x.split_first_mut() {
261     ///     *first = 3;
262     ///     elements[0] = 4;
263     ///     elements[1] = 5;
264     /// }
265     /// assert_eq!(x, &[3, 4, 5]);
266     /// ```
267     #[stable(feature = "slice_splits", since = "1.5.0")]
268     #[inline]
269     pub fn split_first_mut(&mut self) -> Option<(&mut T, &mut [T])> {
270         core_slice::SliceExt::split_first_mut(self)
271     }
272
273     /// Returns the last and all the rest of the elements of the slice, or `None` if it is empty.
274     ///
275     /// # Examples
276     ///
277     /// ```
278     /// let x = &[0, 1, 2];
279     ///
280     /// if let Some((last, elements)) = x.split_last() {
281     ///     assert_eq!(last, &2);
282     ///     assert_eq!(elements, &[0, 1]);
283     /// }
284     /// ```
285     #[stable(feature = "slice_splits", since = "1.5.0")]
286     #[inline]
287     pub fn split_last(&self) -> Option<(&T, &[T])> {
288         core_slice::SliceExt::split_last(self)
289
290     }
291
292     /// Returns the last and all the rest of the elements of the slice, or `None` if it is empty.
293     ///
294     /// # Examples
295     ///
296     /// ```
297     /// let x = &mut [0, 1, 2];
298     ///
299     /// if let Some((last, elements)) = x.split_last_mut() {
300     ///     *last = 3;
301     ///     elements[0] = 4;
302     ///     elements[1] = 5;
303     /// }
304     /// assert_eq!(x, &[4, 5, 3]);
305     /// ```
306     #[stable(feature = "slice_splits", since = "1.5.0")]
307     #[inline]
308     pub fn split_last_mut(&mut self) -> Option<(&mut T, &mut [T])> {
309         core_slice::SliceExt::split_last_mut(self)
310     }
311
312     /// Returns the last element of the slice, or `None` if it is empty.
313     ///
314     /// # Examples
315     ///
316     /// ```
317     /// let v = [10, 40, 30];
318     /// assert_eq!(Some(&30), v.last());
319     ///
320     /// let w: &[i32] = &[];
321     /// assert_eq!(None, w.last());
322     /// ```
323     #[stable(feature = "rust1", since = "1.0.0")]
324     #[inline]
325     pub fn last(&self) -> Option<&T> {
326         core_slice::SliceExt::last(self)
327     }
328
329     /// Returns a mutable pointer to the last item in the slice.
330     ///
331     /// # Examples
332     ///
333     /// ```
334     /// let x = &mut [0, 1, 2];
335     ///
336     /// if let Some(last) = x.last_mut() {
337     ///     *last = 10;
338     /// }
339     /// assert_eq!(x, &[0, 1, 10]);
340     /// ```
341     #[stable(feature = "rust1", since = "1.0.0")]
342     #[inline]
343     pub fn last_mut(&mut self) -> Option<&mut T> {
344         core_slice::SliceExt::last_mut(self)
345     }
346
347     /// Returns a reference to an element or subslice depending on the type of
348     /// index.
349     ///
350     /// - If given a position, returns a reference to the element at that
351     ///   position or `None` if out of bounds.
352     /// - If given a range, returns the subslice corresponding to that range,
353     ///   or `None` if out of bounds.
354     ///
355     /// # Examples
356     ///
357     /// ```
358     /// let v = [10, 40, 30];
359     /// assert_eq!(Some(&40), v.get(1));
360     /// assert_eq!(Some(&[10, 40][..]), v.get(0..2));
361     /// assert_eq!(None, v.get(3));
362     /// assert_eq!(None, v.get(0..4));
363     /// ```
364     #[stable(feature = "rust1", since = "1.0.0")]
365     #[inline]
366     pub fn get<I>(&self, index: I) -> Option<&I::Output>
367         where I: SliceIndex<Self>
368     {
369         core_slice::SliceExt::get(self, index)
370     }
371
372     /// Returns a mutable reference to an element or subslice depending on the
373     /// type of index (see [`get`]) or `None` if the index is out of bounds.
374     ///
375     /// [`get`]: #method.get
376     ///
377     /// # Examples
378     ///
379     /// ```
380     /// let x = &mut [0, 1, 2];
381     ///
382     /// if let Some(elem) = x.get_mut(1) {
383     ///     *elem = 42;
384     /// }
385     /// assert_eq!(x, &[0, 42, 2]);
386     /// ```
387     #[stable(feature = "rust1", since = "1.0.0")]
388     #[inline]
389     pub fn get_mut<I>(&mut self, index: I) -> Option<&mut I::Output>
390         where I: SliceIndex<Self>
391     {
392         core_slice::SliceExt::get_mut(self, index)
393     }
394
395     /// Returns a reference to an element or subslice, without doing bounds
396     /// checking. So use it very carefully!
397     ///
398     /// # Examples
399     ///
400     /// ```
401     /// let x = &[1, 2, 4];
402     ///
403     /// unsafe {
404     ///     assert_eq!(x.get_unchecked(1), &2);
405     /// }
406     /// ```
407     #[stable(feature = "rust1", since = "1.0.0")]
408     #[inline]
409     pub unsafe fn get_unchecked<I>(&self, index: I) -> &I::Output
410         where I: SliceIndex<Self>
411     {
412         core_slice::SliceExt::get_unchecked(self, index)
413     }
414
415     /// Returns a mutable reference to an element or subslice, without doing
416     /// bounds checking. So use it very carefully!
417     ///
418     /// # Examples
419     ///
420     /// ```
421     /// let x = &mut [1, 2, 4];
422     ///
423     /// unsafe {
424     ///     let elem = x.get_unchecked_mut(1);
425     ///     *elem = 13;
426     /// }
427     /// assert_eq!(x, &[1, 13, 4]);
428     /// ```
429     #[stable(feature = "rust1", since = "1.0.0")]
430     #[inline]
431     pub unsafe fn get_unchecked_mut<I>(&mut self, index: I) -> &mut I::Output
432         where I: SliceIndex<Self>
433     {
434         core_slice::SliceExt::get_unchecked_mut(self, index)
435     }
436
437     /// Returns a raw pointer to the slice's buffer.
438     ///
439     /// The caller must ensure that the slice outlives the pointer this
440     /// function returns, or else it will end up pointing to garbage.
441     ///
442     /// Modifying the container referenced by this slice may cause its buffer
443     /// to be reallocated, which would also make any pointers to it invalid.
444     ///
445     /// # Examples
446     ///
447     /// ```
448     /// let x = &[1, 2, 4];
449     /// let x_ptr = x.as_ptr();
450     ///
451     /// unsafe {
452     ///     for i in 0..x.len() {
453     ///         assert_eq!(x.get_unchecked(i), &*x_ptr.offset(i as isize));
454     ///     }
455     /// }
456     /// ```
457     #[stable(feature = "rust1", since = "1.0.0")]
458     #[inline]
459     pub fn as_ptr(&self) -> *const T {
460         core_slice::SliceExt::as_ptr(self)
461     }
462
463     /// Returns an unsafe mutable pointer to the slice's buffer.
464     ///
465     /// The caller must ensure that the slice outlives the pointer this
466     /// function returns, or else it will end up pointing to garbage.
467     ///
468     /// Modifying the container referenced by this slice may cause its buffer
469     /// to be reallocated, which would also make any pointers to it invalid.
470     ///
471     /// # Examples
472     ///
473     /// ```
474     /// let x = &mut [1, 2, 4];
475     /// let x_ptr = x.as_mut_ptr();
476     ///
477     /// unsafe {
478     ///     for i in 0..x.len() {
479     ///         *x_ptr.offset(i as isize) += 2;
480     ///     }
481     /// }
482     /// assert_eq!(x, &[3, 4, 6]);
483     /// ```
484     #[stable(feature = "rust1", since = "1.0.0")]
485     #[inline]
486     pub fn as_mut_ptr(&mut self) -> *mut T {
487         core_slice::SliceExt::as_mut_ptr(self)
488     }
489
490     /// Swaps two elements in the slice.
491     ///
492     /// # Arguments
493     ///
494     /// * a - The index of the first element
495     /// * b - The index of the second element
496     ///
497     /// # Panics
498     ///
499     /// Panics if `a` or `b` are out of bounds.
500     ///
501     /// # Examples
502     ///
503     /// ```
504     /// let mut v = ["a", "b", "c", "d"];
505     /// v.swap(1, 3);
506     /// assert!(v == ["a", "d", "c", "b"]);
507     /// ```
508     #[stable(feature = "rust1", since = "1.0.0")]
509     #[inline]
510     pub fn swap(&mut self, a: usize, b: usize) {
511         core_slice::SliceExt::swap(self, a, b)
512     }
513
514     /// Reverses the order of elements in the slice, in place.
515     ///
516     /// # Example
517     ///
518     /// ```
519     /// let mut v = [1, 2, 3];
520     /// v.reverse();
521     /// assert!(v == [3, 2, 1]);
522     /// ```
523     #[stable(feature = "rust1", since = "1.0.0")]
524     #[inline]
525     pub fn reverse(&mut self) {
526         core_slice::SliceExt::reverse(self)
527     }
528
529     /// Returns an iterator over the slice.
530     ///
531     /// # Examples
532     ///
533     /// ```
534     /// let x = &[1, 2, 4];
535     /// let mut iterator = x.iter();
536     ///
537     /// assert_eq!(iterator.next(), Some(&1));
538     /// assert_eq!(iterator.next(), Some(&2));
539     /// assert_eq!(iterator.next(), Some(&4));
540     /// assert_eq!(iterator.next(), None);
541     /// ```
542     #[stable(feature = "rust1", since = "1.0.0")]
543     #[inline]
544     pub fn iter(&self) -> Iter<T> {
545         core_slice::SliceExt::iter(self)
546     }
547
548     /// Returns an iterator that allows modifying each value.
549     ///
550     /// # Examples
551     ///
552     /// ```
553     /// let x = &mut [1, 2, 4];
554     /// for elem in x.iter_mut() {
555     ///     *elem += 2;
556     /// }
557     /// assert_eq!(x, &[3, 4, 6]);
558     /// ```
559     #[stable(feature = "rust1", since = "1.0.0")]
560     #[inline]
561     pub fn iter_mut(&mut self) -> IterMut<T> {
562         core_slice::SliceExt::iter_mut(self)
563     }
564
565     /// Returns an iterator over all contiguous windows of length
566     /// `size`. The windows overlap. If the slice is shorter than
567     /// `size`, the iterator returns no values.
568     ///
569     /// # Panics
570     ///
571     /// Panics if `size` is 0.
572     ///
573     /// # Example
574     ///
575     /// ```
576     /// let slice = ['r', 'u', 's', 't'];
577     /// let mut iter = slice.windows(2);
578     /// assert_eq!(iter.next().unwrap(), &['r', 'u']);
579     /// assert_eq!(iter.next().unwrap(), &['u', 's']);
580     /// assert_eq!(iter.next().unwrap(), &['s', 't']);
581     /// assert!(iter.next().is_none());
582     /// ```
583     ///
584     /// If the slice is shorter than `size`:
585     ///
586     /// ```
587     /// let slice = ['f', 'o', 'o'];
588     /// let mut iter = slice.windows(4);
589     /// assert!(iter.next().is_none());
590     /// ```
591     #[stable(feature = "rust1", since = "1.0.0")]
592     #[inline]
593     pub fn windows(&self, size: usize) -> Windows<T> {
594         core_slice::SliceExt::windows(self, size)
595     }
596
597     /// Returns an iterator over `size` elements of the slice at a
598     /// time. The chunks are slices and do not overlap. If `size` does
599     /// not divide the length of the slice, then the last chunk will
600     /// not have length `size`.
601     ///
602     /// # Panics
603     ///
604     /// Panics if `size` is 0.
605     ///
606     /// # Example
607     ///
608     /// ```
609     /// let slice = ['l', 'o', 'r', 'e', 'm'];
610     /// let mut iter = slice.chunks(2);
611     /// assert_eq!(iter.next().unwrap(), &['l', 'o']);
612     /// assert_eq!(iter.next().unwrap(), &['r', 'e']);
613     /// assert_eq!(iter.next().unwrap(), &['m']);
614     /// assert!(iter.next().is_none());
615     /// ```
616     #[stable(feature = "rust1", since = "1.0.0")]
617     #[inline]
618     pub fn chunks(&self, size: usize) -> Chunks<T> {
619         core_slice::SliceExt::chunks(self, size)
620     }
621
622     /// Returns an iterator over `chunk_size` elements of the slice at a time.
623     /// The chunks are mutable slices, and do not overlap. If `chunk_size` does
624     /// not divide the length of the slice, then the last chunk will not
625     /// have length `chunk_size`.
626     ///
627     /// # Panics
628     ///
629     /// Panics if `chunk_size` is 0.
630     ///
631     /// # Examples
632     ///
633     /// ```
634     /// let v = &mut [0, 0, 0, 0, 0];
635     /// let mut count = 1;
636     ///
637     /// for chunk in v.chunks_mut(2) {
638     ///     for elem in chunk.iter_mut() {
639     ///         *elem += count;
640     ///     }
641     ///     count += 1;
642     /// }
643     /// assert_eq!(v, &[1, 1, 2, 2, 3]);
644     /// ```
645     #[stable(feature = "rust1", since = "1.0.0")]
646     #[inline]
647     pub fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<T> {
648         core_slice::SliceExt::chunks_mut(self, chunk_size)
649     }
650
651     /// Divides one slice into two at an index.
652     ///
653     /// The first will contain all indices from `[0, mid)` (excluding
654     /// the index `mid` itself) and the second will contain all
655     /// indices from `[mid, len)` (excluding the index `len` itself).
656     ///
657     /// # Panics
658     ///
659     /// Panics if `mid > len`.
660     ///
661     /// # Examples
662     ///
663     /// ```
664     /// let v = [10, 40, 30, 20, 50];
665     /// let (v1, v2) = v.split_at(2);
666     /// assert_eq!([10, 40], v1);
667     /// assert_eq!([30, 20, 50], v2);
668     /// ```
669     #[stable(feature = "rust1", since = "1.0.0")]
670     #[inline]
671     pub fn split_at(&self, mid: usize) -> (&[T], &[T]) {
672         core_slice::SliceExt::split_at(self, mid)
673     }
674
675     /// Divides one `&mut` into two at an index.
676     ///
677     /// The first will contain all indices from `[0, mid)` (excluding
678     /// the index `mid` itself) and the second will contain all
679     /// indices from `[mid, len)` (excluding the index `len` itself).
680     ///
681     /// # Panics
682     ///
683     /// Panics if `mid > len`.
684     ///
685     /// # Examples
686     ///
687     /// ```
688     /// let mut v = [1, 2, 3, 4, 5, 6];
689     ///
690     /// // scoped to restrict the lifetime of the borrows
691     /// {
692     ///    let (left, right) = v.split_at_mut(0);
693     ///    assert!(left == []);
694     ///    assert!(right == [1, 2, 3, 4, 5, 6]);
695     /// }
696     ///
697     /// {
698     ///     let (left, right) = v.split_at_mut(2);
699     ///     assert!(left == [1, 2]);
700     ///     assert!(right == [3, 4, 5, 6]);
701     /// }
702     ///
703     /// {
704     ///     let (left, right) = v.split_at_mut(6);
705     ///     assert!(left == [1, 2, 3, 4, 5, 6]);
706     ///     assert!(right == []);
707     /// }
708     /// ```
709     #[stable(feature = "rust1", since = "1.0.0")]
710     #[inline]
711     pub fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T]) {
712         core_slice::SliceExt::split_at_mut(self, mid)
713     }
714
715     /// Returns an iterator over subslices separated by elements that match
716     /// `pred`. The matched element is not contained in the subslices.
717     ///
718     /// # Examples
719     ///
720     /// ```
721     /// let slice = [10, 40, 33, 20];
722     /// let mut iter = slice.split(|num| num % 3 == 0);
723     ///
724     /// assert_eq!(iter.next().unwrap(), &[10, 40]);
725     /// assert_eq!(iter.next().unwrap(), &[20]);
726     /// assert!(iter.next().is_none());
727     /// ```
728     ///
729     /// If the first element is matched, an empty slice will be the first item
730     /// returned by the iterator. Similarly, if the last element in the slice
731     /// is matched, an empty slice will be the last item returned by the
732     /// iterator:
733     ///
734     /// ```
735     /// let slice = [10, 40, 33];
736     /// let mut iter = slice.split(|num| num % 3 == 0);
737     ///
738     /// assert_eq!(iter.next().unwrap(), &[10, 40]);
739     /// assert_eq!(iter.next().unwrap(), &[]);
740     /// assert!(iter.next().is_none());
741     /// ```
742     ///
743     /// If two matched elements are directly adjacent, an empty slice will be
744     /// present between them:
745     ///
746     /// ```
747     /// let slice = [10, 6, 33, 20];
748     /// let mut iter = slice.split(|num| num % 3 == 0);
749     ///
750     /// assert_eq!(iter.next().unwrap(), &[10]);
751     /// assert_eq!(iter.next().unwrap(), &[]);
752     /// assert_eq!(iter.next().unwrap(), &[20]);
753     /// assert!(iter.next().is_none());
754     /// ```
755     #[stable(feature = "rust1", since = "1.0.0")]
756     #[inline]
757     pub fn split<F>(&self, pred: F) -> Split<T, F>
758         where F: FnMut(&T) -> bool
759     {
760         core_slice::SliceExt::split(self, pred)
761     }
762
763     /// Returns an iterator over mutable subslices separated by elements that
764     /// match `pred`. The matched element is not contained in the subslices.
765     ///
766     /// # Examples
767     ///
768     /// ```
769     /// let mut v = [10, 40, 30, 20, 60, 50];
770     ///
771     /// for group in v.split_mut(|num| *num % 3 == 0) {
772     ///     group[0] = 1;
773     /// }
774     /// assert_eq!(v, [1, 40, 30, 1, 60, 1]);
775     /// ```
776     #[stable(feature = "rust1", since = "1.0.0")]
777     #[inline]
778     pub fn split_mut<F>(&mut self, pred: F) -> SplitMut<T, F>
779         where F: FnMut(&T) -> bool
780     {
781         core_slice::SliceExt::split_mut(self, pred)
782     }
783
784     /// Returns an iterator over subslices separated by elements that match
785     /// `pred`, starting at the end of the slice and working backwards.
786     /// The matched element is not contained in the subslices.
787     ///
788     /// # Examples
789     ///
790     /// ```
791     /// #![feature(slice_rsplit)]
792     ///
793     /// let slice = [11, 22, 33, 0, 44, 55];
794     /// let mut iter = slice.rsplit(|num| *num == 0);
795     ///
796     /// assert_eq!(iter.next().unwrap(), &[44, 55]);
797     /// assert_eq!(iter.next().unwrap(), &[11, 22, 33]);
798     /// assert_eq!(iter.next(), None);
799     /// ```
800     ///
801     /// As with `split()`, if the first or last element is matched, an empty
802     /// slice will be the first (or last) item returned by the iterator.
803     ///
804     /// ```
805     /// #![feature(slice_rsplit)]
806     ///
807     /// let v = &[0, 1, 1, 2, 3, 5, 8];
808     /// let mut it = v.rsplit(|n| *n % 2 == 0);
809     /// assert_eq!(it.next().unwrap(), &[]);
810     /// assert_eq!(it.next().unwrap(), &[3, 5]);
811     /// assert_eq!(it.next().unwrap(), &[1, 1]);
812     /// assert_eq!(it.next().unwrap(), &[]);
813     /// assert_eq!(it.next(), None);
814     /// ```
815     #[unstable(feature = "slice_rsplit", issue = "41020")]
816     #[inline]
817     pub fn rsplit<F>(&self, pred: F) -> RSplit<T, F>
818         where F: FnMut(&T) -> bool
819     {
820         core_slice::SliceExt::rsplit(self, pred)
821     }
822
823     /// Returns an iterator over mutable subslices separated by elements that
824     /// match `pred`, starting at the end of the slice and working
825     /// backwards. The matched element is not contained in the subslices.
826     ///
827     /// # Examples
828     ///
829     /// ```
830     /// #![feature(slice_rsplit)]
831     ///
832     /// let mut v = [100, 400, 300, 200, 600, 500];
833     ///
834     /// let mut count = 0;
835     /// for group in v.rsplit_mut(|num| *num % 3 == 0) {
836     ///     count += 1;
837     ///     group[0] = count;
838     /// }
839     /// assert_eq!(v, [3, 400, 300, 2, 600, 1]);
840     /// ```
841     ///
842     #[unstable(feature = "slice_rsplit", issue = "41020")]
843     #[inline]
844     pub fn rsplit_mut<F>(&mut self, pred: F) -> RSplitMut<T, F>
845         where F: FnMut(&T) -> bool
846     {
847         core_slice::SliceExt::rsplit_mut(self, pred)
848     }
849
850     /// Returns an iterator over subslices separated by elements that match
851     /// `pred`, limited to returning at most `n` items. The matched element is
852     /// not contained in the subslices.
853     ///
854     /// The last element returned, if any, will contain the remainder of the
855     /// slice.
856     ///
857     /// # Examples
858     ///
859     /// Print the slice split once by numbers divisible by 3 (i.e. `[10, 40]`,
860     /// `[20, 60, 50]`):
861     ///
862     /// ```
863     /// let v = [10, 40, 30, 20, 60, 50];
864     ///
865     /// for group in v.splitn(2, |num| *num % 3 == 0) {
866     ///     println!("{:?}", group);
867     /// }
868     /// ```
869     #[stable(feature = "rust1", since = "1.0.0")]
870     #[inline]
871     pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<T, F>
872         where F: FnMut(&T) -> bool
873     {
874         core_slice::SliceExt::splitn(self, n, pred)
875     }
876
877     /// Returns an iterator over subslices separated by elements that match
878     /// `pred`, limited to returning at most `n` items. The matched element is
879     /// not contained in the subslices.
880     ///
881     /// The last element returned, if any, will contain the remainder of the
882     /// slice.
883     ///
884     /// # Examples
885     ///
886     /// ```
887     /// let mut v = [10, 40, 30, 20, 60, 50];
888     ///
889     /// for group in v.splitn_mut(2, |num| *num % 3 == 0) {
890     ///     group[0] = 1;
891     /// }
892     /// assert_eq!(v, [1, 40, 30, 1, 60, 50]);
893     /// ```
894     #[stable(feature = "rust1", since = "1.0.0")]
895     #[inline]
896     pub fn splitn_mut<F>(&mut self, n: usize, pred: F) -> SplitNMut<T, F>
897         where F: FnMut(&T) -> bool
898     {
899         core_slice::SliceExt::splitn_mut(self, n, pred)
900     }
901
902     /// Returns an iterator over subslices separated by elements that match
903     /// `pred` limited to returning at most `n` items. This starts at the end of
904     /// the slice and works backwards.  The matched element is not contained in
905     /// the subslices.
906     ///
907     /// The last element returned, if any, will contain the remainder of the
908     /// slice.
909     ///
910     /// # Examples
911     ///
912     /// Print the slice split once, starting from the end, by numbers divisible
913     /// by 3 (i.e. `[50]`, `[10, 40, 30, 20]`):
914     ///
915     /// ```
916     /// let v = [10, 40, 30, 20, 60, 50];
917     ///
918     /// for group in v.rsplitn(2, |num| *num % 3 == 0) {
919     ///     println!("{:?}", group);
920     /// }
921     /// ```
922     #[stable(feature = "rust1", since = "1.0.0")]
923     #[inline]
924     pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<T, F>
925         where F: FnMut(&T) -> bool
926     {
927         core_slice::SliceExt::rsplitn(self, n, pred)
928     }
929
930     /// Returns an iterator over subslices separated by elements that match
931     /// `pred` limited to returning at most `n` items. This starts at the end of
932     /// the slice and works backwards. The matched element is not contained in
933     /// the subslices.
934     ///
935     /// The last element returned, if any, will contain the remainder of the
936     /// slice.
937     ///
938     /// # Examples
939     ///
940     /// ```
941     /// let mut s = [10, 40, 30, 20, 60, 50];
942     ///
943     /// for group in s.rsplitn_mut(2, |num| *num % 3 == 0) {
944     ///     group[0] = 1;
945     /// }
946     /// assert_eq!(s, [1, 40, 30, 20, 60, 1]);
947     /// ```
948     #[stable(feature = "rust1", since = "1.0.0")]
949     #[inline]
950     pub fn rsplitn_mut<F>(&mut self, n: usize, pred: F) -> RSplitNMut<T, F>
951         where F: FnMut(&T) -> bool
952     {
953         core_slice::SliceExt::rsplitn_mut(self, n, pred)
954     }
955
956     /// Returns `true` if the slice contains an element with the given value.
957     ///
958     /// # Examples
959     ///
960     /// ```
961     /// let v = [10, 40, 30];
962     /// assert!(v.contains(&30));
963     /// assert!(!v.contains(&50));
964     /// ```
965     #[stable(feature = "rust1", since = "1.0.0")]
966     pub fn contains(&self, x: &T) -> bool
967         where T: PartialEq
968     {
969         core_slice::SliceExt::contains(self, x)
970     }
971
972     /// Returns `true` if `needle` is a prefix of the slice.
973     ///
974     /// # Examples
975     ///
976     /// ```
977     /// let v = [10, 40, 30];
978     /// assert!(v.starts_with(&[10]));
979     /// assert!(v.starts_with(&[10, 40]));
980     /// assert!(!v.starts_with(&[50]));
981     /// assert!(!v.starts_with(&[10, 50]));
982     /// ```
983     ///
984     /// Always returns `true` if `needle` is an empty slice:
985     ///
986     /// ```
987     /// let v = &[10, 40, 30];
988     /// assert!(v.starts_with(&[]));
989     /// let v: &[u8] = &[];
990     /// assert!(v.starts_with(&[]));
991     /// ```
992     #[stable(feature = "rust1", since = "1.0.0")]
993     pub fn starts_with(&self, needle: &[T]) -> bool
994         where T: PartialEq
995     {
996         core_slice::SliceExt::starts_with(self, needle)
997     }
998
999     /// Returns `true` if `needle` is a suffix of the slice.
1000     ///
1001     /// # Examples
1002     ///
1003     /// ```
1004     /// let v = [10, 40, 30];
1005     /// assert!(v.ends_with(&[30]));
1006     /// assert!(v.ends_with(&[40, 30]));
1007     /// assert!(!v.ends_with(&[50]));
1008     /// assert!(!v.ends_with(&[50, 30]));
1009     /// ```
1010     ///
1011     /// Always returns `true` if `needle` is an empty slice:
1012     ///
1013     /// ```
1014     /// let v = &[10, 40, 30];
1015     /// assert!(v.ends_with(&[]));
1016     /// let v: &[u8] = &[];
1017     /// assert!(v.ends_with(&[]));
1018     /// ```
1019     #[stable(feature = "rust1", since = "1.0.0")]
1020     pub fn ends_with(&self, needle: &[T]) -> bool
1021         where T: PartialEq
1022     {
1023         core_slice::SliceExt::ends_with(self, needle)
1024     }
1025
1026     /// Binary searches this sorted slice for a given element.
1027     ///
1028     /// If the value is found then `Ok` is returned, containing the
1029     /// index of the matching element; if the value is not found then
1030     /// `Err` is returned, containing the index where a matching
1031     /// element could be inserted while maintaining sorted order.
1032     ///
1033     /// # Example
1034     ///
1035     /// Looks up a series of four elements. The first is found, with a
1036     /// uniquely determined position; the second and third are not
1037     /// found; the fourth could match any position in `[1, 4]`.
1038     ///
1039     /// ```
1040     /// let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
1041     ///
1042     /// assert_eq!(s.binary_search(&13),  Ok(9));
1043     /// assert_eq!(s.binary_search(&4),   Err(7));
1044     /// assert_eq!(s.binary_search(&100), Err(13));
1045     /// let r = s.binary_search(&1);
1046     /// assert!(match r { Ok(1...4) => true, _ => false, });
1047     /// ```
1048     #[stable(feature = "rust1", since = "1.0.0")]
1049     pub fn binary_search(&self, x: &T) -> Result<usize, usize>
1050         where T: Ord
1051     {
1052         core_slice::SliceExt::binary_search(self, x)
1053     }
1054
1055     /// Binary searches this sorted slice with a comparator function.
1056     ///
1057     /// The comparator function should implement an order consistent
1058     /// with the sort order of the underlying slice, returning an
1059     /// order code that indicates whether its argument is `Less`,
1060     /// `Equal` or `Greater` the desired target.
1061     ///
1062     /// If a matching value is found then returns `Ok`, containing
1063     /// the index for the matched element; if no match is found then
1064     /// `Err` is returned, containing the index where a matching
1065     /// element could be inserted while maintaining sorted order.
1066     ///
1067     /// # Example
1068     ///
1069     /// Looks up a series of four elements. The first is found, with a
1070     /// uniquely determined position; the second and third are not
1071     /// found; the fourth could match any position in `[1, 4]`.
1072     ///
1073     /// ```
1074     /// let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
1075     ///
1076     /// let seek = 13;
1077     /// assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Ok(9));
1078     /// let seek = 4;
1079     /// assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(7));
1080     /// let seek = 100;
1081     /// assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(13));
1082     /// let seek = 1;
1083     /// let r = s.binary_search_by(|probe| probe.cmp(&seek));
1084     /// assert!(match r { Ok(1...4) => true, _ => false, });
1085     /// ```
1086     #[stable(feature = "rust1", since = "1.0.0")]
1087     #[inline]
1088     pub fn binary_search_by<'a, F>(&'a self, f: F) -> Result<usize, usize>
1089         where F: FnMut(&'a T) -> Ordering
1090     {
1091         core_slice::SliceExt::binary_search_by(self, f)
1092     }
1093
1094     /// Binary searches this sorted slice with a key extraction function.
1095     ///
1096     /// Assumes that the slice is sorted by the key, for instance with
1097     /// [`sort_by_key`] using the same key extraction function.
1098     ///
1099     /// If a matching value is found then returns `Ok`, containing the
1100     /// index for the matched element; if no match is found then `Err`
1101     /// is returned, containing the index where a matching element could
1102     /// be inserted while maintaining sorted order.
1103     ///
1104     /// [`sort_by_key`]: #method.sort_by_key
1105     ///
1106     /// # Examples
1107     ///
1108     /// Looks up a series of four elements in a slice of pairs sorted by
1109     /// their second elements. The first is found, with a uniquely
1110     /// determined position; the second and third are not found; the
1111     /// fourth could match any position in `[1, 4]`.
1112     ///
1113     /// ```
1114     /// let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
1115     ///          (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
1116     ///          (1, 21), (2, 34), (4, 55)];
1117     ///
1118     /// assert_eq!(s.binary_search_by_key(&13, |&(a,b)| b),  Ok(9));
1119     /// assert_eq!(s.binary_search_by_key(&4, |&(a,b)| b),   Err(7));
1120     /// assert_eq!(s.binary_search_by_key(&100, |&(a,b)| b), Err(13));
1121     /// let r = s.binary_search_by_key(&1, |&(a,b)| b);
1122     /// assert!(match r { Ok(1...4) => true, _ => false, });
1123     /// ```
1124     #[stable(feature = "slice_binary_search_by_key", since = "1.10.0")]
1125     #[inline]
1126     pub fn binary_search_by_key<'a, B, F>(&'a self, b: &B, f: F) -> Result<usize, usize>
1127         where F: FnMut(&'a T) -> B,
1128               B: Ord
1129     {
1130         core_slice::SliceExt::binary_search_by_key(self, b, f)
1131     }
1132
1133     /// Sorts the slice.
1134     ///
1135     /// This sort is stable (i.e. does not reorder equal elements) and `O(n log n)` worst-case.
1136     ///
1137     /// # Current implementation
1138     ///
1139     /// The current algorithm is an adaptive, iterative merge sort inspired by
1140     /// [timsort](https://en.wikipedia.org/wiki/Timsort).
1141     /// It is designed to be very fast in cases where the slice is nearly sorted, or consists of
1142     /// two or more sorted sequences concatenated one after another.
1143     ///
1144     /// Also, it allocates temporary storage half the size of `self`, but for short slices a
1145     /// non-allocating insertion sort is used instead.
1146     ///
1147     /// # Examples
1148     ///
1149     /// ```
1150     /// let mut v = [-5, 4, 1, -3, 2];
1151     ///
1152     /// v.sort();
1153     /// assert!(v == [-5, -3, 1, 2, 4]);
1154     /// ```
1155     #[stable(feature = "rust1", since = "1.0.0")]
1156     #[inline]
1157     pub fn sort(&mut self)
1158         where T: Ord
1159     {
1160         merge_sort(self, |a, b| a.lt(b));
1161     }
1162
1163     /// Sorts the slice with a comparator function.
1164     ///
1165     /// This sort is stable (i.e. does not reorder equal elements) and `O(n log n)` worst-case.
1166     ///
1167     /// # Current implementation
1168     ///
1169     /// The current algorithm is an adaptive, iterative merge sort inspired by
1170     /// [timsort](https://en.wikipedia.org/wiki/Timsort).
1171     /// It is designed to be very fast in cases where the slice is nearly sorted, or consists of
1172     /// two or more sorted sequences concatenated one after another.
1173     ///
1174     /// Also, it allocates temporary storage half the size of `self`, but for short slices a
1175     /// non-allocating insertion sort is used instead.
1176     ///
1177     /// # Examples
1178     ///
1179     /// ```
1180     /// let mut v = [5, 4, 1, 3, 2];
1181     /// v.sort_by(|a, b| a.cmp(b));
1182     /// assert!(v == [1, 2, 3, 4, 5]);
1183     ///
1184     /// // reverse sorting
1185     /// v.sort_by(|a, b| b.cmp(a));
1186     /// assert!(v == [5, 4, 3, 2, 1]);
1187     /// ```
1188     #[stable(feature = "rust1", since = "1.0.0")]
1189     #[inline]
1190     pub fn sort_by<F>(&mut self, mut compare: F)
1191         where F: FnMut(&T, &T) -> Ordering
1192     {
1193         merge_sort(self, |a, b| compare(a, b) == Less);
1194     }
1195
1196     /// Sorts the slice with a key extraction function.
1197     ///
1198     /// This sort is stable (i.e. does not reorder equal elements) and `O(n log n)` worst-case.
1199     ///
1200     /// # Current implementation
1201     ///
1202     /// The current algorithm is an adaptive, iterative merge sort inspired by
1203     /// [timsort](https://en.wikipedia.org/wiki/Timsort).
1204     /// It is designed to be very fast in cases where the slice is nearly sorted, or consists of
1205     /// two or more sorted sequences concatenated one after another.
1206     ///
1207     /// Also, it allocates temporary storage half the size of `self`, but for short slices a
1208     /// non-allocating insertion sort is used instead.
1209     ///
1210     /// # Examples
1211     ///
1212     /// ```
1213     /// let mut v = [-5i32, 4, 1, -3, 2];
1214     ///
1215     /// v.sort_by_key(|k| k.abs());
1216     /// assert!(v == [1, 2, -3, 4, -5]);
1217     /// ```
1218     #[stable(feature = "slice_sort_by_key", since = "1.7.0")]
1219     #[inline]
1220     pub fn sort_by_key<B, F>(&mut self, mut f: F)
1221         where F: FnMut(&T) -> B, B: Ord
1222     {
1223         merge_sort(self, |a, b| f(a).lt(&f(b)));
1224     }
1225
1226     /// Sorts the slice, but may not preserve the order of equal elements.
1227     ///
1228     /// This sort is unstable (i.e. may reorder equal elements), in-place (i.e. does not allocate),
1229     /// and `O(n log n)` worst-case.
1230     ///
1231     /// # Current implementation
1232     ///
1233     /// The current algorithm is based on Orson Peters' [pattern-defeating quicksort][pdqsort],
1234     /// which is a quicksort variant designed to be very fast on certain kinds of patterns,
1235     /// sometimes achieving linear time. It is randomized but deterministic, and falls back to
1236     /// heapsort on degenerate inputs.
1237     ///
1238     /// It is generally faster than stable sorting, except in a few special cases, e.g. when the
1239     /// slice consists of several concatenated sorted sequences.
1240     ///
1241     /// # Examples
1242     ///
1243     /// ```
1244     /// #![feature(sort_unstable)]
1245     ///
1246     /// let mut v = [-5, 4, 1, -3, 2];
1247     ///
1248     /// v.sort_unstable();
1249     /// assert!(v == [-5, -3, 1, 2, 4]);
1250     /// ```
1251     ///
1252     /// [pdqsort]: https://github.com/orlp/pdqsort
1253     // FIXME #40585: Mention `sort_unstable` in the documentation for `sort`.
1254     #[unstable(feature = "sort_unstable", issue = "40585")]
1255     #[inline]
1256     pub fn sort_unstable(&mut self)
1257         where T: Ord
1258     {
1259         core_slice::SliceExt::sort_unstable(self);
1260     }
1261
1262     /// Sorts the slice with a comparator function, but may not preserve the order of equal
1263     /// elements.
1264     ///
1265     /// This sort is unstable (i.e. may reorder equal elements), in-place (i.e. does not allocate),
1266     /// and `O(n log n)` worst-case.
1267     ///
1268     /// # Current implementation
1269     ///
1270     /// The current algorithm is based on Orson Peters' [pattern-defeating quicksort][pdqsort],
1271     /// which is a quicksort variant designed to be very fast on certain kinds of patterns,
1272     /// sometimes achieving linear time. It is randomized but deterministic, and falls back to
1273     /// heapsort on degenerate inputs.
1274     ///
1275     /// It is generally faster than stable sorting, except in a few special cases, e.g. when the
1276     /// slice consists of several concatenated sorted sequences.
1277     ///
1278     /// # Examples
1279     ///
1280     /// ```
1281     /// #![feature(sort_unstable)]
1282     ///
1283     /// let mut v = [5, 4, 1, 3, 2];
1284     /// v.sort_unstable_by(|a, b| a.cmp(b));
1285     /// assert!(v == [1, 2, 3, 4, 5]);
1286     ///
1287     /// // reverse sorting
1288     /// v.sort_unstable_by(|a, b| b.cmp(a));
1289     /// assert!(v == [5, 4, 3, 2, 1]);
1290     /// ```
1291     ///
1292     /// [pdqsort]: https://github.com/orlp/pdqsort
1293     // FIXME #40585: Mention `sort_unstable_by` in the documentation for `sort_by`.
1294     #[unstable(feature = "sort_unstable", issue = "40585")]
1295     #[inline]
1296     pub fn sort_unstable_by<F>(&mut self, compare: F)
1297         where F: FnMut(&T, &T) -> Ordering
1298     {
1299         core_slice::SliceExt::sort_unstable_by(self, compare);
1300     }
1301
1302     /// Sorts the slice with a key extraction function, but may not preserve the order of equal
1303     /// elements.
1304     ///
1305     /// This sort is unstable (i.e. may reorder equal elements), in-place (i.e. does not allocate),
1306     /// and `O(n log n)` worst-case.
1307     ///
1308     /// # Current implementation
1309     ///
1310     /// The current algorithm is based on Orson Peters' [pattern-defeating quicksort][pdqsort],
1311     /// which is a quicksort variant designed to be very fast on certain kinds of patterns,
1312     /// sometimes achieving linear time. It is randomized but deterministic, and falls back to
1313     /// heapsort on degenerate inputs.
1314     ///
1315     /// It is generally faster than stable sorting, except in a few special cases, e.g. when the
1316     /// slice consists of several concatenated sorted sequences.
1317     ///
1318     /// # Examples
1319     ///
1320     /// ```
1321     /// #![feature(sort_unstable)]
1322     ///
1323     /// let mut v = [-5i32, 4, 1, -3, 2];
1324     ///
1325     /// v.sort_unstable_by_key(|k| k.abs());
1326     /// assert!(v == [1, 2, -3, 4, -5]);
1327     /// ```
1328     ///
1329     /// [pdqsort]: https://github.com/orlp/pdqsort
1330     // FIXME #40585: Mention `sort_unstable_by_key` in the documentation for `sort_by_key`.
1331     #[unstable(feature = "sort_unstable", issue = "40585")]
1332     #[inline]
1333     pub fn sort_unstable_by_key<B, F>(&mut self, f: F)
1334         where F: FnMut(&T) -> B,
1335               B: Ord
1336     {
1337         core_slice::SliceExt::sort_unstable_by_key(self, f);
1338     }
1339
1340     /// Copies the elements from `src` into `self`.
1341     ///
1342     /// The length of `src` must be the same as `self`.
1343     ///
1344     /// If `src` implements `Copy`, it can be more performant to use
1345     /// [`copy_from_slice`].
1346     ///
1347     /// # Panics
1348     ///
1349     /// This function will panic if the two slices have different lengths.
1350     ///
1351     /// # Example
1352     ///
1353     /// ```
1354     /// let mut dst = [0, 0, 0];
1355     /// let src = [1, 2, 3];
1356     ///
1357     /// dst.clone_from_slice(&src);
1358     /// assert!(dst == [1, 2, 3]);
1359     /// ```
1360     ///
1361     /// [`copy_from_slice`]: #method.copy_from_slice
1362     #[stable(feature = "clone_from_slice", since = "1.7.0")]
1363     pub fn clone_from_slice(&mut self, src: &[T]) where T: Clone {
1364         core_slice::SliceExt::clone_from_slice(self, src)
1365     }
1366
1367     /// Copies all elements from `src` into `self`, using a memcpy.
1368     ///
1369     /// The length of `src` must be the same as `self`.
1370     ///
1371     /// If `src` does not implement `Copy`, use [`clone_from_slice`].
1372     ///
1373     /// # Panics
1374     ///
1375     /// This function will panic if the two slices have different lengths.
1376     ///
1377     /// # Example
1378     ///
1379     /// ```
1380     /// let mut dst = [0, 0, 0];
1381     /// let src = [1, 2, 3];
1382     ///
1383     /// dst.copy_from_slice(&src);
1384     /// assert_eq!(src, dst);
1385     /// ```
1386     ///
1387     /// [`clone_from_slice`]: #method.clone_from_slice
1388     #[stable(feature = "copy_from_slice", since = "1.9.0")]
1389     pub fn copy_from_slice(&mut self, src: &[T]) where T: Copy {
1390         core_slice::SliceExt::copy_from_slice(self, src)
1391     }
1392
1393     /// Copies `self` into a new `Vec`.
1394     ///
1395     /// # Examples
1396     ///
1397     /// ```
1398     /// let s = [10, 40, 30];
1399     /// let x = s.to_vec();
1400     /// // Here, `s` and `x` can be modified independently.
1401     /// ```
1402     #[stable(feature = "rust1", since = "1.0.0")]
1403     #[inline]
1404     pub fn to_vec(&self) -> Vec<T>
1405         where T: Clone
1406     {
1407         // NB see hack module in this file
1408         hack::to_vec(self)
1409     }
1410
1411     /// Converts `self` into a vector without clones or allocation.
1412     ///
1413     /// The resulting vector can be converted back into a box via
1414     /// `Vec<T>`'s `into_boxed_slice` method.
1415     ///
1416     /// # Examples
1417     ///
1418     /// ```
1419     /// let s: Box<[i32]> = Box::new([10, 40, 30]);
1420     /// let x = s.into_vec();
1421     /// // `s` cannot be used anymore because it has been converted into `x`.
1422     ///
1423     /// assert_eq!(x, vec![10, 40, 30]);
1424     /// ```
1425     #[stable(feature = "rust1", since = "1.0.0")]
1426     #[inline]
1427     pub fn into_vec(self: Box<Self>) -> Vec<T> {
1428         // NB see hack module in this file
1429         hack::into_vec(self)
1430     }
1431 }
1432
1433 ////////////////////////////////////////////////////////////////////////////////
1434 // Extension traits for slices over specific kinds of data
1435 ////////////////////////////////////////////////////////////////////////////////
1436 #[unstable(feature = "slice_concat_ext",
1437            reason = "trait should not have to exist",
1438            issue = "27747")]
1439 /// An extension trait for concatenating slices
1440 pub trait SliceConcatExt<T: ?Sized> {
1441     #[unstable(feature = "slice_concat_ext",
1442                reason = "trait should not have to exist",
1443                issue = "27747")]
1444     /// The resulting type after concatenation
1445     type Output;
1446
1447     /// Flattens a slice of `T` into a single value `Self::Output`.
1448     ///
1449     /// # Examples
1450     ///
1451     /// ```
1452     /// assert_eq!(["hello", "world"].concat(), "helloworld");
1453     /// ```
1454     #[stable(feature = "rust1", since = "1.0.0")]
1455     fn concat(&self) -> Self::Output;
1456
1457     /// Flattens a slice of `T` into a single value `Self::Output`, placing a
1458     /// given separator between each.
1459     ///
1460     /// # Examples
1461     ///
1462     /// ```
1463     /// assert_eq!(["hello", "world"].join(" "), "hello world");
1464     /// ```
1465     #[stable(feature = "rename_connect_to_join", since = "1.3.0")]
1466     fn join(&self, sep: &T) -> Self::Output;
1467
1468     #[stable(feature = "rust1", since = "1.0.0")]
1469     #[rustc_deprecated(since = "1.3.0", reason = "renamed to join")]
1470     fn connect(&self, sep: &T) -> Self::Output;
1471 }
1472
1473 #[unstable(feature = "slice_concat_ext",
1474            reason = "trait should not have to exist",
1475            issue = "27747")]
1476 impl<T: Clone, V: Borrow<[T]>> SliceConcatExt<T> for [V] {
1477     type Output = Vec<T>;
1478
1479     fn concat(&self) -> Vec<T> {
1480         let size = self.iter().fold(0, |acc, v| acc + v.borrow().len());
1481         let mut result = Vec::with_capacity(size);
1482         for v in self {
1483             result.extend_from_slice(v.borrow())
1484         }
1485         result
1486     }
1487
1488     fn join(&self, sep: &T) -> Vec<T> {
1489         let size = self.iter().fold(0, |acc, v| acc + v.borrow().len());
1490         let mut result = Vec::with_capacity(size + self.len());
1491         let mut first = true;
1492         for v in self {
1493             if first {
1494                 first = false
1495             } else {
1496                 result.push(sep.clone())
1497             }
1498             result.extend_from_slice(v.borrow())
1499         }
1500         result
1501     }
1502
1503     fn connect(&self, sep: &T) -> Vec<T> {
1504         self.join(sep)
1505     }
1506 }
1507
1508 ////////////////////////////////////////////////////////////////////////////////
1509 // Standard trait implementations for slices
1510 ////////////////////////////////////////////////////////////////////////////////
1511
1512 #[stable(feature = "rust1", since = "1.0.0")]
1513 impl<T> Borrow<[T]> for Vec<T> {
1514     fn borrow(&self) -> &[T] {
1515         &self[..]
1516     }
1517 }
1518
1519 #[stable(feature = "rust1", since = "1.0.0")]
1520 impl<T> BorrowMut<[T]> for Vec<T> {
1521     fn borrow_mut(&mut self) -> &mut [T] {
1522         &mut self[..]
1523     }
1524 }
1525
1526 #[stable(feature = "rust1", since = "1.0.0")]
1527 impl<T: Clone> ToOwned for [T] {
1528     type Owned = Vec<T>;
1529     #[cfg(not(test))]
1530     fn to_owned(&self) -> Vec<T> {
1531         self.to_vec()
1532     }
1533
1534     #[cfg(test)]
1535     fn to_owned(&self) -> Vec<T> {
1536         hack::to_vec(self)
1537     }
1538
1539     fn clone_into(&self, target: &mut Vec<T>) {
1540         // drop anything in target that will not be overwritten
1541         target.truncate(self.len());
1542         let len = target.len();
1543
1544         // reuse the contained values' allocations/resources.
1545         target.clone_from_slice(&self[..len]);
1546
1547         // target.len <= self.len due to the truncate above, so the
1548         // slice here is always in-bounds.
1549         target.extend_from_slice(&self[len..]);
1550     }
1551 }
1552
1553 ////////////////////////////////////////////////////////////////////////////////
1554 // Sorting
1555 ////////////////////////////////////////////////////////////////////////////////
1556
1557 /// Inserts `v[0]` into pre-sorted sequence `v[1..]` so that whole `v[..]` becomes sorted.
1558 ///
1559 /// This is the integral subroutine of insertion sort.
1560 fn insert_head<T, F>(v: &mut [T], is_less: &mut F)
1561     where F: FnMut(&T, &T) -> bool
1562 {
1563     if v.len() >= 2 && is_less(&v[1], &v[0]) {
1564         unsafe {
1565             // There are three ways to implement insertion here:
1566             //
1567             // 1. Swap adjacent elements until the first one gets to its final destination.
1568             //    However, this way we copy data around more than is necessary. If elements are big
1569             //    structures (costly to copy), this method will be slow.
1570             //
1571             // 2. Iterate until the right place for the first element is found. Then shift the
1572             //    elements succeeding it to make room for it and finally place it into the
1573             //    remaining hole. This is a good method.
1574             //
1575             // 3. Copy the first element into a temporary variable. Iterate until the right place
1576             //    for it is found. As we go along, copy every traversed element into the slot
1577             //    preceding it. Finally, copy data from the temporary variable into the remaining
1578             //    hole. This method is very good. Benchmarks demonstrated slightly better
1579             //    performance than with the 2nd method.
1580             //
1581             // All methods were benchmarked, and the 3rd showed best results. So we chose that one.
1582             let mut tmp = mem::ManuallyDrop::new(ptr::read(&v[0]));
1583
1584             // Intermediate state of the insertion process is always tracked by `hole`, which
1585             // serves two purposes:
1586             // 1. Protects integrity of `v` from panics in `is_less`.
1587             // 2. Fills the remaining hole in `v` in the end.
1588             //
1589             // Panic safety:
1590             //
1591             // If `is_less` panics at any point during the process, `hole` will get dropped and
1592             // fill the hole in `v` with `tmp`, thus ensuring that `v` still holds every object it
1593             // initially held exactly once.
1594             let mut hole = InsertionHole {
1595                 src: &mut *tmp,
1596                 dest: &mut v[1],
1597             };
1598             ptr::copy_nonoverlapping(&v[1], &mut v[0], 1);
1599
1600             for i in 2..v.len() {
1601                 if !is_less(&v[i], &*tmp) {
1602                     break;
1603                 }
1604                 ptr::copy_nonoverlapping(&v[i], &mut v[i - 1], 1);
1605                 hole.dest = &mut v[i];
1606             }
1607             // `hole` gets dropped and thus copies `tmp` into the remaining hole in `v`.
1608         }
1609     }
1610
1611     // When dropped, copies from `src` into `dest`.
1612     struct InsertionHole<T> {
1613         src: *mut T,
1614         dest: *mut T,
1615     }
1616
1617     impl<T> Drop for InsertionHole<T> {
1618         fn drop(&mut self) {
1619             unsafe { ptr::copy_nonoverlapping(self.src, self.dest, 1); }
1620         }
1621     }
1622 }
1623
1624 /// Merges non-decreasing runs `v[..mid]` and `v[mid..]` using `buf` as temporary storage, and
1625 /// stores the result into `v[..]`.
1626 ///
1627 /// # Safety
1628 ///
1629 /// The two slices must be non-empty and `mid` must be in bounds. Buffer `buf` must be long enough
1630 /// to hold a copy of the shorter slice. Also, `T` must not be a zero-sized type.
1631 unsafe fn merge<T, F>(v: &mut [T], mid: usize, buf: *mut T, is_less: &mut F)
1632     where F: FnMut(&T, &T) -> bool
1633 {
1634     let len = v.len();
1635     let v = v.as_mut_ptr();
1636     let v_mid = v.offset(mid as isize);
1637     let v_end = v.offset(len as isize);
1638
1639     // The merge process first copies the shorter run into `buf`. Then it traces the newly copied
1640     // run and the longer run forwards (or backwards), comparing their next unconsumed elements and
1641     // copying the lesser (or greater) one into `v`.
1642     //
1643     // As soon as the shorter run is fully consumed, the process is done. If the longer run gets
1644     // consumed first, then we must copy whatever is left of the shorter run into the remaining
1645     // hole in `v`.
1646     //
1647     // Intermediate state of the process is always tracked by `hole`, which serves two purposes:
1648     // 1. Protects integrity of `v` from panics in `is_less`.
1649     // 2. Fills the remaining hole in `v` if the longer run gets consumed first.
1650     //
1651     // Panic safety:
1652     //
1653     // If `is_less` panics at any point during the process, `hole` will get dropped and fill the
1654     // hole in `v` with the unconsumed range in `buf`, thus ensuring that `v` still holds every
1655     // object it initially held exactly once.
1656     let mut hole;
1657
1658     if mid <= len - mid {
1659         // The left run is shorter.
1660         ptr::copy_nonoverlapping(v, buf, mid);
1661         hole = MergeHole {
1662             start: buf,
1663             end: buf.offset(mid as isize),
1664             dest: v,
1665         };
1666
1667         // Initially, these pointers point to the beginnings of their arrays.
1668         let left = &mut hole.start;
1669         let mut right = v_mid;
1670         let out = &mut hole.dest;
1671
1672         while *left < hole.end && right < v_end {
1673             // Consume the lesser side.
1674             // If equal, prefer the left run to maintain stability.
1675             let to_copy = if is_less(&*right, &**left) {
1676                 get_and_increment(&mut right)
1677             } else {
1678                 get_and_increment(left)
1679             };
1680             ptr::copy_nonoverlapping(to_copy, get_and_increment(out), 1);
1681         }
1682     } else {
1683         // The right run is shorter.
1684         ptr::copy_nonoverlapping(v_mid, buf, len - mid);
1685         hole = MergeHole {
1686             start: buf,
1687             end: buf.offset((len - mid) as isize),
1688             dest: v_mid,
1689         };
1690
1691         // Initially, these pointers point past the ends of their arrays.
1692         let left = &mut hole.dest;
1693         let right = &mut hole.end;
1694         let mut out = v_end;
1695
1696         while v < *left && buf < *right {
1697             // Consume the greater side.
1698             // If equal, prefer the right run to maintain stability.
1699             let to_copy = if is_less(&*right.offset(-1), &*left.offset(-1)) {
1700                 decrement_and_get(left)
1701             } else {
1702                 decrement_and_get(right)
1703             };
1704             ptr::copy_nonoverlapping(to_copy, decrement_and_get(&mut out), 1);
1705         }
1706     }
1707     // Finally, `hole` gets dropped. If the shorter run was not fully consumed, whatever remains of
1708     // it will now be copied into the hole in `v`.
1709
1710     unsafe fn get_and_increment<T>(ptr: &mut *mut T) -> *mut T {
1711         let old = *ptr;
1712         *ptr = ptr.offset(1);
1713         old
1714     }
1715
1716     unsafe fn decrement_and_get<T>(ptr: &mut *mut T) -> *mut T {
1717         *ptr = ptr.offset(-1);
1718         *ptr
1719     }
1720
1721     // When dropped, copies the range `start..end` into `dest..`.
1722     struct MergeHole<T> {
1723         start: *mut T,
1724         end: *mut T,
1725         dest: *mut T,
1726     }
1727
1728     impl<T> Drop for MergeHole<T> {
1729         fn drop(&mut self) {
1730             // `T` is not a zero-sized type, so it's okay to divide by it's size.
1731             let len = (self.end as usize - self.start as usize) / mem::size_of::<T>();
1732             unsafe { ptr::copy_nonoverlapping(self.start, self.dest, len); }
1733         }
1734     }
1735 }
1736
1737 /// This merge sort borrows some (but not all) ideas from TimSort, which is described in detail
1738 /// [here](http://svn.python.org/projects/python/trunk/Objects/listsort.txt).
1739 ///
1740 /// The algorithm identifies strictly descending and non-descending subsequences, which are called
1741 /// natural runs. There is a stack of pending runs yet to be merged. Each newly found run is pushed
1742 /// onto the stack, and then some pairs of adjacent runs are merged until these two invariants are
1743 /// satisfied:
1744 ///
1745 /// 1. for every `i` in `1..runs.len()`: `runs[i - 1].len > runs[i].len`
1746 /// 2. for every `i` in `2..runs.len()`: `runs[i - 2].len > runs[i - 1].len + runs[i].len`
1747 ///
1748 /// The invariants ensure that the total running time is `O(n log n)` worst-case.
1749 fn merge_sort<T, F>(v: &mut [T], mut is_less: F)
1750     where F: FnMut(&T, &T) -> bool
1751 {
1752     // Slices of up to this length get sorted using insertion sort.
1753     const MAX_INSERTION: usize = 20;
1754     // Very short runs are extended using insertion sort to span at least this many elements.
1755     const MIN_RUN: usize = 10;
1756
1757     // Sorting has no meaningful behavior on zero-sized types.
1758     if size_of::<T>() == 0 {
1759         return;
1760     }
1761
1762     let len = v.len();
1763
1764     // Short arrays get sorted in-place via insertion sort to avoid allocations.
1765     if len <= MAX_INSERTION {
1766         if len >= 2 {
1767             for i in (0..len-1).rev() {
1768                 insert_head(&mut v[i..], &mut is_less);
1769             }
1770         }
1771         return;
1772     }
1773
1774     // Allocate a buffer to use as scratch memory. We keep the length 0 so we can keep in it
1775     // shallow copies of the contents of `v` without risking the dtors running on copies if
1776     // `is_less` panics. When merging two sorted runs, this buffer holds a copy of the shorter run,
1777     // which will always have length at most `len / 2`.
1778     let mut buf = Vec::with_capacity(len / 2);
1779
1780     // In order to identify natural runs in `v`, we traverse it backwards. That might seem like a
1781     // strange decision, but consider the fact that merges more often go in the opposite direction
1782     // (forwards). According to benchmarks, merging forwards is slightly faster than merging
1783     // backwards. To conclude, identifying runs by traversing backwards improves performance.
1784     let mut runs = vec![];
1785     let mut end = len;
1786     while end > 0 {
1787         // Find the next natural run, and reverse it if it's strictly descending.
1788         let mut start = end - 1;
1789         if start > 0 {
1790             start -= 1;
1791             unsafe {
1792                 if is_less(v.get_unchecked(start + 1), v.get_unchecked(start)) {
1793                     while start > 0 && is_less(v.get_unchecked(start),
1794                                                v.get_unchecked(start - 1)) {
1795                         start -= 1;
1796                     }
1797                     v[start..end].reverse();
1798                 } else {
1799                     while start > 0 && !is_less(v.get_unchecked(start),
1800                                                 v.get_unchecked(start - 1)) {
1801                         start -= 1;
1802                     }
1803                 }
1804             }
1805         }
1806
1807         // Insert some more elements into the run if it's too short. Insertion sort is faster than
1808         // merge sort on short sequences, so this significantly improves performance.
1809         while start > 0 && end - start < MIN_RUN {
1810             start -= 1;
1811             insert_head(&mut v[start..end], &mut is_less);
1812         }
1813
1814         // Push this run onto the stack.
1815         runs.push(Run {
1816             start: start,
1817             len: end - start,
1818         });
1819         end = start;
1820
1821         // Merge some pairs of adjacent runs to satisfy the invariants.
1822         while let Some(r) = collapse(&runs) {
1823             let left = runs[r + 1];
1824             let right = runs[r];
1825             unsafe {
1826                 merge(&mut v[left.start .. right.start + right.len], left.len, buf.as_mut_ptr(),
1827                       &mut is_less);
1828             }
1829             runs[r] = Run {
1830                 start: left.start,
1831                 len: left.len + right.len,
1832             };
1833             runs.remove(r + 1);
1834         }
1835     }
1836
1837     // Finally, exactly one run must remain in the stack.
1838     debug_assert!(runs.len() == 1 && runs[0].start == 0 && runs[0].len == len);
1839
1840     // Examines the stack of runs and identifies the next pair of runs to merge. More specifically,
1841     // if `Some(r)` is returned, that means `runs[r]` and `runs[r + 1]` must be merged next. If the
1842     // algorithm should continue building a new run instead, `None` is returned.
1843     //
1844     // TimSort is infamous for it's buggy implementations, as described here:
1845     // http://envisage-project.eu/timsort-specification-and-verification/
1846     //
1847     // The gist of the story is: we must enforce the invariants on the top four runs on the stack.
1848     // Enforcing them on just top three is not sufficient to ensure that the invariants will still
1849     // hold for *all* runs in the stack.
1850     //
1851     // This function correctly checks invariants for the top four runs. Additionally, if the top
1852     // run starts at index 0, it will always demand a merge operation until the stack is fully
1853     // collapsed, in order to complete the sort.
1854     #[inline]
1855     fn collapse(runs: &[Run]) -> Option<usize> {
1856         let n = runs.len();
1857         if n >= 2 && (runs[n - 1].start == 0 ||
1858                       runs[n - 2].len <= runs[n - 1].len ||
1859                       (n >= 3 && runs[n - 3].len <= runs[n - 2].len + runs[n - 1].len) ||
1860                       (n >= 4 && runs[n - 4].len <= runs[n - 3].len + runs[n - 2].len)) {
1861             if n >= 3 && runs[n - 3].len < runs[n - 1].len {
1862                 Some(n - 3)
1863             } else {
1864                 Some(n - 2)
1865             }
1866         } else {
1867             None
1868         }
1869     }
1870
1871     #[derive(Clone, Copy)]
1872     struct Run {
1873         start: usize,
1874         len: usize,
1875     }
1876 }