]> git.lizzy.rs Git - rust.git/blob - library/core/src/slice/mod.rs
Rollup merge of #103360 - ChrisDenton:isterm-filetype, r=thomcc
[rust.git] / library / core / src / slice / mod.rs
1 //! Slice management and manipulation.
2 //!
3 //! For more details see [`std::slice`].
4 //!
5 //! [`std::slice`]: ../../std/slice/index.html
6
7 #![stable(feature = "rust1", since = "1.0.0")]
8
9 use crate::cmp::Ordering::{self, Greater, Less};
10 use crate::intrinsics::{assert_unsafe_precondition, exact_div};
11 use crate::marker::Copy;
12 use crate::mem::{self, SizedTypeProperties};
13 use crate::num::NonZeroUsize;
14 use crate::ops::{Bound, FnMut, OneSidedRange, Range, RangeBounds};
15 use crate::option::Option;
16 use crate::option::Option::{None, Some};
17 use crate::ptr;
18 use crate::result::Result;
19 use crate::result::Result::{Err, Ok};
20 use crate::simd::{self, Simd};
21 use crate::slice;
22
23 #[unstable(
24     feature = "slice_internals",
25     issue = "none",
26     reason = "exposed from core to be reused in std; use the memchr crate"
27 )]
28 /// Pure rust memchr implementation, taken from rust-memchr
29 pub mod memchr;
30
31 mod ascii;
32 mod cmp;
33 mod index;
34 mod iter;
35 mod raw;
36 mod rotate;
37 mod sort;
38 mod specialize;
39
40 #[stable(feature = "rust1", since = "1.0.0")]
41 pub use iter::{Chunks, ChunksMut, Windows};
42 #[stable(feature = "rust1", since = "1.0.0")]
43 pub use iter::{Iter, IterMut};
44 #[stable(feature = "rust1", since = "1.0.0")]
45 pub use iter::{RSplitN, RSplitNMut, Split, SplitMut, SplitN, SplitNMut};
46
47 #[stable(feature = "slice_rsplit", since = "1.27.0")]
48 pub use iter::{RSplit, RSplitMut};
49
50 #[stable(feature = "chunks_exact", since = "1.31.0")]
51 pub use iter::{ChunksExact, ChunksExactMut};
52
53 #[stable(feature = "rchunks", since = "1.31.0")]
54 pub use iter::{RChunks, RChunksExact, RChunksExactMut, RChunksMut};
55
56 #[unstable(feature = "array_chunks", issue = "74985")]
57 pub use iter::{ArrayChunks, ArrayChunksMut};
58
59 #[unstable(feature = "array_windows", issue = "75027")]
60 pub use iter::ArrayWindows;
61
62 #[unstable(feature = "slice_group_by", issue = "80552")]
63 pub use iter::{GroupBy, GroupByMut};
64
65 #[stable(feature = "split_inclusive", since = "1.51.0")]
66 pub use iter::{SplitInclusive, SplitInclusiveMut};
67
68 #[stable(feature = "rust1", since = "1.0.0")]
69 pub use raw::{from_raw_parts, from_raw_parts_mut};
70
71 #[stable(feature = "from_ref", since = "1.28.0")]
72 pub use raw::{from_mut, from_ref};
73
74 #[unstable(feature = "slice_from_ptr_range", issue = "89792")]
75 pub use raw::{from_mut_ptr_range, from_ptr_range};
76
77 // This function is public only because there is no other way to unit test heapsort.
78 #[unstable(feature = "sort_internals", reason = "internal to sort module", issue = "none")]
79 pub use sort::heapsort;
80
81 #[stable(feature = "slice_get_slice", since = "1.28.0")]
82 pub use index::SliceIndex;
83
84 #[unstable(feature = "slice_range", issue = "76393")]
85 pub use index::range;
86
87 #[stable(feature = "inherent_ascii_escape", since = "1.60.0")]
88 pub use ascii::EscapeAscii;
89
90 /// Calculates the direction and split point of a one-sided range.
91 ///
92 /// This is a helper function for `take` and `take_mut` that returns
93 /// the direction of the split (front or back) as well as the index at
94 /// which to split. Returns `None` if the split index would overflow.
95 #[inline]
96 fn split_point_of(range: impl OneSidedRange<usize>) -> Option<(Direction, usize)> {
97     use Bound::*;
98
99     Some(match (range.start_bound(), range.end_bound()) {
100         (Unbounded, Excluded(i)) => (Direction::Front, *i),
101         (Unbounded, Included(i)) => (Direction::Front, i.checked_add(1)?),
102         (Excluded(i), Unbounded) => (Direction::Back, i.checked_add(1)?),
103         (Included(i), Unbounded) => (Direction::Back, *i),
104         _ => unreachable!(),
105     })
106 }
107
108 enum Direction {
109     Front,
110     Back,
111 }
112
113 #[cfg(not(test))]
114 impl<T> [T] {
115     /// Returns the number of elements in the slice.
116     ///
117     /// # Examples
118     ///
119     /// ```
120     /// let a = [1, 2, 3];
121     /// assert_eq!(a.len(), 3);
122     /// ```
123     #[lang = "slice_len_fn"]
124     #[stable(feature = "rust1", since = "1.0.0")]
125     #[rustc_const_stable(feature = "const_slice_len", since = "1.39.0")]
126     #[inline]
127     #[must_use]
128     // SAFETY: const sound because we transmute out the length field as a usize (which it must be)
129     pub const fn len(&self) -> usize {
130         // FIXME: Replace with `crate::ptr::metadata(self)` when that is const-stable.
131         // As of this writing this causes a "Const-stable functions can only call other
132         // const-stable functions" error.
133
134         // SAFETY: Accessing the value from the `PtrRepr` union is safe since *const T
135         // and PtrComponents<T> have the same memory layouts. Only std can make this
136         // guarantee.
137         unsafe { crate::ptr::PtrRepr { const_ptr: self }.components.metadata }
138     }
139
140     /// Returns `true` if the slice has a length of 0.
141     ///
142     /// # Examples
143     ///
144     /// ```
145     /// let a = [1, 2, 3];
146     /// assert!(!a.is_empty());
147     /// ```
148     #[stable(feature = "rust1", since = "1.0.0")]
149     #[rustc_const_stable(feature = "const_slice_is_empty", since = "1.39.0")]
150     #[inline]
151     #[must_use]
152     pub const fn is_empty(&self) -> bool {
153         self.len() == 0
154     }
155
156     /// Returns the first element of the slice, or `None` if it is empty.
157     ///
158     /// # Examples
159     ///
160     /// ```
161     /// let v = [10, 40, 30];
162     /// assert_eq!(Some(&10), v.first());
163     ///
164     /// let w: &[i32] = &[];
165     /// assert_eq!(None, w.first());
166     /// ```
167     #[stable(feature = "rust1", since = "1.0.0")]
168     #[rustc_const_stable(feature = "const_slice_first_last_not_mut", since = "1.56.0")]
169     #[inline]
170     #[must_use]
171     pub const fn first(&self) -> Option<&T> {
172         if let [first, ..] = self { Some(first) } else { None }
173     }
174
175     /// Returns a mutable pointer to the first element of the slice, or `None` if it is empty.
176     ///
177     /// # Examples
178     ///
179     /// ```
180     /// let x = &mut [0, 1, 2];
181     ///
182     /// if let Some(first) = x.first_mut() {
183     ///     *first = 5;
184     /// }
185     /// assert_eq!(x, &[5, 1, 2]);
186     /// ```
187     #[stable(feature = "rust1", since = "1.0.0")]
188     #[rustc_const_unstable(feature = "const_slice_first_last", issue = "83570")]
189     #[inline]
190     #[must_use]
191     pub const fn first_mut(&mut self) -> Option<&mut T> {
192         if let [first, ..] = self { Some(first) } else { None }
193     }
194
195     /// Returns the first and all the rest of the elements of the slice, or `None` if it is empty.
196     ///
197     /// # Examples
198     ///
199     /// ```
200     /// let x = &[0, 1, 2];
201     ///
202     /// if let Some((first, elements)) = x.split_first() {
203     ///     assert_eq!(first, &0);
204     ///     assert_eq!(elements, &[1, 2]);
205     /// }
206     /// ```
207     #[stable(feature = "slice_splits", since = "1.5.0")]
208     #[rustc_const_stable(feature = "const_slice_first_last_not_mut", since = "1.56.0")]
209     #[inline]
210     #[must_use]
211     pub const fn split_first(&self) -> Option<(&T, &[T])> {
212         if let [first, tail @ ..] = self { Some((first, tail)) } else { None }
213     }
214
215     /// Returns the first and all the rest of the elements of the slice, or `None` if it is empty.
216     ///
217     /// # Examples
218     ///
219     /// ```
220     /// let x = &mut [0, 1, 2];
221     ///
222     /// if let Some((first, elements)) = x.split_first_mut() {
223     ///     *first = 3;
224     ///     elements[0] = 4;
225     ///     elements[1] = 5;
226     /// }
227     /// assert_eq!(x, &[3, 4, 5]);
228     /// ```
229     #[stable(feature = "slice_splits", since = "1.5.0")]
230     #[rustc_const_unstable(feature = "const_slice_first_last", issue = "83570")]
231     #[inline]
232     #[must_use]
233     pub const fn split_first_mut(&mut self) -> Option<(&mut T, &mut [T])> {
234         if let [first, tail @ ..] = self { Some((first, tail)) } else { None }
235     }
236
237     /// Returns the last and all the rest of the elements of the slice, or `None` if it is empty.
238     ///
239     /// # Examples
240     ///
241     /// ```
242     /// let x = &[0, 1, 2];
243     ///
244     /// if let Some((last, elements)) = x.split_last() {
245     ///     assert_eq!(last, &2);
246     ///     assert_eq!(elements, &[0, 1]);
247     /// }
248     /// ```
249     #[stable(feature = "slice_splits", since = "1.5.0")]
250     #[rustc_const_stable(feature = "const_slice_first_last_not_mut", since = "1.56.0")]
251     #[inline]
252     #[must_use]
253     pub const fn split_last(&self) -> Option<(&T, &[T])> {
254         if let [init @ .., last] = self { Some((last, init)) } else { None }
255     }
256
257     /// Returns the last and all the rest of the elements of the slice, or `None` if it is empty.
258     ///
259     /// # Examples
260     ///
261     /// ```
262     /// let x = &mut [0, 1, 2];
263     ///
264     /// if let Some((last, elements)) = x.split_last_mut() {
265     ///     *last = 3;
266     ///     elements[0] = 4;
267     ///     elements[1] = 5;
268     /// }
269     /// assert_eq!(x, &[4, 5, 3]);
270     /// ```
271     #[stable(feature = "slice_splits", since = "1.5.0")]
272     #[rustc_const_unstable(feature = "const_slice_first_last", issue = "83570")]
273     #[inline]
274     #[must_use]
275     pub const fn split_last_mut(&mut self) -> Option<(&mut T, &mut [T])> {
276         if let [init @ .., last] = self { Some((last, init)) } else { None }
277     }
278
279     /// Returns the last element of the slice, or `None` if it is empty.
280     ///
281     /// # Examples
282     ///
283     /// ```
284     /// let v = [10, 40, 30];
285     /// assert_eq!(Some(&30), v.last());
286     ///
287     /// let w: &[i32] = &[];
288     /// assert_eq!(None, w.last());
289     /// ```
290     #[stable(feature = "rust1", since = "1.0.0")]
291     #[rustc_const_stable(feature = "const_slice_first_last_not_mut", since = "1.56.0")]
292     #[inline]
293     #[must_use]
294     pub const fn last(&self) -> Option<&T> {
295         if let [.., last] = self { Some(last) } else { None }
296     }
297
298     /// Returns a mutable pointer to the last item in the slice.
299     ///
300     /// # Examples
301     ///
302     /// ```
303     /// let x = &mut [0, 1, 2];
304     ///
305     /// if let Some(last) = x.last_mut() {
306     ///     *last = 10;
307     /// }
308     /// assert_eq!(x, &[0, 1, 10]);
309     /// ```
310     #[stable(feature = "rust1", since = "1.0.0")]
311     #[rustc_const_unstable(feature = "const_slice_first_last", issue = "83570")]
312     #[inline]
313     #[must_use]
314     pub const fn last_mut(&mut self) -> Option<&mut T> {
315         if let [.., last] = self { Some(last) } else { None }
316     }
317
318     /// Returns a reference to an element or subslice depending on the type of
319     /// index.
320     ///
321     /// - If given a position, returns a reference to the element at that
322     ///   position or `None` if out of bounds.
323     /// - If given a range, returns the subslice corresponding to that range,
324     ///   or `None` if out of bounds.
325     ///
326     /// # Examples
327     ///
328     /// ```
329     /// let v = [10, 40, 30];
330     /// assert_eq!(Some(&40), v.get(1));
331     /// assert_eq!(Some(&[10, 40][..]), v.get(0..2));
332     /// assert_eq!(None, v.get(3));
333     /// assert_eq!(None, v.get(0..4));
334     /// ```
335     #[stable(feature = "rust1", since = "1.0.0")]
336     #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
337     #[inline]
338     #[must_use]
339     pub const fn get<I>(&self, index: I) -> Option<&I::Output>
340     where
341         I: ~const SliceIndex<Self>,
342     {
343         index.get(self)
344     }
345
346     /// Returns a mutable reference to an element or subslice depending on the
347     /// type of index (see [`get`]) or `None` if the index is out of bounds.
348     ///
349     /// [`get`]: slice::get
350     ///
351     /// # Examples
352     ///
353     /// ```
354     /// let x = &mut [0, 1, 2];
355     ///
356     /// if let Some(elem) = x.get_mut(1) {
357     ///     *elem = 42;
358     /// }
359     /// assert_eq!(x, &[0, 42, 2]);
360     /// ```
361     #[stable(feature = "rust1", since = "1.0.0")]
362     #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
363     #[inline]
364     #[must_use]
365     pub const fn get_mut<I>(&mut self, index: I) -> Option<&mut I::Output>
366     where
367         I: ~const SliceIndex<Self>,
368     {
369         index.get_mut(self)
370     }
371
372     /// Returns a reference to an element or subslice, without doing bounds
373     /// checking.
374     ///
375     /// For a safe alternative see [`get`].
376     ///
377     /// # Safety
378     ///
379     /// Calling this method with an out-of-bounds index is *[undefined behavior]*
380     /// even if the resulting reference is not used.
381     ///
382     /// [`get`]: slice::get
383     /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
384     ///
385     /// # Examples
386     ///
387     /// ```
388     /// let x = &[1, 2, 4];
389     ///
390     /// unsafe {
391     ///     assert_eq!(x.get_unchecked(1), &2);
392     /// }
393     /// ```
394     #[stable(feature = "rust1", since = "1.0.0")]
395     #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
396     #[inline]
397     #[must_use]
398     pub const unsafe fn get_unchecked<I>(&self, index: I) -> &I::Output
399     where
400         I: ~const SliceIndex<Self>,
401     {
402         // SAFETY: the caller must uphold most of the safety requirements for `get_unchecked`;
403         // the slice is dereferenceable because `self` is a safe reference.
404         // The returned pointer is safe because impls of `SliceIndex` have to guarantee that it is.
405         unsafe { &*index.get_unchecked(self) }
406     }
407
408     /// Returns a mutable reference to an element or subslice, without doing
409     /// bounds checking.
410     ///
411     /// For a safe alternative see [`get_mut`].
412     ///
413     /// # Safety
414     ///
415     /// Calling this method with an out-of-bounds index is *[undefined behavior]*
416     /// even if the resulting reference is not used.
417     ///
418     /// [`get_mut`]: slice::get_mut
419     /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
420     ///
421     /// # Examples
422     ///
423     /// ```
424     /// let x = &mut [1, 2, 4];
425     ///
426     /// unsafe {
427     ///     let elem = x.get_unchecked_mut(1);
428     ///     *elem = 13;
429     /// }
430     /// assert_eq!(x, &[1, 13, 4]);
431     /// ```
432     #[stable(feature = "rust1", since = "1.0.0")]
433     #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
434     #[inline]
435     #[must_use]
436     pub const unsafe fn get_unchecked_mut<I>(&mut self, index: I) -> &mut I::Output
437     where
438         I: ~const SliceIndex<Self>,
439     {
440         // SAFETY: the caller must uphold the safety requirements for `get_unchecked_mut`;
441         // the slice is dereferenceable because `self` is a safe reference.
442         // The returned pointer is safe because impls of `SliceIndex` have to guarantee that it is.
443         unsafe { &mut *index.get_unchecked_mut(self) }
444     }
445
446     /// Returns a raw pointer to the slice's buffer.
447     ///
448     /// The caller must ensure that the slice outlives the pointer this
449     /// function returns, or else it will end up pointing to garbage.
450     ///
451     /// The caller must also ensure that the memory the pointer (non-transitively) points to
452     /// is never written to (except inside an `UnsafeCell`) using this pointer or any pointer
453     /// derived from it. If you need to mutate the contents of the slice, use [`as_mut_ptr`].
454     ///
455     /// Modifying the container referenced by this slice may cause its buffer
456     /// to be reallocated, which would also make any pointers to it invalid.
457     ///
458     /// # Examples
459     ///
460     /// ```
461     /// let x = &[1, 2, 4];
462     /// let x_ptr = x.as_ptr();
463     ///
464     /// unsafe {
465     ///     for i in 0..x.len() {
466     ///         assert_eq!(x.get_unchecked(i), &*x_ptr.add(i));
467     ///     }
468     /// }
469     /// ```
470     ///
471     /// [`as_mut_ptr`]: slice::as_mut_ptr
472     #[stable(feature = "rust1", since = "1.0.0")]
473     #[rustc_const_stable(feature = "const_slice_as_ptr", since = "1.32.0")]
474     #[inline]
475     #[must_use]
476     pub const fn as_ptr(&self) -> *const T {
477         self as *const [T] as *const T
478     }
479
480     /// Returns an unsafe mutable pointer to the slice's buffer.
481     ///
482     /// The caller must ensure that the slice outlives the pointer this
483     /// function returns, or else it will end up pointing to garbage.
484     ///
485     /// Modifying the container referenced by this slice may cause its buffer
486     /// to be reallocated, which would also make any pointers to it invalid.
487     ///
488     /// # Examples
489     ///
490     /// ```
491     /// let x = &mut [1, 2, 4];
492     /// let x_ptr = x.as_mut_ptr();
493     ///
494     /// unsafe {
495     ///     for i in 0..x.len() {
496     ///         *x_ptr.add(i) += 2;
497     ///     }
498     /// }
499     /// assert_eq!(x, &[3, 4, 6]);
500     /// ```
501     #[stable(feature = "rust1", since = "1.0.0")]
502     #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
503     #[rustc_allow_const_fn_unstable(const_mut_refs)]
504     #[inline]
505     #[must_use]
506     pub const fn as_mut_ptr(&mut self) -> *mut T {
507         self as *mut [T] as *mut T
508     }
509
510     /// Returns the two raw pointers spanning the slice.
511     ///
512     /// The returned range is half-open, which means that the end pointer
513     /// points *one past* the last element of the slice. This way, an empty
514     /// slice is represented by two equal pointers, and the difference between
515     /// the two pointers represents the size of the slice.
516     ///
517     /// See [`as_ptr`] for warnings on using these pointers. The end pointer
518     /// requires extra caution, as it does not point to a valid element in the
519     /// slice.
520     ///
521     /// This function is useful for interacting with foreign interfaces which
522     /// use two pointers to refer to a range of elements in memory, as is
523     /// common in C++.
524     ///
525     /// It can also be useful to check if a pointer to an element refers to an
526     /// element of this slice:
527     ///
528     /// ```
529     /// let a = [1, 2, 3];
530     /// let x = &a[1] as *const _;
531     /// let y = &5 as *const _;
532     ///
533     /// assert!(a.as_ptr_range().contains(&x));
534     /// assert!(!a.as_ptr_range().contains(&y));
535     /// ```
536     ///
537     /// [`as_ptr`]: slice::as_ptr
538     #[stable(feature = "slice_ptr_range", since = "1.48.0")]
539     #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
540     #[inline]
541     #[must_use]
542     pub const fn as_ptr_range(&self) -> Range<*const T> {
543         let start = self.as_ptr();
544         // SAFETY: The `add` here is safe, because:
545         //
546         //   - Both pointers are part of the same object, as pointing directly
547         //     past the object also counts.
548         //
549         //   - The size of the slice is never larger than isize::MAX bytes, as
550         //     noted here:
551         //       - https://github.com/rust-lang/unsafe-code-guidelines/issues/102#issuecomment-473340447
552         //       - https://doc.rust-lang.org/reference/behavior-considered-undefined.html
553         //       - https://doc.rust-lang.org/core/slice/fn.from_raw_parts.html#safety
554         //     (This doesn't seem normative yet, but the very same assumption is
555         //     made in many places, including the Index implementation of slices.)
556         //
557         //   - There is no wrapping around involved, as slices do not wrap past
558         //     the end of the address space.
559         //
560         // See the documentation of pointer::add.
561         let end = unsafe { start.add(self.len()) };
562         start..end
563     }
564
565     /// Returns the two unsafe mutable pointers spanning the slice.
566     ///
567     /// The returned range is half-open, which means that the end pointer
568     /// points *one past* the last element of the slice. This way, an empty
569     /// slice is represented by two equal pointers, and the difference between
570     /// the two pointers represents the size of the slice.
571     ///
572     /// See [`as_mut_ptr`] for warnings on using these pointers. The end
573     /// pointer requires extra caution, as it does not point to a valid element
574     /// in the slice.
575     ///
576     /// This function is useful for interacting with foreign interfaces which
577     /// use two pointers to refer to a range of elements in memory, as is
578     /// common in C++.
579     ///
580     /// [`as_mut_ptr`]: slice::as_mut_ptr
581     #[stable(feature = "slice_ptr_range", since = "1.48.0")]
582     #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
583     #[rustc_allow_const_fn_unstable(const_mut_refs)]
584     #[inline]
585     #[must_use]
586     pub const fn as_mut_ptr_range(&mut self) -> Range<*mut T> {
587         let start = self.as_mut_ptr();
588         // SAFETY: See as_ptr_range() above for why `add` here is safe.
589         let end = unsafe { start.add(self.len()) };
590         start..end
591     }
592
593     /// Swaps two elements in the slice.
594     ///
595     /// # Arguments
596     ///
597     /// * a - The index of the first element
598     /// * b - The index of the second element
599     ///
600     /// # Panics
601     ///
602     /// Panics if `a` or `b` are out of bounds.
603     ///
604     /// # Examples
605     ///
606     /// ```
607     /// let mut v = ["a", "b", "c", "d", "e"];
608     /// v.swap(2, 4);
609     /// assert!(v == ["a", "b", "e", "d", "c"]);
610     /// ```
611     #[stable(feature = "rust1", since = "1.0.0")]
612     #[rustc_const_unstable(feature = "const_swap", issue = "83163")]
613     #[inline]
614     #[track_caller]
615     pub const fn swap(&mut self, a: usize, b: usize) {
616         // FIXME: use swap_unchecked here (https://github.com/rust-lang/rust/pull/88540#issuecomment-944344343)
617         // Can't take two mutable loans from one vector, so instead use raw pointers.
618         let pa = ptr::addr_of_mut!(self[a]);
619         let pb = ptr::addr_of_mut!(self[b]);
620         // SAFETY: `pa` and `pb` have been created from safe mutable references and refer
621         // to elements in the slice and therefore are guaranteed to be valid and aligned.
622         // Note that accessing the elements behind `a` and `b` is checked and will
623         // panic when out of bounds.
624         unsafe {
625             ptr::swap(pa, pb);
626         }
627     }
628
629     /// Swaps two elements in the slice, without doing bounds checking.
630     ///
631     /// For a safe alternative see [`swap`].
632     ///
633     /// # Arguments
634     ///
635     /// * a - The index of the first element
636     /// * b - The index of the second element
637     ///
638     /// # Safety
639     ///
640     /// Calling this method with an out-of-bounds index is *[undefined behavior]*.
641     /// The caller has to ensure that `a < self.len()` and `b < self.len()`.
642     ///
643     /// # Examples
644     ///
645     /// ```
646     /// #![feature(slice_swap_unchecked)]
647     ///
648     /// let mut v = ["a", "b", "c", "d"];
649     /// // SAFETY: we know that 1 and 3 are both indices of the slice
650     /// unsafe { v.swap_unchecked(1, 3) };
651     /// assert!(v == ["a", "d", "c", "b"]);
652     /// ```
653     ///
654     /// [`swap`]: slice::swap
655     /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
656     #[unstable(feature = "slice_swap_unchecked", issue = "88539")]
657     #[rustc_const_unstable(feature = "const_swap", issue = "83163")]
658     pub const unsafe fn swap_unchecked(&mut self, a: usize, b: usize) {
659         let this = self;
660         let ptr = this.as_mut_ptr();
661         // SAFETY: caller has to guarantee that `a < self.len()` and `b < self.len()`
662         unsafe {
663             assert_unsafe_precondition!([T](a: usize, b: usize, this: &mut [T]) => a < this.len() && b < this.len());
664             ptr::swap(ptr.add(a), ptr.add(b));
665         }
666     }
667
668     /// Reverses the order of elements in the slice, in place.
669     ///
670     /// # Examples
671     ///
672     /// ```
673     /// let mut v = [1, 2, 3];
674     /// v.reverse();
675     /// assert!(v == [3, 2, 1]);
676     /// ```
677     #[stable(feature = "rust1", since = "1.0.0")]
678     #[rustc_const_unstable(feature = "const_reverse", issue = "100784")]
679     #[inline]
680     pub const fn reverse(&mut self) {
681         let half_len = self.len() / 2;
682         let Range { start, end } = self.as_mut_ptr_range();
683
684         // These slices will skip the middle item for an odd length,
685         // since that one doesn't need to move.
686         let (front_half, back_half) =
687             // SAFETY: Both are subparts of the original slice, so the memory
688             // range is valid, and they don't overlap because they're each only
689             // half (or less) of the original slice.
690             unsafe {
691                 (
692                     slice::from_raw_parts_mut(start, half_len),
693                     slice::from_raw_parts_mut(end.sub(half_len), half_len),
694                 )
695             };
696
697         // Introducing a function boundary here means that the two halves
698         // get `noalias` markers, allowing better optimization as LLVM
699         // knows that they're disjoint, unlike in the original slice.
700         revswap(front_half, back_half, half_len);
701
702         #[inline]
703         const fn revswap<T>(a: &mut [T], b: &mut [T], n: usize) {
704             debug_assert!(a.len() == n);
705             debug_assert!(b.len() == n);
706
707             // Because this function is first compiled in isolation,
708             // this check tells LLVM that the indexing below is
709             // in-bounds.  Then after inlining -- once the actual
710             // lengths of the slices are known -- it's removed.
711             let (a, b) = (&mut a[..n], &mut b[..n]);
712
713             let mut i = 0;
714             while i < n {
715                 mem::swap(&mut a[i], &mut b[n - 1 - i]);
716                 i += 1;
717             }
718         }
719     }
720
721     /// Returns an iterator over the slice.
722     ///
723     /// The iterator yields all items from start to end.
724     ///
725     /// # Examples
726     ///
727     /// ```
728     /// let x = &[1, 2, 4];
729     /// let mut iterator = x.iter();
730     ///
731     /// assert_eq!(iterator.next(), Some(&1));
732     /// assert_eq!(iterator.next(), Some(&2));
733     /// assert_eq!(iterator.next(), Some(&4));
734     /// assert_eq!(iterator.next(), None);
735     /// ```
736     #[stable(feature = "rust1", since = "1.0.0")]
737     #[inline]
738     pub fn iter(&self) -> Iter<'_, T> {
739         Iter::new(self)
740     }
741
742     /// Returns an iterator that allows modifying each value.
743     ///
744     /// The iterator yields all items from start to end.
745     ///
746     /// # Examples
747     ///
748     /// ```
749     /// let x = &mut [1, 2, 4];
750     /// for elem in x.iter_mut() {
751     ///     *elem += 2;
752     /// }
753     /// assert_eq!(x, &[3, 4, 6]);
754     /// ```
755     #[stable(feature = "rust1", since = "1.0.0")]
756     #[inline]
757     pub fn iter_mut(&mut self) -> IterMut<'_, T> {
758         IterMut::new(self)
759     }
760
761     /// Returns an iterator over all contiguous windows of length
762     /// `size`. The windows overlap. If the slice is shorter than
763     /// `size`, the iterator returns no values.
764     ///
765     /// # Panics
766     ///
767     /// Panics if `size` is 0.
768     ///
769     /// # Examples
770     ///
771     /// ```
772     /// let slice = ['r', 'u', 's', 't'];
773     /// let mut iter = slice.windows(2);
774     /// assert_eq!(iter.next().unwrap(), &['r', 'u']);
775     /// assert_eq!(iter.next().unwrap(), &['u', 's']);
776     /// assert_eq!(iter.next().unwrap(), &['s', 't']);
777     /// assert!(iter.next().is_none());
778     /// ```
779     ///
780     /// If the slice is shorter than `size`:
781     ///
782     /// ```
783     /// let slice = ['f', 'o', 'o'];
784     /// let mut iter = slice.windows(4);
785     /// assert!(iter.next().is_none());
786     /// ```
787     #[stable(feature = "rust1", since = "1.0.0")]
788     #[inline]
789     pub fn windows(&self, size: usize) -> Windows<'_, T> {
790         let size = NonZeroUsize::new(size).expect("size is zero");
791         Windows::new(self, size)
792     }
793
794     /// Returns an iterator over `chunk_size` elements of the slice at a time, starting at the
795     /// beginning of the slice.
796     ///
797     /// The chunks are slices and do not overlap. If `chunk_size` does not divide the length of the
798     /// slice, then the last chunk will not have length `chunk_size`.
799     ///
800     /// See [`chunks_exact`] for a variant of this iterator that returns chunks of always exactly
801     /// `chunk_size` elements, and [`rchunks`] for the same iterator but starting at the end of the
802     /// slice.
803     ///
804     /// # Panics
805     ///
806     /// Panics if `chunk_size` is 0.
807     ///
808     /// # Examples
809     ///
810     /// ```
811     /// let slice = ['l', 'o', 'r', 'e', 'm'];
812     /// let mut iter = slice.chunks(2);
813     /// assert_eq!(iter.next().unwrap(), &['l', 'o']);
814     /// assert_eq!(iter.next().unwrap(), &['r', 'e']);
815     /// assert_eq!(iter.next().unwrap(), &['m']);
816     /// assert!(iter.next().is_none());
817     /// ```
818     ///
819     /// [`chunks_exact`]: slice::chunks_exact
820     /// [`rchunks`]: slice::rchunks
821     #[stable(feature = "rust1", since = "1.0.0")]
822     #[inline]
823     pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T> {
824         assert_ne!(chunk_size, 0, "chunks cannot have a size of zero");
825         Chunks::new(self, chunk_size)
826     }
827
828     /// Returns an iterator over `chunk_size` elements of the slice at a time, starting at the
829     /// beginning of the slice.
830     ///
831     /// The chunks are mutable slices, and do not overlap. If `chunk_size` does not divide the
832     /// length of the slice, then the last chunk will not have length `chunk_size`.
833     ///
834     /// See [`chunks_exact_mut`] for a variant of this iterator that returns chunks of always
835     /// exactly `chunk_size` elements, and [`rchunks_mut`] for the same iterator but starting at
836     /// the end of the slice.
837     ///
838     /// # Panics
839     ///
840     /// Panics if `chunk_size` is 0.
841     ///
842     /// # Examples
843     ///
844     /// ```
845     /// let v = &mut [0, 0, 0, 0, 0];
846     /// let mut count = 1;
847     ///
848     /// for chunk in v.chunks_mut(2) {
849     ///     for elem in chunk.iter_mut() {
850     ///         *elem += count;
851     ///     }
852     ///     count += 1;
853     /// }
854     /// assert_eq!(v, &[1, 1, 2, 2, 3]);
855     /// ```
856     ///
857     /// [`chunks_exact_mut`]: slice::chunks_exact_mut
858     /// [`rchunks_mut`]: slice::rchunks_mut
859     #[stable(feature = "rust1", since = "1.0.0")]
860     #[inline]
861     pub fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<'_, T> {
862         assert_ne!(chunk_size, 0, "chunks cannot have a size of zero");
863         ChunksMut::new(self, chunk_size)
864     }
865
866     /// Returns an iterator over `chunk_size` elements of the slice at a time, starting at the
867     /// beginning of the slice.
868     ///
869     /// The chunks are slices and do not overlap. If `chunk_size` does not divide the length of the
870     /// slice, then the last up to `chunk_size-1` elements will be omitted and can be retrieved
871     /// from the `remainder` function of the iterator.
872     ///
873     /// Due to each chunk having exactly `chunk_size` elements, the compiler can often optimize the
874     /// resulting code better than in the case of [`chunks`].
875     ///
876     /// See [`chunks`] for a variant of this iterator that also returns the remainder as a smaller
877     /// chunk, and [`rchunks_exact`] for the same iterator but starting at the end of the slice.
878     ///
879     /// # Panics
880     ///
881     /// Panics if `chunk_size` is 0.
882     ///
883     /// # Examples
884     ///
885     /// ```
886     /// let slice = ['l', 'o', 'r', 'e', 'm'];
887     /// let mut iter = slice.chunks_exact(2);
888     /// assert_eq!(iter.next().unwrap(), &['l', 'o']);
889     /// assert_eq!(iter.next().unwrap(), &['r', 'e']);
890     /// assert!(iter.next().is_none());
891     /// assert_eq!(iter.remainder(), &['m']);
892     /// ```
893     ///
894     /// [`chunks`]: slice::chunks
895     /// [`rchunks_exact`]: slice::rchunks_exact
896     #[stable(feature = "chunks_exact", since = "1.31.0")]
897     #[inline]
898     pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T> {
899         assert_ne!(chunk_size, 0);
900         ChunksExact::new(self, chunk_size)
901     }
902
903     /// Returns an iterator over `chunk_size` elements of the slice at a time, starting at the
904     /// beginning of the slice.
905     ///
906     /// The chunks are mutable slices, and do not overlap. If `chunk_size` does not divide the
907     /// length of the slice, then the last up to `chunk_size-1` elements will be omitted and can be
908     /// retrieved from the `into_remainder` function of the iterator.
909     ///
910     /// Due to each chunk having exactly `chunk_size` elements, the compiler can often optimize the
911     /// resulting code better than in the case of [`chunks_mut`].
912     ///
913     /// See [`chunks_mut`] for a variant of this iterator that also returns the remainder as a
914     /// smaller chunk, and [`rchunks_exact_mut`] for the same iterator but starting at the end of
915     /// the slice.
916     ///
917     /// # Panics
918     ///
919     /// Panics if `chunk_size` is 0.
920     ///
921     /// # Examples
922     ///
923     /// ```
924     /// let v = &mut [0, 0, 0, 0, 0];
925     /// let mut count = 1;
926     ///
927     /// for chunk in v.chunks_exact_mut(2) {
928     ///     for elem in chunk.iter_mut() {
929     ///         *elem += count;
930     ///     }
931     ///     count += 1;
932     /// }
933     /// assert_eq!(v, &[1, 1, 2, 2, 0]);
934     /// ```
935     ///
936     /// [`chunks_mut`]: slice::chunks_mut
937     /// [`rchunks_exact_mut`]: slice::rchunks_exact_mut
938     #[stable(feature = "chunks_exact", since = "1.31.0")]
939     #[inline]
940     pub fn chunks_exact_mut(&mut self, chunk_size: usize) -> ChunksExactMut<'_, T> {
941         assert_ne!(chunk_size, 0);
942         ChunksExactMut::new(self, chunk_size)
943     }
944
945     /// Splits the slice into a slice of `N`-element arrays,
946     /// assuming that there's no remainder.
947     ///
948     /// # Safety
949     ///
950     /// This may only be called when
951     /// - The slice splits exactly into `N`-element chunks (aka `self.len() % N == 0`).
952     /// - `N != 0`.
953     ///
954     /// # Examples
955     ///
956     /// ```
957     /// #![feature(slice_as_chunks)]
958     /// let slice: &[char] = &['l', 'o', 'r', 'e', 'm', '!'];
959     /// let chunks: &[[char; 1]] =
960     ///     // SAFETY: 1-element chunks never have remainder
961     ///     unsafe { slice.as_chunks_unchecked() };
962     /// assert_eq!(chunks, &[['l'], ['o'], ['r'], ['e'], ['m'], ['!']]);
963     /// let chunks: &[[char; 3]] =
964     ///     // SAFETY: The slice length (6) is a multiple of 3
965     ///     unsafe { slice.as_chunks_unchecked() };
966     /// assert_eq!(chunks, &[['l', 'o', 'r'], ['e', 'm', '!']]);
967     ///
968     /// // These would be unsound:
969     /// // let chunks: &[[_; 5]] = slice.as_chunks_unchecked() // The slice length is not a multiple of 5
970     /// // let chunks: &[[_; 0]] = slice.as_chunks_unchecked() // Zero-length chunks are never allowed
971     /// ```
972     #[unstable(feature = "slice_as_chunks", issue = "74985")]
973     #[inline]
974     #[must_use]
975     pub unsafe fn as_chunks_unchecked<const N: usize>(&self) -> &[[T; N]] {
976         let this = self;
977         // SAFETY: Caller must guarantee that `N` is nonzero and exactly divides the slice length
978         let new_len = unsafe {
979             assert_unsafe_precondition!([T](this: &[T], N: usize) => N != 0 && this.len() % N == 0);
980             exact_div(self.len(), N)
981         };
982         // SAFETY: We cast a slice of `new_len * N` elements into
983         // a slice of `new_len` many `N` elements chunks.
984         unsafe { from_raw_parts(self.as_ptr().cast(), new_len) }
985     }
986
987     /// Splits the slice into a slice of `N`-element arrays,
988     /// starting at the beginning of the slice,
989     /// and a remainder slice with length strictly less than `N`.
990     ///
991     /// # Panics
992     ///
993     /// Panics if `N` is 0. This check will most probably get changed to a compile time
994     /// error before this method gets stabilized.
995     ///
996     /// # Examples
997     ///
998     /// ```
999     /// #![feature(slice_as_chunks)]
1000     /// let slice = ['l', 'o', 'r', 'e', 'm'];
1001     /// let (chunks, remainder) = slice.as_chunks();
1002     /// assert_eq!(chunks, &[['l', 'o'], ['r', 'e']]);
1003     /// assert_eq!(remainder, &['m']);
1004     /// ```
1005     #[unstable(feature = "slice_as_chunks", issue = "74985")]
1006     #[inline]
1007     #[must_use]
1008     pub fn as_chunks<const N: usize>(&self) -> (&[[T; N]], &[T]) {
1009         assert_ne!(N, 0);
1010         let len = self.len() / N;
1011         let (multiple_of_n, remainder) = self.split_at(len * N);
1012         // SAFETY: We already panicked for zero, and ensured by construction
1013         // that the length of the subslice is a multiple of N.
1014         let array_slice = unsafe { multiple_of_n.as_chunks_unchecked() };
1015         (array_slice, remainder)
1016     }
1017
1018     /// Splits the slice into a slice of `N`-element arrays,
1019     /// starting at the end of the slice,
1020     /// and a remainder slice with length strictly less than `N`.
1021     ///
1022     /// # Panics
1023     ///
1024     /// Panics if `N` is 0. This check will most probably get changed to a compile time
1025     /// error before this method gets stabilized.
1026     ///
1027     /// # Examples
1028     ///
1029     /// ```
1030     /// #![feature(slice_as_chunks)]
1031     /// let slice = ['l', 'o', 'r', 'e', 'm'];
1032     /// let (remainder, chunks) = slice.as_rchunks();
1033     /// assert_eq!(remainder, &['l']);
1034     /// assert_eq!(chunks, &[['o', 'r'], ['e', 'm']]);
1035     /// ```
1036     #[unstable(feature = "slice_as_chunks", issue = "74985")]
1037     #[inline]
1038     #[must_use]
1039     pub fn as_rchunks<const N: usize>(&self) -> (&[T], &[[T; N]]) {
1040         assert_ne!(N, 0);
1041         let len = self.len() / N;
1042         let (remainder, multiple_of_n) = self.split_at(self.len() - len * N);
1043         // SAFETY: We already panicked for zero, and ensured by construction
1044         // that the length of the subslice is a multiple of N.
1045         let array_slice = unsafe { multiple_of_n.as_chunks_unchecked() };
1046         (remainder, array_slice)
1047     }
1048
1049     /// Returns an iterator over `N` elements of the slice at a time, starting at the
1050     /// beginning of the slice.
1051     ///
1052     /// The chunks are array references and do not overlap. If `N` does not divide the
1053     /// length of the slice, then the last up to `N-1` elements will be omitted and can be
1054     /// retrieved from the `remainder` function of the iterator.
1055     ///
1056     /// This method is the const generic equivalent of [`chunks_exact`].
1057     ///
1058     /// # Panics
1059     ///
1060     /// Panics if `N` is 0. This check will most probably get changed to a compile time
1061     /// error before this method gets stabilized.
1062     ///
1063     /// # Examples
1064     ///
1065     /// ```
1066     /// #![feature(array_chunks)]
1067     /// let slice = ['l', 'o', 'r', 'e', 'm'];
1068     /// let mut iter = slice.array_chunks();
1069     /// assert_eq!(iter.next().unwrap(), &['l', 'o']);
1070     /// assert_eq!(iter.next().unwrap(), &['r', 'e']);
1071     /// assert!(iter.next().is_none());
1072     /// assert_eq!(iter.remainder(), &['m']);
1073     /// ```
1074     ///
1075     /// [`chunks_exact`]: slice::chunks_exact
1076     #[unstable(feature = "array_chunks", issue = "74985")]
1077     #[inline]
1078     pub fn array_chunks<const N: usize>(&self) -> ArrayChunks<'_, T, N> {
1079         assert_ne!(N, 0);
1080         ArrayChunks::new(self)
1081     }
1082
1083     /// Splits the slice into a slice of `N`-element arrays,
1084     /// assuming that there's no remainder.
1085     ///
1086     /// # Safety
1087     ///
1088     /// This may only be called when
1089     /// - The slice splits exactly into `N`-element chunks (aka `self.len() % N == 0`).
1090     /// - `N != 0`.
1091     ///
1092     /// # Examples
1093     ///
1094     /// ```
1095     /// #![feature(slice_as_chunks)]
1096     /// let slice: &mut [char] = &mut ['l', 'o', 'r', 'e', 'm', '!'];
1097     /// let chunks: &mut [[char; 1]] =
1098     ///     // SAFETY: 1-element chunks never have remainder
1099     ///     unsafe { slice.as_chunks_unchecked_mut() };
1100     /// chunks[0] = ['L'];
1101     /// assert_eq!(chunks, &[['L'], ['o'], ['r'], ['e'], ['m'], ['!']]);
1102     /// let chunks: &mut [[char; 3]] =
1103     ///     // SAFETY: The slice length (6) is a multiple of 3
1104     ///     unsafe { slice.as_chunks_unchecked_mut() };
1105     /// chunks[1] = ['a', 'x', '?'];
1106     /// assert_eq!(slice, &['L', 'o', 'r', 'a', 'x', '?']);
1107     ///
1108     /// // These would be unsound:
1109     /// // let chunks: &[[_; 5]] = slice.as_chunks_unchecked_mut() // The slice length is not a multiple of 5
1110     /// // let chunks: &[[_; 0]] = slice.as_chunks_unchecked_mut() // Zero-length chunks are never allowed
1111     /// ```
1112     #[unstable(feature = "slice_as_chunks", issue = "74985")]
1113     #[inline]
1114     #[must_use]
1115     pub unsafe fn as_chunks_unchecked_mut<const N: usize>(&mut self) -> &mut [[T; N]] {
1116         let this = &*self;
1117         // SAFETY: Caller must guarantee that `N` is nonzero and exactly divides the slice length
1118         let new_len = unsafe {
1119             assert_unsafe_precondition!([T](this: &[T], N: usize) => N != 0 && this.len() % N == 0);
1120             exact_div(this.len(), N)
1121         };
1122         // SAFETY: We cast a slice of `new_len * N` elements into
1123         // a slice of `new_len` many `N` elements chunks.
1124         unsafe { from_raw_parts_mut(self.as_mut_ptr().cast(), new_len) }
1125     }
1126
1127     /// Splits the slice into a slice of `N`-element arrays,
1128     /// starting at the beginning of the slice,
1129     /// and a remainder slice with length strictly less than `N`.
1130     ///
1131     /// # Panics
1132     ///
1133     /// Panics if `N` is 0. This check will most probably get changed to a compile time
1134     /// error before this method gets stabilized.
1135     ///
1136     /// # Examples
1137     ///
1138     /// ```
1139     /// #![feature(slice_as_chunks)]
1140     /// let v = &mut [0, 0, 0, 0, 0];
1141     /// let mut count = 1;
1142     ///
1143     /// let (chunks, remainder) = v.as_chunks_mut();
1144     /// remainder[0] = 9;
1145     /// for chunk in chunks {
1146     ///     *chunk = [count; 2];
1147     ///     count += 1;
1148     /// }
1149     /// assert_eq!(v, &[1, 1, 2, 2, 9]);
1150     /// ```
1151     #[unstable(feature = "slice_as_chunks", issue = "74985")]
1152     #[inline]
1153     #[must_use]
1154     pub fn as_chunks_mut<const N: usize>(&mut self) -> (&mut [[T; N]], &mut [T]) {
1155         assert_ne!(N, 0);
1156         let len = self.len() / N;
1157         let (multiple_of_n, remainder) = self.split_at_mut(len * N);
1158         // SAFETY: We already panicked for zero, and ensured by construction
1159         // that the length of the subslice is a multiple of N.
1160         let array_slice = unsafe { multiple_of_n.as_chunks_unchecked_mut() };
1161         (array_slice, remainder)
1162     }
1163
1164     /// Splits the slice into a slice of `N`-element arrays,
1165     /// starting at the end of the slice,
1166     /// and a remainder slice with length strictly less than `N`.
1167     ///
1168     /// # Panics
1169     ///
1170     /// Panics if `N` is 0. This check will most probably get changed to a compile time
1171     /// error before this method gets stabilized.
1172     ///
1173     /// # Examples
1174     ///
1175     /// ```
1176     /// #![feature(slice_as_chunks)]
1177     /// let v = &mut [0, 0, 0, 0, 0];
1178     /// let mut count = 1;
1179     ///
1180     /// let (remainder, chunks) = v.as_rchunks_mut();
1181     /// remainder[0] = 9;
1182     /// for chunk in chunks {
1183     ///     *chunk = [count; 2];
1184     ///     count += 1;
1185     /// }
1186     /// assert_eq!(v, &[9, 1, 1, 2, 2]);
1187     /// ```
1188     #[unstable(feature = "slice_as_chunks", issue = "74985")]
1189     #[inline]
1190     #[must_use]
1191     pub fn as_rchunks_mut<const N: usize>(&mut self) -> (&mut [T], &mut [[T; N]]) {
1192         assert_ne!(N, 0);
1193         let len = self.len() / N;
1194         let (remainder, multiple_of_n) = self.split_at_mut(self.len() - len * N);
1195         // SAFETY: We already panicked for zero, and ensured by construction
1196         // that the length of the subslice is a multiple of N.
1197         let array_slice = unsafe { multiple_of_n.as_chunks_unchecked_mut() };
1198         (remainder, array_slice)
1199     }
1200
1201     /// Returns an iterator over `N` elements of the slice at a time, starting at the
1202     /// beginning of the slice.
1203     ///
1204     /// The chunks are mutable array references and do not overlap. If `N` does not divide
1205     /// the length of the slice, then the last up to `N-1` elements will be omitted and
1206     /// can be retrieved from the `into_remainder` function of the iterator.
1207     ///
1208     /// This method is the const generic equivalent of [`chunks_exact_mut`].
1209     ///
1210     /// # Panics
1211     ///
1212     /// Panics if `N` is 0. This check will most probably get changed to a compile time
1213     /// error before this method gets stabilized.
1214     ///
1215     /// # Examples
1216     ///
1217     /// ```
1218     /// #![feature(array_chunks)]
1219     /// let v = &mut [0, 0, 0, 0, 0];
1220     /// let mut count = 1;
1221     ///
1222     /// for chunk in v.array_chunks_mut() {
1223     ///     *chunk = [count; 2];
1224     ///     count += 1;
1225     /// }
1226     /// assert_eq!(v, &[1, 1, 2, 2, 0]);
1227     /// ```
1228     ///
1229     /// [`chunks_exact_mut`]: slice::chunks_exact_mut
1230     #[unstable(feature = "array_chunks", issue = "74985")]
1231     #[inline]
1232     pub fn array_chunks_mut<const N: usize>(&mut self) -> ArrayChunksMut<'_, T, N> {
1233         assert_ne!(N, 0);
1234         ArrayChunksMut::new(self)
1235     }
1236
1237     /// Returns an iterator over overlapping windows of `N` elements of  a slice,
1238     /// starting at the beginning of the slice.
1239     ///
1240     /// This is the const generic equivalent of [`windows`].
1241     ///
1242     /// If `N` is greater than the size of the slice, it will return no windows.
1243     ///
1244     /// # Panics
1245     ///
1246     /// Panics if `N` is 0. This check will most probably get changed to a compile time
1247     /// error before this method gets stabilized.
1248     ///
1249     /// # Examples
1250     ///
1251     /// ```
1252     /// #![feature(array_windows)]
1253     /// let slice = [0, 1, 2, 3];
1254     /// let mut iter = slice.array_windows();
1255     /// assert_eq!(iter.next().unwrap(), &[0, 1]);
1256     /// assert_eq!(iter.next().unwrap(), &[1, 2]);
1257     /// assert_eq!(iter.next().unwrap(), &[2, 3]);
1258     /// assert!(iter.next().is_none());
1259     /// ```
1260     ///
1261     /// [`windows`]: slice::windows
1262     #[unstable(feature = "array_windows", issue = "75027")]
1263     #[inline]
1264     pub fn array_windows<const N: usize>(&self) -> ArrayWindows<'_, T, N> {
1265         assert_ne!(N, 0);
1266         ArrayWindows::new(self)
1267     }
1268
1269     /// Returns an iterator over `chunk_size` elements of the slice at a time, starting at the end
1270     /// of the slice.
1271     ///
1272     /// The chunks are slices and do not overlap. If `chunk_size` does not divide the length of the
1273     /// slice, then the last chunk will not have length `chunk_size`.
1274     ///
1275     /// See [`rchunks_exact`] for a variant of this iterator that returns chunks of always exactly
1276     /// `chunk_size` elements, and [`chunks`] for the same iterator but starting at the beginning
1277     /// of the slice.
1278     ///
1279     /// # Panics
1280     ///
1281     /// Panics if `chunk_size` is 0.
1282     ///
1283     /// # Examples
1284     ///
1285     /// ```
1286     /// let slice = ['l', 'o', 'r', 'e', 'm'];
1287     /// let mut iter = slice.rchunks(2);
1288     /// assert_eq!(iter.next().unwrap(), &['e', 'm']);
1289     /// assert_eq!(iter.next().unwrap(), &['o', 'r']);
1290     /// assert_eq!(iter.next().unwrap(), &['l']);
1291     /// assert!(iter.next().is_none());
1292     /// ```
1293     ///
1294     /// [`rchunks_exact`]: slice::rchunks_exact
1295     /// [`chunks`]: slice::chunks
1296     #[stable(feature = "rchunks", since = "1.31.0")]
1297     #[inline]
1298     pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T> {
1299         assert!(chunk_size != 0);
1300         RChunks::new(self, chunk_size)
1301     }
1302
1303     /// Returns an iterator over `chunk_size` elements of the slice at a time, starting at the end
1304     /// of the slice.
1305     ///
1306     /// The chunks are mutable slices, and do not overlap. If `chunk_size` does not divide the
1307     /// length of the slice, then the last chunk will not have length `chunk_size`.
1308     ///
1309     /// See [`rchunks_exact_mut`] for a variant of this iterator that returns chunks of always
1310     /// exactly `chunk_size` elements, and [`chunks_mut`] for the same iterator but starting at the
1311     /// beginning of the slice.
1312     ///
1313     /// # Panics
1314     ///
1315     /// Panics if `chunk_size` is 0.
1316     ///
1317     /// # Examples
1318     ///
1319     /// ```
1320     /// let v = &mut [0, 0, 0, 0, 0];
1321     /// let mut count = 1;
1322     ///
1323     /// for chunk in v.rchunks_mut(2) {
1324     ///     for elem in chunk.iter_mut() {
1325     ///         *elem += count;
1326     ///     }
1327     ///     count += 1;
1328     /// }
1329     /// assert_eq!(v, &[3, 2, 2, 1, 1]);
1330     /// ```
1331     ///
1332     /// [`rchunks_exact_mut`]: slice::rchunks_exact_mut
1333     /// [`chunks_mut`]: slice::chunks_mut
1334     #[stable(feature = "rchunks", since = "1.31.0")]
1335     #[inline]
1336     pub fn rchunks_mut(&mut self, chunk_size: usize) -> RChunksMut<'_, T> {
1337         assert!(chunk_size != 0);
1338         RChunksMut::new(self, chunk_size)
1339     }
1340
1341     /// Returns an iterator over `chunk_size` elements of the slice at a time, starting at the
1342     /// end of the slice.
1343     ///
1344     /// The chunks are slices and do not overlap. If `chunk_size` does not divide the length of the
1345     /// slice, then the last up to `chunk_size-1` elements will be omitted and can be retrieved
1346     /// from the `remainder` function of the iterator.
1347     ///
1348     /// Due to each chunk having exactly `chunk_size` elements, the compiler can often optimize the
1349     /// resulting code better than in the case of [`rchunks`].
1350     ///
1351     /// See [`rchunks`] for a variant of this iterator that also returns the remainder as a smaller
1352     /// chunk, and [`chunks_exact`] for the same iterator but starting at the beginning of the
1353     /// slice.
1354     ///
1355     /// # Panics
1356     ///
1357     /// Panics if `chunk_size` is 0.
1358     ///
1359     /// # Examples
1360     ///
1361     /// ```
1362     /// let slice = ['l', 'o', 'r', 'e', 'm'];
1363     /// let mut iter = slice.rchunks_exact(2);
1364     /// assert_eq!(iter.next().unwrap(), &['e', 'm']);
1365     /// assert_eq!(iter.next().unwrap(), &['o', 'r']);
1366     /// assert!(iter.next().is_none());
1367     /// assert_eq!(iter.remainder(), &['l']);
1368     /// ```
1369     ///
1370     /// [`chunks`]: slice::chunks
1371     /// [`rchunks`]: slice::rchunks
1372     /// [`chunks_exact`]: slice::chunks_exact
1373     #[stable(feature = "rchunks", since = "1.31.0")]
1374     #[inline]
1375     pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T> {
1376         assert!(chunk_size != 0);
1377         RChunksExact::new(self, chunk_size)
1378     }
1379
1380     /// Returns an iterator over `chunk_size` elements of the slice at a time, starting at the end
1381     /// of the slice.
1382     ///
1383     /// The chunks are mutable slices, and do not overlap. If `chunk_size` does not divide the
1384     /// length of the slice, then the last up to `chunk_size-1` elements will be omitted and can be
1385     /// retrieved from the `into_remainder` function of the iterator.
1386     ///
1387     /// Due to each chunk having exactly `chunk_size` elements, the compiler can often optimize the
1388     /// resulting code better than in the case of [`chunks_mut`].
1389     ///
1390     /// See [`rchunks_mut`] for a variant of this iterator that also returns the remainder as a
1391     /// smaller chunk, and [`chunks_exact_mut`] for the same iterator but starting at the beginning
1392     /// of the slice.
1393     ///
1394     /// # Panics
1395     ///
1396     /// Panics if `chunk_size` is 0.
1397     ///
1398     /// # Examples
1399     ///
1400     /// ```
1401     /// let v = &mut [0, 0, 0, 0, 0];
1402     /// let mut count = 1;
1403     ///
1404     /// for chunk in v.rchunks_exact_mut(2) {
1405     ///     for elem in chunk.iter_mut() {
1406     ///         *elem += count;
1407     ///     }
1408     ///     count += 1;
1409     /// }
1410     /// assert_eq!(v, &[0, 2, 2, 1, 1]);
1411     /// ```
1412     ///
1413     /// [`chunks_mut`]: slice::chunks_mut
1414     /// [`rchunks_mut`]: slice::rchunks_mut
1415     /// [`chunks_exact_mut`]: slice::chunks_exact_mut
1416     #[stable(feature = "rchunks", since = "1.31.0")]
1417     #[inline]
1418     pub fn rchunks_exact_mut(&mut self, chunk_size: usize) -> RChunksExactMut<'_, T> {
1419         assert!(chunk_size != 0);
1420         RChunksExactMut::new(self, chunk_size)
1421     }
1422
1423     /// Returns an iterator over the slice producing non-overlapping runs
1424     /// of elements using the predicate to separate them.
1425     ///
1426     /// The predicate is called on two elements following themselves,
1427     /// it means the predicate is called on `slice[0]` and `slice[1]`
1428     /// then on `slice[1]` and `slice[2]` and so on.
1429     ///
1430     /// # Examples
1431     ///
1432     /// ```
1433     /// #![feature(slice_group_by)]
1434     ///
1435     /// let slice = &[1, 1, 1, 3, 3, 2, 2, 2];
1436     ///
1437     /// let mut iter = slice.group_by(|a, b| a == b);
1438     ///
1439     /// assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
1440     /// assert_eq!(iter.next(), Some(&[3, 3][..]));
1441     /// assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
1442     /// assert_eq!(iter.next(), None);
1443     /// ```
1444     ///
1445     /// This method can be used to extract the sorted subslices:
1446     ///
1447     /// ```
1448     /// #![feature(slice_group_by)]
1449     ///
1450     /// let slice = &[1, 1, 2, 3, 2, 3, 2, 3, 4];
1451     ///
1452     /// let mut iter = slice.group_by(|a, b| a <= b);
1453     ///
1454     /// assert_eq!(iter.next(), Some(&[1, 1, 2, 3][..]));
1455     /// assert_eq!(iter.next(), Some(&[2, 3][..]));
1456     /// assert_eq!(iter.next(), Some(&[2, 3, 4][..]));
1457     /// assert_eq!(iter.next(), None);
1458     /// ```
1459     #[unstable(feature = "slice_group_by", issue = "80552")]
1460     #[inline]
1461     pub fn group_by<F>(&self, pred: F) -> GroupBy<'_, T, F>
1462     where
1463         F: FnMut(&T, &T) -> bool,
1464     {
1465         GroupBy::new(self, pred)
1466     }
1467
1468     /// Returns an iterator over the slice producing non-overlapping mutable
1469     /// runs of elements using the predicate to separate them.
1470     ///
1471     /// The predicate is called on two elements following themselves,
1472     /// it means the predicate is called on `slice[0]` and `slice[1]`
1473     /// then on `slice[1]` and `slice[2]` and so on.
1474     ///
1475     /// # Examples
1476     ///
1477     /// ```
1478     /// #![feature(slice_group_by)]
1479     ///
1480     /// let slice = &mut [1, 1, 1, 3, 3, 2, 2, 2];
1481     ///
1482     /// let mut iter = slice.group_by_mut(|a, b| a == b);
1483     ///
1484     /// assert_eq!(iter.next(), Some(&mut [1, 1, 1][..]));
1485     /// assert_eq!(iter.next(), Some(&mut [3, 3][..]));
1486     /// assert_eq!(iter.next(), Some(&mut [2, 2, 2][..]));
1487     /// assert_eq!(iter.next(), None);
1488     /// ```
1489     ///
1490     /// This method can be used to extract the sorted subslices:
1491     ///
1492     /// ```
1493     /// #![feature(slice_group_by)]
1494     ///
1495     /// let slice = &mut [1, 1, 2, 3, 2, 3, 2, 3, 4];
1496     ///
1497     /// let mut iter = slice.group_by_mut(|a, b| a <= b);
1498     ///
1499     /// assert_eq!(iter.next(), Some(&mut [1, 1, 2, 3][..]));
1500     /// assert_eq!(iter.next(), Some(&mut [2, 3][..]));
1501     /// assert_eq!(iter.next(), Some(&mut [2, 3, 4][..]));
1502     /// assert_eq!(iter.next(), None);
1503     /// ```
1504     #[unstable(feature = "slice_group_by", issue = "80552")]
1505     #[inline]
1506     pub fn group_by_mut<F>(&mut self, pred: F) -> GroupByMut<'_, T, F>
1507     where
1508         F: FnMut(&T, &T) -> bool,
1509     {
1510         GroupByMut::new(self, pred)
1511     }
1512
1513     /// Divides one slice into two at an index.
1514     ///
1515     /// The first will contain all indices from `[0, mid)` (excluding
1516     /// the index `mid` itself) and the second will contain all
1517     /// indices from `[mid, len)` (excluding the index `len` itself).
1518     ///
1519     /// # Panics
1520     ///
1521     /// Panics if `mid > len`.
1522     ///
1523     /// # Examples
1524     ///
1525     /// ```
1526     /// let v = [1, 2, 3, 4, 5, 6];
1527     ///
1528     /// {
1529     ///    let (left, right) = v.split_at(0);
1530     ///    assert_eq!(left, []);
1531     ///    assert_eq!(right, [1, 2, 3, 4, 5, 6]);
1532     /// }
1533     ///
1534     /// {
1535     ///     let (left, right) = v.split_at(2);
1536     ///     assert_eq!(left, [1, 2]);
1537     ///     assert_eq!(right, [3, 4, 5, 6]);
1538     /// }
1539     ///
1540     /// {
1541     ///     let (left, right) = v.split_at(6);
1542     ///     assert_eq!(left, [1, 2, 3, 4, 5, 6]);
1543     ///     assert_eq!(right, []);
1544     /// }
1545     /// ```
1546     #[stable(feature = "rust1", since = "1.0.0")]
1547     #[rustc_const_unstable(feature = "const_slice_split_at_not_mut", issue = "101158")]
1548     #[inline]
1549     #[track_caller]
1550     #[must_use]
1551     pub const fn split_at(&self, mid: usize) -> (&[T], &[T]) {
1552         assert!(mid <= self.len());
1553         // SAFETY: `[ptr; mid]` and `[mid; len]` are inside `self`, which
1554         // fulfills the requirements of `split_at_unchecked`.
1555         unsafe { self.split_at_unchecked(mid) }
1556     }
1557
1558     /// Divides one mutable slice into two at an index.
1559     ///
1560     /// The first will contain all indices from `[0, mid)` (excluding
1561     /// the index `mid` itself) and the second will contain all
1562     /// indices from `[mid, len)` (excluding the index `len` itself).
1563     ///
1564     /// # Panics
1565     ///
1566     /// Panics if `mid > len`.
1567     ///
1568     /// # Examples
1569     ///
1570     /// ```
1571     /// let mut v = [1, 0, 3, 0, 5, 6];
1572     /// let (left, right) = v.split_at_mut(2);
1573     /// assert_eq!(left, [1, 0]);
1574     /// assert_eq!(right, [3, 0, 5, 6]);
1575     /// left[1] = 2;
1576     /// right[1] = 4;
1577     /// assert_eq!(v, [1, 2, 3, 4, 5, 6]);
1578     /// ```
1579     #[stable(feature = "rust1", since = "1.0.0")]
1580     #[inline]
1581     #[track_caller]
1582     #[must_use]
1583     #[rustc_const_unstable(feature = "const_slice_split_at_mut", issue = "101804")]
1584     pub const fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T]) {
1585         assert!(mid <= self.len());
1586         // SAFETY: `[ptr; mid]` and `[mid; len]` are inside `self`, which
1587         // fulfills the requirements of `from_raw_parts_mut`.
1588         unsafe { self.split_at_mut_unchecked(mid) }
1589     }
1590
1591     /// Divides one slice into two at an index, without doing bounds checking.
1592     ///
1593     /// The first will contain all indices from `[0, mid)` (excluding
1594     /// the index `mid` itself) and the second will contain all
1595     /// indices from `[mid, len)` (excluding the index `len` itself).
1596     ///
1597     /// For a safe alternative see [`split_at`].
1598     ///
1599     /// # Safety
1600     ///
1601     /// Calling this method with an out-of-bounds index is *[undefined behavior]*
1602     /// even if the resulting reference is not used. The caller has to ensure that
1603     /// `0 <= mid <= self.len()`.
1604     ///
1605     /// [`split_at`]: slice::split_at
1606     /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
1607     ///
1608     /// # Examples
1609     ///
1610     /// ```
1611     /// #![feature(slice_split_at_unchecked)]
1612     ///
1613     /// let v = [1, 2, 3, 4, 5, 6];
1614     ///
1615     /// unsafe {
1616     ///    let (left, right) = v.split_at_unchecked(0);
1617     ///    assert_eq!(left, []);
1618     ///    assert_eq!(right, [1, 2, 3, 4, 5, 6]);
1619     /// }
1620     ///
1621     /// unsafe {
1622     ///     let (left, right) = v.split_at_unchecked(2);
1623     ///     assert_eq!(left, [1, 2]);
1624     ///     assert_eq!(right, [3, 4, 5, 6]);
1625     /// }
1626     ///
1627     /// unsafe {
1628     ///     let (left, right) = v.split_at_unchecked(6);
1629     ///     assert_eq!(left, [1, 2, 3, 4, 5, 6]);
1630     ///     assert_eq!(right, []);
1631     /// }
1632     /// ```
1633     #[unstable(feature = "slice_split_at_unchecked", reason = "new API", issue = "76014")]
1634     #[rustc_const_unstable(feature = "slice_split_at_unchecked", issue = "76014")]
1635     #[inline]
1636     #[must_use]
1637     pub const unsafe fn split_at_unchecked(&self, mid: usize) -> (&[T], &[T]) {
1638         // HACK: the const function `from_raw_parts` is used to make this
1639         // function const; previously the implementation used
1640         // `(self.get_unchecked(..mid), self.get_unchecked(mid..))`
1641
1642         let len = self.len();
1643         let ptr = self.as_ptr();
1644
1645         // SAFETY: Caller has to check that `0 <= mid <= self.len()`
1646         unsafe { (from_raw_parts(ptr, mid), from_raw_parts(ptr.add(mid), len - mid)) }
1647     }
1648
1649     /// Divides one mutable slice into two at an index, without doing bounds checking.
1650     ///
1651     /// The first will contain all indices from `[0, mid)` (excluding
1652     /// the index `mid` itself) and the second will contain all
1653     /// indices from `[mid, len)` (excluding the index `len` itself).
1654     ///
1655     /// For a safe alternative see [`split_at_mut`].
1656     ///
1657     /// # Safety
1658     ///
1659     /// Calling this method with an out-of-bounds index is *[undefined behavior]*
1660     /// even if the resulting reference is not used. The caller has to ensure that
1661     /// `0 <= mid <= self.len()`.
1662     ///
1663     /// [`split_at_mut`]: slice::split_at_mut
1664     /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
1665     ///
1666     /// # Examples
1667     ///
1668     /// ```
1669     /// #![feature(slice_split_at_unchecked)]
1670     ///
1671     /// let mut v = [1, 0, 3, 0, 5, 6];
1672     /// // scoped to restrict the lifetime of the borrows
1673     /// unsafe {
1674     ///     let (left, right) = v.split_at_mut_unchecked(2);
1675     ///     assert_eq!(left, [1, 0]);
1676     ///     assert_eq!(right, [3, 0, 5, 6]);
1677     ///     left[1] = 2;
1678     ///     right[1] = 4;
1679     /// }
1680     /// assert_eq!(v, [1, 2, 3, 4, 5, 6]);
1681     /// ```
1682     #[unstable(feature = "slice_split_at_unchecked", reason = "new API", issue = "76014")]
1683     #[rustc_const_unstable(feature = "const_slice_split_at_mut", issue = "101804")]
1684     #[inline]
1685     #[must_use]
1686     pub const unsafe fn split_at_mut_unchecked(&mut self, mid: usize) -> (&mut [T], &mut [T]) {
1687         let len = self.len();
1688         let ptr = self.as_mut_ptr();
1689
1690         // SAFETY: Caller has to check that `0 <= mid <= self.len()`.
1691         //
1692         // `[ptr; mid]` and `[mid; len]` are not overlapping, so returning a mutable reference
1693         // is fine.
1694         unsafe {
1695             assert_unsafe_precondition!((mid: usize, len: usize) => mid <= len);
1696             (from_raw_parts_mut(ptr, mid), from_raw_parts_mut(ptr.add(mid), len - mid))
1697         }
1698     }
1699
1700     /// Divides one slice into an array and a remainder slice at an index.
1701     ///
1702     /// The array will contain all indices from `[0, N)` (excluding
1703     /// the index `N` itself) and the slice will contain all
1704     /// indices from `[N, len)` (excluding the index `len` itself).
1705     ///
1706     /// # Panics
1707     ///
1708     /// Panics if `N > len`.
1709     ///
1710     /// # Examples
1711     ///
1712     /// ```
1713     /// #![feature(split_array)]
1714     ///
1715     /// let v = &[1, 2, 3, 4, 5, 6][..];
1716     ///
1717     /// {
1718     ///    let (left, right) = v.split_array_ref::<0>();
1719     ///    assert_eq!(left, &[]);
1720     ///    assert_eq!(right, [1, 2, 3, 4, 5, 6]);
1721     /// }
1722     ///
1723     /// {
1724     ///     let (left, right) = v.split_array_ref::<2>();
1725     ///     assert_eq!(left, &[1, 2]);
1726     ///     assert_eq!(right, [3, 4, 5, 6]);
1727     /// }
1728     ///
1729     /// {
1730     ///     let (left, right) = v.split_array_ref::<6>();
1731     ///     assert_eq!(left, &[1, 2, 3, 4, 5, 6]);
1732     ///     assert_eq!(right, []);
1733     /// }
1734     /// ```
1735     #[unstable(feature = "split_array", reason = "new API", issue = "90091")]
1736     #[inline]
1737     #[track_caller]
1738     #[must_use]
1739     pub fn split_array_ref<const N: usize>(&self) -> (&[T; N], &[T]) {
1740         let (a, b) = self.split_at(N);
1741         // SAFETY: a points to [T; N]? Yes it's [T] of length N (checked by split_at)
1742         unsafe { (&*(a.as_ptr() as *const [T; N]), b) }
1743     }
1744
1745     /// Divides one mutable slice into an array and a remainder slice at an index.
1746     ///
1747     /// The array will contain all indices from `[0, N)` (excluding
1748     /// the index `N` itself) and the slice will contain all
1749     /// indices from `[N, len)` (excluding the index `len` itself).
1750     ///
1751     /// # Panics
1752     ///
1753     /// Panics if `N > len`.
1754     ///
1755     /// # Examples
1756     ///
1757     /// ```
1758     /// #![feature(split_array)]
1759     ///
1760     /// let mut v = &mut [1, 0, 3, 0, 5, 6][..];
1761     /// let (left, right) = v.split_array_mut::<2>();
1762     /// assert_eq!(left, &mut [1, 0]);
1763     /// assert_eq!(right, [3, 0, 5, 6]);
1764     /// left[1] = 2;
1765     /// right[1] = 4;
1766     /// assert_eq!(v, [1, 2, 3, 4, 5, 6]);
1767     /// ```
1768     #[unstable(feature = "split_array", reason = "new API", issue = "90091")]
1769     #[inline]
1770     #[track_caller]
1771     #[must_use]
1772     pub fn split_array_mut<const N: usize>(&mut self) -> (&mut [T; N], &mut [T]) {
1773         let (a, b) = self.split_at_mut(N);
1774         // SAFETY: a points to [T; N]? Yes it's [T] of length N (checked by split_at_mut)
1775         unsafe { (&mut *(a.as_mut_ptr() as *mut [T; N]), b) }
1776     }
1777
1778     /// Divides one slice into an array and a remainder slice at an index from
1779     /// the end.
1780     ///
1781     /// The slice will contain all indices from `[0, len - N)` (excluding
1782     /// the index `len - N` itself) and the array will contain all
1783     /// indices from `[len - N, len)` (excluding the index `len` itself).
1784     ///
1785     /// # Panics
1786     ///
1787     /// Panics if `N > len`.
1788     ///
1789     /// # Examples
1790     ///
1791     /// ```
1792     /// #![feature(split_array)]
1793     ///
1794     /// let v = &[1, 2, 3, 4, 5, 6][..];
1795     ///
1796     /// {
1797     ///    let (left, right) = v.rsplit_array_ref::<0>();
1798     ///    assert_eq!(left, [1, 2, 3, 4, 5, 6]);
1799     ///    assert_eq!(right, &[]);
1800     /// }
1801     ///
1802     /// {
1803     ///     let (left, right) = v.rsplit_array_ref::<2>();
1804     ///     assert_eq!(left, [1, 2, 3, 4]);
1805     ///     assert_eq!(right, &[5, 6]);
1806     /// }
1807     ///
1808     /// {
1809     ///     let (left, right) = v.rsplit_array_ref::<6>();
1810     ///     assert_eq!(left, []);
1811     ///     assert_eq!(right, &[1, 2, 3, 4, 5, 6]);
1812     /// }
1813     /// ```
1814     #[unstable(feature = "split_array", reason = "new API", issue = "90091")]
1815     #[inline]
1816     #[must_use]
1817     pub fn rsplit_array_ref<const N: usize>(&self) -> (&[T], &[T; N]) {
1818         assert!(N <= self.len());
1819         let (a, b) = self.split_at(self.len() - N);
1820         // SAFETY: b points to [T; N]? Yes it's [T] of length N (checked by split_at)
1821         unsafe { (a, &*(b.as_ptr() as *const [T; N])) }
1822     }
1823
1824     /// Divides one mutable slice into an array and a remainder slice at an
1825     /// index from the end.
1826     ///
1827     /// The slice will contain all indices from `[0, len - N)` (excluding
1828     /// the index `N` itself) and the array will contain all
1829     /// indices from `[len - N, len)` (excluding the index `len` itself).
1830     ///
1831     /// # Panics
1832     ///
1833     /// Panics if `N > len`.
1834     ///
1835     /// # Examples
1836     ///
1837     /// ```
1838     /// #![feature(split_array)]
1839     ///
1840     /// let mut v = &mut [1, 0, 3, 0, 5, 6][..];
1841     /// let (left, right) = v.rsplit_array_mut::<4>();
1842     /// assert_eq!(left, [1, 0]);
1843     /// assert_eq!(right, &mut [3, 0, 5, 6]);
1844     /// left[1] = 2;
1845     /// right[1] = 4;
1846     /// assert_eq!(v, [1, 2, 3, 4, 5, 6]);
1847     /// ```
1848     #[unstable(feature = "split_array", reason = "new API", issue = "90091")]
1849     #[inline]
1850     #[must_use]
1851     pub fn rsplit_array_mut<const N: usize>(&mut self) -> (&mut [T], &mut [T; N]) {
1852         assert!(N <= self.len());
1853         let (a, b) = self.split_at_mut(self.len() - N);
1854         // SAFETY: b points to [T; N]? Yes it's [T] of length N (checked by split_at_mut)
1855         unsafe { (a, &mut *(b.as_mut_ptr() as *mut [T; N])) }
1856     }
1857
1858     /// Returns an iterator over subslices separated by elements that match
1859     /// `pred`. The matched element is not contained in the subslices.
1860     ///
1861     /// # Examples
1862     ///
1863     /// ```
1864     /// let slice = [10, 40, 33, 20];
1865     /// let mut iter = slice.split(|num| num % 3 == 0);
1866     ///
1867     /// assert_eq!(iter.next().unwrap(), &[10, 40]);
1868     /// assert_eq!(iter.next().unwrap(), &[20]);
1869     /// assert!(iter.next().is_none());
1870     /// ```
1871     ///
1872     /// If the first element is matched, an empty slice will be the first item
1873     /// returned by the iterator. Similarly, if the last element in the slice
1874     /// is matched, an empty slice will be the last item returned by the
1875     /// iterator:
1876     ///
1877     /// ```
1878     /// let slice = [10, 40, 33];
1879     /// let mut iter = slice.split(|num| num % 3 == 0);
1880     ///
1881     /// assert_eq!(iter.next().unwrap(), &[10, 40]);
1882     /// assert_eq!(iter.next().unwrap(), &[]);
1883     /// assert!(iter.next().is_none());
1884     /// ```
1885     ///
1886     /// If two matched elements are directly adjacent, an empty slice will be
1887     /// present between them:
1888     ///
1889     /// ```
1890     /// let slice = [10, 6, 33, 20];
1891     /// let mut iter = slice.split(|num| num % 3 == 0);
1892     ///
1893     /// assert_eq!(iter.next().unwrap(), &[10]);
1894     /// assert_eq!(iter.next().unwrap(), &[]);
1895     /// assert_eq!(iter.next().unwrap(), &[20]);
1896     /// assert!(iter.next().is_none());
1897     /// ```
1898     #[stable(feature = "rust1", since = "1.0.0")]
1899     #[inline]
1900     pub fn split<F>(&self, pred: F) -> Split<'_, T, F>
1901     where
1902         F: FnMut(&T) -> bool,
1903     {
1904         Split::new(self, pred)
1905     }
1906
1907     /// Returns an iterator over mutable subslices separated by elements that
1908     /// match `pred`. The matched element is not contained in the subslices.
1909     ///
1910     /// # Examples
1911     ///
1912     /// ```
1913     /// let mut v = [10, 40, 30, 20, 60, 50];
1914     ///
1915     /// for group in v.split_mut(|num| *num % 3 == 0) {
1916     ///     group[0] = 1;
1917     /// }
1918     /// assert_eq!(v, [1, 40, 30, 1, 60, 1]);
1919     /// ```
1920     #[stable(feature = "rust1", since = "1.0.0")]
1921     #[inline]
1922     pub fn split_mut<F>(&mut self, pred: F) -> SplitMut<'_, T, F>
1923     where
1924         F: FnMut(&T) -> bool,
1925     {
1926         SplitMut::new(self, pred)
1927     }
1928
1929     /// Returns an iterator over subslices separated by elements that match
1930     /// `pred`. The matched element is contained in the end of the previous
1931     /// subslice as a terminator.
1932     ///
1933     /// # Examples
1934     ///
1935     /// ```
1936     /// let slice = [10, 40, 33, 20];
1937     /// let mut iter = slice.split_inclusive(|num| num % 3 == 0);
1938     ///
1939     /// assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
1940     /// assert_eq!(iter.next().unwrap(), &[20]);
1941     /// assert!(iter.next().is_none());
1942     /// ```
1943     ///
1944     /// If the last element of the slice is matched,
1945     /// that element will be considered the terminator of the preceding slice.
1946     /// That slice will be the last item returned by the iterator.
1947     ///
1948     /// ```
1949     /// let slice = [3, 10, 40, 33];
1950     /// let mut iter = slice.split_inclusive(|num| num % 3 == 0);
1951     ///
1952     /// assert_eq!(iter.next().unwrap(), &[3]);
1953     /// assert_eq!(iter.next().unwrap(), &[10, 40, 33]);
1954     /// assert!(iter.next().is_none());
1955     /// ```
1956     #[stable(feature = "split_inclusive", since = "1.51.0")]
1957     #[inline]
1958     pub fn split_inclusive<F>(&self, pred: F) -> SplitInclusive<'_, T, F>
1959     where
1960         F: FnMut(&T) -> bool,
1961     {
1962         SplitInclusive::new(self, pred)
1963     }
1964
1965     /// Returns an iterator over mutable subslices separated by elements that
1966     /// match `pred`. The matched element is contained in the previous
1967     /// subslice as a terminator.
1968     ///
1969     /// # Examples
1970     ///
1971     /// ```
1972     /// let mut v = [10, 40, 30, 20, 60, 50];
1973     ///
1974     /// for group in v.split_inclusive_mut(|num| *num % 3 == 0) {
1975     ///     let terminator_idx = group.len()-1;
1976     ///     group[terminator_idx] = 1;
1977     /// }
1978     /// assert_eq!(v, [10, 40, 1, 20, 1, 1]);
1979     /// ```
1980     #[stable(feature = "split_inclusive", since = "1.51.0")]
1981     #[inline]
1982     pub fn split_inclusive_mut<F>(&mut self, pred: F) -> SplitInclusiveMut<'_, T, F>
1983     where
1984         F: FnMut(&T) -> bool,
1985     {
1986         SplitInclusiveMut::new(self, pred)
1987     }
1988
1989     /// Returns an iterator over subslices separated by elements that match
1990     /// `pred`, starting at the end of the slice and working backwards.
1991     /// The matched element is not contained in the subslices.
1992     ///
1993     /// # Examples
1994     ///
1995     /// ```
1996     /// let slice = [11, 22, 33, 0, 44, 55];
1997     /// let mut iter = slice.rsplit(|num| *num == 0);
1998     ///
1999     /// assert_eq!(iter.next().unwrap(), &[44, 55]);
2000     /// assert_eq!(iter.next().unwrap(), &[11, 22, 33]);
2001     /// assert_eq!(iter.next(), None);
2002     /// ```
2003     ///
2004     /// As with `split()`, if the first or last element is matched, an empty
2005     /// slice will be the first (or last) item returned by the iterator.
2006     ///
2007     /// ```
2008     /// let v = &[0, 1, 1, 2, 3, 5, 8];
2009     /// let mut it = v.rsplit(|n| *n % 2 == 0);
2010     /// assert_eq!(it.next().unwrap(), &[]);
2011     /// assert_eq!(it.next().unwrap(), &[3, 5]);
2012     /// assert_eq!(it.next().unwrap(), &[1, 1]);
2013     /// assert_eq!(it.next().unwrap(), &[]);
2014     /// assert_eq!(it.next(), None);
2015     /// ```
2016     #[stable(feature = "slice_rsplit", since = "1.27.0")]
2017     #[inline]
2018     pub fn rsplit<F>(&self, pred: F) -> RSplit<'_, T, F>
2019     where
2020         F: FnMut(&T) -> bool,
2021     {
2022         RSplit::new(self, pred)
2023     }
2024
2025     /// Returns an iterator over mutable subslices separated by elements that
2026     /// match `pred`, starting at the end of the slice and working
2027     /// backwards. The matched element is not contained in the subslices.
2028     ///
2029     /// # Examples
2030     ///
2031     /// ```
2032     /// let mut v = [100, 400, 300, 200, 600, 500];
2033     ///
2034     /// let mut count = 0;
2035     /// for group in v.rsplit_mut(|num| *num % 3 == 0) {
2036     ///     count += 1;
2037     ///     group[0] = count;
2038     /// }
2039     /// assert_eq!(v, [3, 400, 300, 2, 600, 1]);
2040     /// ```
2041     ///
2042     #[stable(feature = "slice_rsplit", since = "1.27.0")]
2043     #[inline]
2044     pub fn rsplit_mut<F>(&mut self, pred: F) -> RSplitMut<'_, T, F>
2045     where
2046         F: FnMut(&T) -> bool,
2047     {
2048         RSplitMut::new(self, pred)
2049     }
2050
2051     /// Returns an iterator over subslices separated by elements that match
2052     /// `pred`, limited to returning at most `n` items. The matched element is
2053     /// not contained in the subslices.
2054     ///
2055     /// The last element returned, if any, will contain the remainder of the
2056     /// slice.
2057     ///
2058     /// # Examples
2059     ///
2060     /// Print the slice split once by numbers divisible by 3 (i.e., `[10, 40]`,
2061     /// `[20, 60, 50]`):
2062     ///
2063     /// ```
2064     /// let v = [10, 40, 30, 20, 60, 50];
2065     ///
2066     /// for group in v.splitn(2, |num| *num % 3 == 0) {
2067     ///     println!("{group:?}");
2068     /// }
2069     /// ```
2070     #[stable(feature = "rust1", since = "1.0.0")]
2071     #[inline]
2072     pub fn splitn<F>(&self, n: usize, pred: F) -> SplitN<'_, T, F>
2073     where
2074         F: FnMut(&T) -> bool,
2075     {
2076         SplitN::new(self.split(pred), n)
2077     }
2078
2079     /// Returns an iterator over mutable subslices separated by elements that match
2080     /// `pred`, limited to returning at most `n` items. The matched element is
2081     /// not contained in the subslices.
2082     ///
2083     /// The last element returned, if any, will contain the remainder of the
2084     /// slice.
2085     ///
2086     /// # Examples
2087     ///
2088     /// ```
2089     /// let mut v = [10, 40, 30, 20, 60, 50];
2090     ///
2091     /// for group in v.splitn_mut(2, |num| *num % 3 == 0) {
2092     ///     group[0] = 1;
2093     /// }
2094     /// assert_eq!(v, [1, 40, 30, 1, 60, 50]);
2095     /// ```
2096     #[stable(feature = "rust1", since = "1.0.0")]
2097     #[inline]
2098     pub fn splitn_mut<F>(&mut self, n: usize, pred: F) -> SplitNMut<'_, T, F>
2099     where
2100         F: FnMut(&T) -> bool,
2101     {
2102         SplitNMut::new(self.split_mut(pred), n)
2103     }
2104
2105     /// Returns an iterator over subslices separated by elements that match
2106     /// `pred` limited to returning at most `n` items. This starts at the end of
2107     /// the slice and works backwards. The matched element is not contained in
2108     /// the subslices.
2109     ///
2110     /// The last element returned, if any, will contain the remainder of the
2111     /// slice.
2112     ///
2113     /// # Examples
2114     ///
2115     /// Print the slice split once, starting from the end, by numbers divisible
2116     /// by 3 (i.e., `[50]`, `[10, 40, 30, 20]`):
2117     ///
2118     /// ```
2119     /// let v = [10, 40, 30, 20, 60, 50];
2120     ///
2121     /// for group in v.rsplitn(2, |num| *num % 3 == 0) {
2122     ///     println!("{group:?}");
2123     /// }
2124     /// ```
2125     #[stable(feature = "rust1", since = "1.0.0")]
2126     #[inline]
2127     pub fn rsplitn<F>(&self, n: usize, pred: F) -> RSplitN<'_, T, F>
2128     where
2129         F: FnMut(&T) -> bool,
2130     {
2131         RSplitN::new(self.rsplit(pred), n)
2132     }
2133
2134     /// Returns an iterator over subslices separated by elements that match
2135     /// `pred` limited to returning at most `n` items. This starts at the end of
2136     /// the slice and works backwards. The matched element is not contained in
2137     /// the subslices.
2138     ///
2139     /// The last element returned, if any, will contain the remainder of the
2140     /// slice.
2141     ///
2142     /// # Examples
2143     ///
2144     /// ```
2145     /// let mut s = [10, 40, 30, 20, 60, 50];
2146     ///
2147     /// for group in s.rsplitn_mut(2, |num| *num % 3 == 0) {
2148     ///     group[0] = 1;
2149     /// }
2150     /// assert_eq!(s, [1, 40, 30, 20, 60, 1]);
2151     /// ```
2152     #[stable(feature = "rust1", since = "1.0.0")]
2153     #[inline]
2154     pub fn rsplitn_mut<F>(&mut self, n: usize, pred: F) -> RSplitNMut<'_, T, F>
2155     where
2156         F: FnMut(&T) -> bool,
2157     {
2158         RSplitNMut::new(self.rsplit_mut(pred), n)
2159     }
2160
2161     /// Returns `true` if the slice contains an element with the given value.
2162     ///
2163     /// This operation is *O*(*n*).
2164     ///
2165     /// Note that if you have a sorted slice, [`binary_search`] may be faster.
2166     ///
2167     /// [`binary_search`]: slice::binary_search
2168     ///
2169     /// # Examples
2170     ///
2171     /// ```
2172     /// let v = [10, 40, 30];
2173     /// assert!(v.contains(&30));
2174     /// assert!(!v.contains(&50));
2175     /// ```
2176     ///
2177     /// If you do not have a `&T`, but some other value that you can compare
2178     /// with one (for example, `String` implements `PartialEq<str>`), you can
2179     /// use `iter().any`:
2180     ///
2181     /// ```
2182     /// let v = [String::from("hello"), String::from("world")]; // slice of `String`
2183     /// assert!(v.iter().any(|e| e == "hello")); // search with `&str`
2184     /// assert!(!v.iter().any(|e| e == "hi"));
2185     /// ```
2186     #[stable(feature = "rust1", since = "1.0.0")]
2187     #[inline]
2188     #[must_use]
2189     pub fn contains(&self, x: &T) -> bool
2190     where
2191         T: PartialEq,
2192     {
2193         cmp::SliceContains::slice_contains(x, self)
2194     }
2195
2196     /// Returns `true` if `needle` is a prefix of the slice.
2197     ///
2198     /// # Examples
2199     ///
2200     /// ```
2201     /// let v = [10, 40, 30];
2202     /// assert!(v.starts_with(&[10]));
2203     /// assert!(v.starts_with(&[10, 40]));
2204     /// assert!(!v.starts_with(&[50]));
2205     /// assert!(!v.starts_with(&[10, 50]));
2206     /// ```
2207     ///
2208     /// Always returns `true` if `needle` is an empty slice:
2209     ///
2210     /// ```
2211     /// let v = &[10, 40, 30];
2212     /// assert!(v.starts_with(&[]));
2213     /// let v: &[u8] = &[];
2214     /// assert!(v.starts_with(&[]));
2215     /// ```
2216     #[stable(feature = "rust1", since = "1.0.0")]
2217     #[must_use]
2218     pub fn starts_with(&self, needle: &[T]) -> bool
2219     where
2220         T: PartialEq,
2221     {
2222         let n = needle.len();
2223         self.len() >= n && needle == &self[..n]
2224     }
2225
2226     /// Returns `true` if `needle` is a suffix of the slice.
2227     ///
2228     /// # Examples
2229     ///
2230     /// ```
2231     /// let v = [10, 40, 30];
2232     /// assert!(v.ends_with(&[30]));
2233     /// assert!(v.ends_with(&[40, 30]));
2234     /// assert!(!v.ends_with(&[50]));
2235     /// assert!(!v.ends_with(&[50, 30]));
2236     /// ```
2237     ///
2238     /// Always returns `true` if `needle` is an empty slice:
2239     ///
2240     /// ```
2241     /// let v = &[10, 40, 30];
2242     /// assert!(v.ends_with(&[]));
2243     /// let v: &[u8] = &[];
2244     /// assert!(v.ends_with(&[]));
2245     /// ```
2246     #[stable(feature = "rust1", since = "1.0.0")]
2247     #[must_use]
2248     pub fn ends_with(&self, needle: &[T]) -> bool
2249     where
2250         T: PartialEq,
2251     {
2252         let (m, n) = (self.len(), needle.len());
2253         m >= n && needle == &self[m - n..]
2254     }
2255
2256     /// Returns a subslice with the prefix removed.
2257     ///
2258     /// If the slice starts with `prefix`, returns the subslice after the prefix, wrapped in `Some`.
2259     /// If `prefix` is empty, simply returns the original slice.
2260     ///
2261     /// If the slice does not start with `prefix`, returns `None`.
2262     ///
2263     /// # Examples
2264     ///
2265     /// ```
2266     /// let v = &[10, 40, 30];
2267     /// assert_eq!(v.strip_prefix(&[10]), Some(&[40, 30][..]));
2268     /// assert_eq!(v.strip_prefix(&[10, 40]), Some(&[30][..]));
2269     /// assert_eq!(v.strip_prefix(&[50]), None);
2270     /// assert_eq!(v.strip_prefix(&[10, 50]), None);
2271     ///
2272     /// let prefix : &str = "he";
2273     /// assert_eq!(b"hello".strip_prefix(prefix.as_bytes()),
2274     ///            Some(b"llo".as_ref()));
2275     /// ```
2276     #[must_use = "returns the subslice without modifying the original"]
2277     #[stable(feature = "slice_strip", since = "1.51.0")]
2278     pub fn strip_prefix<P: SlicePattern<Item = T> + ?Sized>(&self, prefix: &P) -> Option<&[T]>
2279     where
2280         T: PartialEq,
2281     {
2282         // This function will need rewriting if and when SlicePattern becomes more sophisticated.
2283         let prefix = prefix.as_slice();
2284         let n = prefix.len();
2285         if n <= self.len() {
2286             let (head, tail) = self.split_at(n);
2287             if head == prefix {
2288                 return Some(tail);
2289             }
2290         }
2291         None
2292     }
2293
2294     /// Returns a subslice with the suffix removed.
2295     ///
2296     /// If the slice ends with `suffix`, returns the subslice before the suffix, wrapped in `Some`.
2297     /// If `suffix` is empty, simply returns the original slice.
2298     ///
2299     /// If the slice does not end with `suffix`, returns `None`.
2300     ///
2301     /// # Examples
2302     ///
2303     /// ```
2304     /// let v = &[10, 40, 30];
2305     /// assert_eq!(v.strip_suffix(&[30]), Some(&[10, 40][..]));
2306     /// assert_eq!(v.strip_suffix(&[40, 30]), Some(&[10][..]));
2307     /// assert_eq!(v.strip_suffix(&[50]), None);
2308     /// assert_eq!(v.strip_suffix(&[50, 30]), None);
2309     /// ```
2310     #[must_use = "returns the subslice without modifying the original"]
2311     #[stable(feature = "slice_strip", since = "1.51.0")]
2312     pub fn strip_suffix<P: SlicePattern<Item = T> + ?Sized>(&self, suffix: &P) -> Option<&[T]>
2313     where
2314         T: PartialEq,
2315     {
2316         // This function will need rewriting if and when SlicePattern becomes more sophisticated.
2317         let suffix = suffix.as_slice();
2318         let (len, n) = (self.len(), suffix.len());
2319         if n <= len {
2320             let (head, tail) = self.split_at(len - n);
2321             if tail == suffix {
2322                 return Some(head);
2323             }
2324         }
2325         None
2326     }
2327
2328     /// Binary searches this slice for a given element.
2329     /// This behaves similarly to [`contains`] if this slice is sorted.
2330     ///
2331     /// If the value is found then [`Result::Ok`] is returned, containing the
2332     /// index of the matching element. If there are multiple matches, then any
2333     /// one of the matches could be returned. The index is chosen
2334     /// deterministically, but is subject to change in future versions of Rust.
2335     /// If the value is not found then [`Result::Err`] is returned, containing
2336     /// the index where a matching element could be inserted while maintaining
2337     /// sorted order.
2338     ///
2339     /// See also [`binary_search_by`], [`binary_search_by_key`], and [`partition_point`].
2340     ///
2341     /// [`contains`]: slice::contains
2342     /// [`binary_search_by`]: slice::binary_search_by
2343     /// [`binary_search_by_key`]: slice::binary_search_by_key
2344     /// [`partition_point`]: slice::partition_point
2345     ///
2346     /// # Examples
2347     ///
2348     /// Looks up a series of four elements. The first is found, with a
2349     /// uniquely determined position; the second and third are not
2350     /// found; the fourth could match any position in `[1, 4]`.
2351     ///
2352     /// ```
2353     /// let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
2354     ///
2355     /// assert_eq!(s.binary_search(&13),  Ok(9));
2356     /// assert_eq!(s.binary_search(&4),   Err(7));
2357     /// assert_eq!(s.binary_search(&100), Err(13));
2358     /// let r = s.binary_search(&1);
2359     /// assert!(match r { Ok(1..=4) => true, _ => false, });
2360     /// ```
2361     ///
2362     /// If you want to find that whole *range* of matching items, rather than
2363     /// an arbitrary matching one, that can be done using [`partition_point`]:
2364     /// ```
2365     /// let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
2366     ///
2367     /// let low = s.partition_point(|x| x < &1);
2368     /// assert_eq!(low, 1);
2369     /// let high = s.partition_point(|x| x <= &1);
2370     /// assert_eq!(high, 5);
2371     /// let r = s.binary_search(&1);
2372     /// assert!((low..high).contains(&r.unwrap()));
2373     ///
2374     /// assert!(s[..low].iter().all(|&x| x < 1));
2375     /// assert!(s[low..high].iter().all(|&x| x == 1));
2376     /// assert!(s[high..].iter().all(|&x| x > 1));
2377     ///
2378     /// // For something not found, the "range" of equal items is empty
2379     /// assert_eq!(s.partition_point(|x| x < &11), 9);
2380     /// assert_eq!(s.partition_point(|x| x <= &11), 9);
2381     /// assert_eq!(s.binary_search(&11), Err(9));
2382     /// ```
2383     ///
2384     /// If you want to insert an item to a sorted vector, while maintaining
2385     /// sort order, consider using [`partition_point`]:
2386     ///
2387     /// ```
2388     /// let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
2389     /// let num = 42;
2390     /// let idx = s.partition_point(|&x| x < num);
2391     /// // The above is equivalent to `let idx = s.binary_search(&num).unwrap_or_else(|x| x);`
2392     /// s.insert(idx, num);
2393     /// assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
2394     /// ```
2395     #[stable(feature = "rust1", since = "1.0.0")]
2396     pub fn binary_search(&self, x: &T) -> Result<usize, usize>
2397     where
2398         T: Ord,
2399     {
2400         self.binary_search_by(|p| p.cmp(x))
2401     }
2402
2403     /// Binary searches this slice with a comparator function.
2404     /// This behaves similarly to [`contains`] if this slice is sorted.
2405     ///
2406     /// The comparator function should implement an order consistent
2407     /// with the sort order of the underlying slice, returning an
2408     /// order code that indicates whether its argument is `Less`,
2409     /// `Equal` or `Greater` the desired target.
2410     ///
2411     /// If the value is found then [`Result::Ok`] is returned, containing the
2412     /// index of the matching element. If there are multiple matches, then any
2413     /// one of the matches could be returned. The index is chosen
2414     /// deterministically, but is subject to change in future versions of Rust.
2415     /// If the value is not found then [`Result::Err`] is returned, containing
2416     /// the index where a matching element could be inserted while maintaining
2417     /// sorted order.
2418     ///
2419     /// See also [`binary_search`], [`binary_search_by_key`], and [`partition_point`].
2420     ///
2421     /// [`contains`]: slice::contains
2422     /// [`binary_search`]: slice::binary_search
2423     /// [`binary_search_by_key`]: slice::binary_search_by_key
2424     /// [`partition_point`]: slice::partition_point
2425     ///
2426     /// # Examples
2427     ///
2428     /// Looks up a series of four elements. The first is found, with a
2429     /// uniquely determined position; the second and third are not
2430     /// found; the fourth could match any position in `[1, 4]`.
2431     ///
2432     /// ```
2433     /// let s = [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
2434     ///
2435     /// let seek = 13;
2436     /// assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Ok(9));
2437     /// let seek = 4;
2438     /// assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(7));
2439     /// let seek = 100;
2440     /// assert_eq!(s.binary_search_by(|probe| probe.cmp(&seek)), Err(13));
2441     /// let seek = 1;
2442     /// let r = s.binary_search_by(|probe| probe.cmp(&seek));
2443     /// assert!(match r { Ok(1..=4) => true, _ => false, });
2444     /// ```
2445     #[stable(feature = "rust1", since = "1.0.0")]
2446     #[inline]
2447     pub fn binary_search_by<'a, F>(&'a self, mut f: F) -> Result<usize, usize>
2448     where
2449         F: FnMut(&'a T) -> Ordering,
2450     {
2451         // INVARIANTS:
2452         // - 0 <= left <= left + size = right <= self.len()
2453         // - f returns Less for everything in self[..left]
2454         // - f returns Greater for everything in self[right..]
2455         let mut size = self.len();
2456         let mut left = 0;
2457         let mut right = size;
2458         while left < right {
2459             let mid = left + size / 2;
2460
2461             // SAFETY: the while condition means `size` is strictly positive, so
2462             // `size/2 < size`.  Thus `left + size/2 < left + size`, which
2463             // coupled with the `left + size <= self.len()` invariant means
2464             // we have `left + size/2 < self.len()`, and this is in-bounds.
2465             let cmp = f(unsafe { self.get_unchecked(mid) });
2466
2467             // The reason why we use if/else control flow rather than match
2468             // is because match reorders comparison operations, which is perf sensitive.
2469             // This is x86 asm for u8: https://rust.godbolt.org/z/8Y8Pra.
2470             if cmp == Less {
2471                 left = mid + 1;
2472             } else if cmp == Greater {
2473                 right = mid;
2474             } else {
2475                 // SAFETY: same as the `get_unchecked` above
2476                 unsafe { crate::intrinsics::assume(mid < self.len()) };
2477                 return Ok(mid);
2478             }
2479
2480             size = right - left;
2481         }
2482
2483         // SAFETY: directly true from the overall invariant.
2484         // Note that this is `<=`, unlike the assume in the `Ok` path.
2485         unsafe { crate::intrinsics::assume(left <= self.len()) };
2486         Err(left)
2487     }
2488
2489     /// Binary searches this slice with a key extraction function.
2490     /// This behaves similarly to [`contains`] if this slice is sorted.
2491     ///
2492     /// Assumes that the slice is sorted by the key, for instance with
2493     /// [`sort_by_key`] using the same key extraction function.
2494     ///
2495     /// If the value is found then [`Result::Ok`] is returned, containing the
2496     /// index of the matching element. If there are multiple matches, then any
2497     /// one of the matches could be returned. The index is chosen
2498     /// deterministically, but is subject to change in future versions of Rust.
2499     /// If the value is not found then [`Result::Err`] is returned, containing
2500     /// the index where a matching element could be inserted while maintaining
2501     /// sorted order.
2502     ///
2503     /// See also [`binary_search`], [`binary_search_by`], and [`partition_point`].
2504     ///
2505     /// [`contains`]: slice::contains
2506     /// [`sort_by_key`]: slice::sort_by_key
2507     /// [`binary_search`]: slice::binary_search
2508     /// [`binary_search_by`]: slice::binary_search_by
2509     /// [`partition_point`]: slice::partition_point
2510     ///
2511     /// # Examples
2512     ///
2513     /// Looks up a series of four elements in a slice of pairs sorted by
2514     /// their second elements. The first is found, with a uniquely
2515     /// determined position; the second and third are not found; the
2516     /// fourth could match any position in `[1, 4]`.
2517     ///
2518     /// ```
2519     /// let s = [(0, 0), (2, 1), (4, 1), (5, 1), (3, 1),
2520     ///          (1, 2), (2, 3), (4, 5), (5, 8), (3, 13),
2521     ///          (1, 21), (2, 34), (4, 55)];
2522     ///
2523     /// assert_eq!(s.binary_search_by_key(&13, |&(a, b)| b),  Ok(9));
2524     /// assert_eq!(s.binary_search_by_key(&4, |&(a, b)| b),   Err(7));
2525     /// assert_eq!(s.binary_search_by_key(&100, |&(a, b)| b), Err(13));
2526     /// let r = s.binary_search_by_key(&1, |&(a, b)| b);
2527     /// assert!(match r { Ok(1..=4) => true, _ => false, });
2528     /// ```
2529     // Lint rustdoc::broken_intra_doc_links is allowed as `slice::sort_by_key` is
2530     // in crate `alloc`, and as such doesn't exists yet when building `core`: #74481.
2531     // This breaks links when slice is displayed in core, but changing it to use relative links
2532     // would break when the item is re-exported. So allow the core links to be broken for now.
2533     #[allow(rustdoc::broken_intra_doc_links)]
2534     #[stable(feature = "slice_binary_search_by_key", since = "1.10.0")]
2535     #[inline]
2536     pub fn binary_search_by_key<'a, B, F>(&'a self, b: &B, mut f: F) -> Result<usize, usize>
2537     where
2538         F: FnMut(&'a T) -> B,
2539         B: Ord,
2540     {
2541         self.binary_search_by(|k| f(k).cmp(b))
2542     }
2543
2544     /// Sorts the slice, but might not preserve the order of equal elements.
2545     ///
2546     /// This sort is unstable (i.e., may reorder equal elements), in-place
2547     /// (i.e., does not allocate), and *O*(*n* \* log(*n*)) worst-case.
2548     ///
2549     /// # Current implementation
2550     ///
2551     /// The current algorithm is based on [pattern-defeating quicksort][pdqsort] by Orson Peters,
2552     /// which combines the fast average case of randomized quicksort with the fast worst case of
2553     /// heapsort, while achieving linear time on slices with certain patterns. It uses some
2554     /// randomization to avoid degenerate cases, but with a fixed seed to always provide
2555     /// deterministic behavior.
2556     ///
2557     /// It is typically faster than stable sorting, except in a few special cases, e.g., when the
2558     /// slice consists of several concatenated sorted sequences.
2559     ///
2560     /// # Examples
2561     ///
2562     /// ```
2563     /// let mut v = [-5, 4, 1, -3, 2];
2564     ///
2565     /// v.sort_unstable();
2566     /// assert!(v == [-5, -3, 1, 2, 4]);
2567     /// ```
2568     ///
2569     /// [pdqsort]: https://github.com/orlp/pdqsort
2570     #[stable(feature = "sort_unstable", since = "1.20.0")]
2571     #[inline]
2572     pub fn sort_unstable(&mut self)
2573     where
2574         T: Ord,
2575     {
2576         sort::quicksort(self, T::lt);
2577     }
2578
2579     /// Sorts the slice with a comparator function, but might not preserve the order of equal
2580     /// elements.
2581     ///
2582     /// This sort is unstable (i.e., may reorder equal elements), in-place
2583     /// (i.e., does not allocate), and *O*(*n* \* log(*n*)) worst-case.
2584     ///
2585     /// The comparator function must define a total ordering for the elements in the slice. If
2586     /// the ordering is not total, the order of the elements is unspecified. An order is a
2587     /// total order if it is (for all `a`, `b` and `c`):
2588     ///
2589     /// * total and antisymmetric: exactly one of `a < b`, `a == b` or `a > b` is true, and
2590     /// * transitive, `a < b` and `b < c` implies `a < c`. The same must hold for both `==` and `>`.
2591     ///
2592     /// For example, while [`f64`] doesn't implement [`Ord`] because `NaN != NaN`, we can use
2593     /// `partial_cmp` as our sort function when we know the slice doesn't contain a `NaN`.
2594     ///
2595     /// ```
2596     /// let mut floats = [5f64, 4.0, 1.0, 3.0, 2.0];
2597     /// floats.sort_unstable_by(|a, b| a.partial_cmp(b).unwrap());
2598     /// assert_eq!(floats, [1.0, 2.0, 3.0, 4.0, 5.0]);
2599     /// ```
2600     ///
2601     /// # Current implementation
2602     ///
2603     /// The current algorithm is based on [pattern-defeating quicksort][pdqsort] by Orson Peters,
2604     /// which combines the fast average case of randomized quicksort with the fast worst case of
2605     /// heapsort, while achieving linear time on slices with certain patterns. It uses some
2606     /// randomization to avoid degenerate cases, but with a fixed seed to always provide
2607     /// deterministic behavior.
2608     ///
2609     /// It is typically faster than stable sorting, except in a few special cases, e.g., when the
2610     /// slice consists of several concatenated sorted sequences.
2611     ///
2612     /// # Examples
2613     ///
2614     /// ```
2615     /// let mut v = [5, 4, 1, 3, 2];
2616     /// v.sort_unstable_by(|a, b| a.cmp(b));
2617     /// assert!(v == [1, 2, 3, 4, 5]);
2618     ///
2619     /// // reverse sorting
2620     /// v.sort_unstable_by(|a, b| b.cmp(a));
2621     /// assert!(v == [5, 4, 3, 2, 1]);
2622     /// ```
2623     ///
2624     /// [pdqsort]: https://github.com/orlp/pdqsort
2625     #[stable(feature = "sort_unstable", since = "1.20.0")]
2626     #[inline]
2627     pub fn sort_unstable_by<F>(&mut self, mut compare: F)
2628     where
2629         F: FnMut(&T, &T) -> Ordering,
2630     {
2631         sort::quicksort(self, |a, b| compare(a, b) == Ordering::Less);
2632     }
2633
2634     /// Sorts the slice with a key extraction function, but might not preserve the order of equal
2635     /// elements.
2636     ///
2637     /// This sort is unstable (i.e., may reorder equal elements), in-place
2638     /// (i.e., does not allocate), and *O*(m \* *n* \* log(*n*)) worst-case, where the key function is
2639     /// *O*(*m*).
2640     ///
2641     /// # Current implementation
2642     ///
2643     /// The current algorithm is based on [pattern-defeating quicksort][pdqsort] by Orson Peters,
2644     /// which combines the fast average case of randomized quicksort with the fast worst case of
2645     /// heapsort, while achieving linear time on slices with certain patterns. It uses some
2646     /// randomization to avoid degenerate cases, but with a fixed seed to always provide
2647     /// deterministic behavior.
2648     ///
2649     /// Due to its key calling strategy, [`sort_unstable_by_key`](#method.sort_unstable_by_key)
2650     /// is likely to be slower than [`sort_by_cached_key`](#method.sort_by_cached_key) in
2651     /// cases where the key function is expensive.
2652     ///
2653     /// # Examples
2654     ///
2655     /// ```
2656     /// let mut v = [-5i32, 4, 1, -3, 2];
2657     ///
2658     /// v.sort_unstable_by_key(|k| k.abs());
2659     /// assert!(v == [1, 2, -3, 4, -5]);
2660     /// ```
2661     ///
2662     /// [pdqsort]: https://github.com/orlp/pdqsort
2663     #[stable(feature = "sort_unstable", since = "1.20.0")]
2664     #[inline]
2665     pub fn sort_unstable_by_key<K, F>(&mut self, mut f: F)
2666     where
2667         F: FnMut(&T) -> K,
2668         K: Ord,
2669     {
2670         sort::quicksort(self, |a, b| f(a).lt(&f(b)));
2671     }
2672
2673     /// Reorder the slice such that the element at `index` is at its final sorted position.
2674     ///
2675     /// This reordering has the additional property that any value at position `i < index` will be
2676     /// less than or equal to any value at a position `j > index`. Additionally, this reordering is
2677     /// unstable (i.e. any number of equal elements may end up at position `index`), in-place
2678     /// (i.e. does not allocate), and *O*(*n*) worst-case. This function is also/ known as "kth
2679     /// element" in other libraries. It returns a triplet of the following from the reordered slice:
2680     /// the subslice prior to `index`, the element at `index`, and the subslice after `index`;
2681     /// accordingly, the values in those two subslices will respectively all be less-than-or-equal-to
2682     /// and greater-than-or-equal-to the value of the element at `index`.
2683     ///
2684     /// # Current implementation
2685     ///
2686     /// The current algorithm is based on the quickselect portion of the same quicksort algorithm
2687     /// used for [`sort_unstable`].
2688     ///
2689     /// [`sort_unstable`]: slice::sort_unstable
2690     ///
2691     /// # Panics
2692     ///
2693     /// Panics when `index >= len()`, meaning it always panics on empty slices.
2694     ///
2695     /// # Examples
2696     ///
2697     /// ```
2698     /// let mut v = [-5i32, 4, 1, -3, 2];
2699     ///
2700     /// // Find the median
2701     /// v.select_nth_unstable(2);
2702     ///
2703     /// // We are only guaranteed the slice will be one of the following, based on the way we sort
2704     /// // about the specified index.
2705     /// assert!(v == [-3, -5, 1, 2, 4] ||
2706     ///         v == [-5, -3, 1, 2, 4] ||
2707     ///         v == [-3, -5, 1, 4, 2] ||
2708     ///         v == [-5, -3, 1, 4, 2]);
2709     /// ```
2710     #[stable(feature = "slice_select_nth_unstable", since = "1.49.0")]
2711     #[inline]
2712     pub fn select_nth_unstable(&mut self, index: usize) -> (&mut [T], &mut T, &mut [T])
2713     where
2714         T: Ord,
2715     {
2716         sort::partition_at_index(self, index, T::lt)
2717     }
2718
2719     /// Reorder the slice with a comparator function such that the element at `index` is at its
2720     /// final sorted position.
2721     ///
2722     /// This reordering has the additional property that any value at position `i < index` will be
2723     /// less than or equal to any value at a position `j > index` using the comparator function.
2724     /// Additionally, this reordering is unstable (i.e. any number of equal elements may end up at
2725     /// position `index`), in-place (i.e. does not allocate), and *O*(*n*) worst-case. This function
2726     /// is also known as "kth element" in other libraries. It returns a triplet of the following from
2727     /// the slice reordered according to the provided comparator function: the subslice prior to
2728     /// `index`, the element at `index`, and the subslice after `index`; accordingly, the values in
2729     /// those two subslices will respectively all be less-than-or-equal-to and greater-than-or-equal-to
2730     /// the value of the element at `index`.
2731     ///
2732     /// # Current implementation
2733     ///
2734     /// The current algorithm is based on the quickselect portion of the same quicksort algorithm
2735     /// used for [`sort_unstable`].
2736     ///
2737     /// [`sort_unstable`]: slice::sort_unstable
2738     ///
2739     /// # Panics
2740     ///
2741     /// Panics when `index >= len()`, meaning it always panics on empty slices.
2742     ///
2743     /// # Examples
2744     ///
2745     /// ```
2746     /// let mut v = [-5i32, 4, 1, -3, 2];
2747     ///
2748     /// // Find the median as if the slice were sorted in descending order.
2749     /// v.select_nth_unstable_by(2, |a, b| b.cmp(a));
2750     ///
2751     /// // We are only guaranteed the slice will be one of the following, based on the way we sort
2752     /// // about the specified index.
2753     /// assert!(v == [2, 4, 1, -5, -3] ||
2754     ///         v == [2, 4, 1, -3, -5] ||
2755     ///         v == [4, 2, 1, -5, -3] ||
2756     ///         v == [4, 2, 1, -3, -5]);
2757     /// ```
2758     #[stable(feature = "slice_select_nth_unstable", since = "1.49.0")]
2759     #[inline]
2760     pub fn select_nth_unstable_by<F>(
2761         &mut self,
2762         index: usize,
2763         mut compare: F,
2764     ) -> (&mut [T], &mut T, &mut [T])
2765     where
2766         F: FnMut(&T, &T) -> Ordering,
2767     {
2768         sort::partition_at_index(self, index, |a: &T, b: &T| compare(a, b) == Less)
2769     }
2770
2771     /// Reorder the slice with a key extraction function such that the element at `index` is at its
2772     /// final sorted position.
2773     ///
2774     /// This reordering has the additional property that any value at position `i < index` will be
2775     /// less than or equal to any value at a position `j > index` using the key extraction function.
2776     /// Additionally, this reordering is unstable (i.e. any number of equal elements may end up at
2777     /// position `index`), in-place (i.e. does not allocate), and *O*(*n*) worst-case. This function
2778     /// is also known as "kth element" in other libraries. It returns a triplet of the following from
2779     /// the slice reordered according to the provided key extraction function: the subslice prior to
2780     /// `index`, the element at `index`, and the subslice after `index`; accordingly, the values in
2781     /// those two subslices will respectively all be less-than-or-equal-to and greater-than-or-equal-to
2782     /// the value of the element at `index`.
2783     ///
2784     /// # Current implementation
2785     ///
2786     /// The current algorithm is based on the quickselect portion of the same quicksort algorithm
2787     /// used for [`sort_unstable`].
2788     ///
2789     /// [`sort_unstable`]: slice::sort_unstable
2790     ///
2791     /// # Panics
2792     ///
2793     /// Panics when `index >= len()`, meaning it always panics on empty slices.
2794     ///
2795     /// # Examples
2796     ///
2797     /// ```
2798     /// let mut v = [-5i32, 4, 1, -3, 2];
2799     ///
2800     /// // Return the median as if the array were sorted according to absolute value.
2801     /// v.select_nth_unstable_by_key(2, |a| a.abs());
2802     ///
2803     /// // We are only guaranteed the slice will be one of the following, based on the way we sort
2804     /// // about the specified index.
2805     /// assert!(v == [1, 2, -3, 4, -5] ||
2806     ///         v == [1, 2, -3, -5, 4] ||
2807     ///         v == [2, 1, -3, 4, -5] ||
2808     ///         v == [2, 1, -3, -5, 4]);
2809     /// ```
2810     #[stable(feature = "slice_select_nth_unstable", since = "1.49.0")]
2811     #[inline]
2812     pub fn select_nth_unstable_by_key<K, F>(
2813         &mut self,
2814         index: usize,
2815         mut f: F,
2816     ) -> (&mut [T], &mut T, &mut [T])
2817     where
2818         F: FnMut(&T) -> K,
2819         K: Ord,
2820     {
2821         sort::partition_at_index(self, index, |a: &T, b: &T| f(a).lt(&f(b)))
2822     }
2823
2824     /// Moves all consecutive repeated elements to the end of the slice according to the
2825     /// [`PartialEq`] trait implementation.
2826     ///
2827     /// Returns two slices. The first contains no consecutive repeated elements.
2828     /// The second contains all the duplicates in no specified order.
2829     ///
2830     /// If the slice is sorted, the first returned slice contains no duplicates.
2831     ///
2832     /// # Examples
2833     ///
2834     /// ```
2835     /// #![feature(slice_partition_dedup)]
2836     ///
2837     /// let mut slice = [1, 2, 2, 3, 3, 2, 1, 1];
2838     ///
2839     /// let (dedup, duplicates) = slice.partition_dedup();
2840     ///
2841     /// assert_eq!(dedup, [1, 2, 3, 2, 1]);
2842     /// assert_eq!(duplicates, [2, 3, 1]);
2843     /// ```
2844     #[unstable(feature = "slice_partition_dedup", issue = "54279")]
2845     #[inline]
2846     pub fn partition_dedup(&mut self) -> (&mut [T], &mut [T])
2847     where
2848         T: PartialEq,
2849     {
2850         self.partition_dedup_by(|a, b| a == b)
2851     }
2852
2853     /// Moves all but the first of consecutive elements to the end of the slice satisfying
2854     /// a given equality relation.
2855     ///
2856     /// Returns two slices. The first contains no consecutive repeated elements.
2857     /// The second contains all the duplicates in no specified order.
2858     ///
2859     /// The `same_bucket` function is passed references to two elements from the slice and
2860     /// must determine if the elements compare equal. The elements are passed in opposite order
2861     /// from their order in the slice, so if `same_bucket(a, b)` returns `true`, `a` is moved
2862     /// at the end of the slice.
2863     ///
2864     /// If the slice is sorted, the first returned slice contains no duplicates.
2865     ///
2866     /// # Examples
2867     ///
2868     /// ```
2869     /// #![feature(slice_partition_dedup)]
2870     ///
2871     /// let mut slice = ["foo", "Foo", "BAZ", "Bar", "bar", "baz", "BAZ"];
2872     ///
2873     /// let (dedup, duplicates) = slice.partition_dedup_by(|a, b| a.eq_ignore_ascii_case(b));
2874     ///
2875     /// assert_eq!(dedup, ["foo", "BAZ", "Bar", "baz"]);
2876     /// assert_eq!(duplicates, ["bar", "Foo", "BAZ"]);
2877     /// ```
2878     #[unstable(feature = "slice_partition_dedup", issue = "54279")]
2879     #[inline]
2880     pub fn partition_dedup_by<F>(&mut self, mut same_bucket: F) -> (&mut [T], &mut [T])
2881     where
2882         F: FnMut(&mut T, &mut T) -> bool,
2883     {
2884         // Although we have a mutable reference to `self`, we cannot make
2885         // *arbitrary* changes. The `same_bucket` calls could panic, so we
2886         // must ensure that the slice is in a valid state at all times.
2887         //
2888         // The way that we handle this is by using swaps; we iterate
2889         // over all the elements, swapping as we go so that at the end
2890         // the elements we wish to keep are in the front, and those we
2891         // wish to reject are at the back. We can then split the slice.
2892         // This operation is still `O(n)`.
2893         //
2894         // Example: We start in this state, where `r` represents "next
2895         // read" and `w` represents "next_write`.
2896         //
2897         //           r
2898         //     +---+---+---+---+---+---+
2899         //     | 0 | 1 | 1 | 2 | 3 | 3 |
2900         //     +---+---+---+---+---+---+
2901         //           w
2902         //
2903         // Comparing self[r] against self[w-1], this is not a duplicate, so
2904         // we swap self[r] and self[w] (no effect as r==w) and then increment both
2905         // r and w, leaving us with:
2906         //
2907         //               r
2908         //     +---+---+---+---+---+---+
2909         //     | 0 | 1 | 1 | 2 | 3 | 3 |
2910         //     +---+---+---+---+---+---+
2911         //               w
2912         //
2913         // Comparing self[r] against self[w-1], this value is a duplicate,
2914         // so we increment `r` but leave everything else unchanged:
2915         //
2916         //                   r
2917         //     +---+---+---+---+---+---+
2918         //     | 0 | 1 | 1 | 2 | 3 | 3 |
2919         //     +---+---+---+---+---+---+
2920         //               w
2921         //
2922         // Comparing self[r] against self[w-1], this is not a duplicate,
2923         // so swap self[r] and self[w] and advance r and w:
2924         //
2925         //                       r
2926         //     +---+---+---+---+---+---+
2927         //     | 0 | 1 | 2 | 1 | 3 | 3 |
2928         //     +---+---+---+---+---+---+
2929         //                   w
2930         //
2931         // Not a duplicate, repeat:
2932         //
2933         //                           r
2934         //     +---+---+---+---+---+---+
2935         //     | 0 | 1 | 2 | 3 | 1 | 3 |
2936         //     +---+---+---+---+---+---+
2937         //                       w
2938         //
2939         // Duplicate, advance r. End of slice. Split at w.
2940
2941         let len = self.len();
2942         if len <= 1 {
2943             return (self, &mut []);
2944         }
2945
2946         let ptr = self.as_mut_ptr();
2947         let mut next_read: usize = 1;
2948         let mut next_write: usize = 1;
2949
2950         // SAFETY: the `while` condition guarantees `next_read` and `next_write`
2951         // are less than `len`, thus are inside `self`. `prev_ptr_write` points to
2952         // one element before `ptr_write`, but `next_write` starts at 1, so
2953         // `prev_ptr_write` is never less than 0 and is inside the slice.
2954         // This fulfils the requirements for dereferencing `ptr_read`, `prev_ptr_write`
2955         // and `ptr_write`, and for using `ptr.add(next_read)`, `ptr.add(next_write - 1)`
2956         // and `prev_ptr_write.offset(1)`.
2957         //
2958         // `next_write` is also incremented at most once per loop at most meaning
2959         // no element is skipped when it may need to be swapped.
2960         //
2961         // `ptr_read` and `prev_ptr_write` never point to the same element. This
2962         // is required for `&mut *ptr_read`, `&mut *prev_ptr_write` to be safe.
2963         // The explanation is simply that `next_read >= next_write` is always true,
2964         // thus `next_read > next_write - 1` is too.
2965         unsafe {
2966             // Avoid bounds checks by using raw pointers.
2967             while next_read < len {
2968                 let ptr_read = ptr.add(next_read);
2969                 let prev_ptr_write = ptr.add(next_write - 1);
2970                 if !same_bucket(&mut *ptr_read, &mut *prev_ptr_write) {
2971                     if next_read != next_write {
2972                         let ptr_write = prev_ptr_write.add(1);
2973                         mem::swap(&mut *ptr_read, &mut *ptr_write);
2974                     }
2975                     next_write += 1;
2976                 }
2977                 next_read += 1;
2978             }
2979         }
2980
2981         self.split_at_mut(next_write)
2982     }
2983
2984     /// Moves all but the first of consecutive elements to the end of the slice that resolve
2985     /// to the same key.
2986     ///
2987     /// Returns two slices. The first contains no consecutive repeated elements.
2988     /// The second contains all the duplicates in no specified order.
2989     ///
2990     /// If the slice is sorted, the first returned slice contains no duplicates.
2991     ///
2992     /// # Examples
2993     ///
2994     /// ```
2995     /// #![feature(slice_partition_dedup)]
2996     ///
2997     /// let mut slice = [10, 20, 21, 30, 30, 20, 11, 13];
2998     ///
2999     /// let (dedup, duplicates) = slice.partition_dedup_by_key(|i| *i / 10);
3000     ///
3001     /// assert_eq!(dedup, [10, 20, 30, 20, 11]);
3002     /// assert_eq!(duplicates, [21, 30, 13]);
3003     /// ```
3004     #[unstable(feature = "slice_partition_dedup", issue = "54279")]
3005     #[inline]
3006     pub fn partition_dedup_by_key<K, F>(&mut self, mut key: F) -> (&mut [T], &mut [T])
3007     where
3008         F: FnMut(&mut T) -> K,
3009         K: PartialEq,
3010     {
3011         self.partition_dedup_by(|a, b| key(a) == key(b))
3012     }
3013
3014     /// Rotates the slice in-place such that the first `mid` elements of the
3015     /// slice move to the end while the last `self.len() - mid` elements move to
3016     /// the front. After calling `rotate_left`, the element previously at index
3017     /// `mid` will become the first element in the slice.
3018     ///
3019     /// # Panics
3020     ///
3021     /// This function will panic if `mid` is greater than the length of the
3022     /// slice. Note that `mid == self.len()` does _not_ panic and is a no-op
3023     /// rotation.
3024     ///
3025     /// # Complexity
3026     ///
3027     /// Takes linear (in `self.len()`) time.
3028     ///
3029     /// # Examples
3030     ///
3031     /// ```
3032     /// let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
3033     /// a.rotate_left(2);
3034     /// assert_eq!(a, ['c', 'd', 'e', 'f', 'a', 'b']);
3035     /// ```
3036     ///
3037     /// Rotating a subslice:
3038     ///
3039     /// ```
3040     /// let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
3041     /// a[1..5].rotate_left(1);
3042     /// assert_eq!(a, ['a', 'c', 'd', 'e', 'b', 'f']);
3043     /// ```
3044     #[stable(feature = "slice_rotate", since = "1.26.0")]
3045     pub fn rotate_left(&mut self, mid: usize) {
3046         assert!(mid <= self.len());
3047         let k = self.len() - mid;
3048         let p = self.as_mut_ptr();
3049
3050         // SAFETY: The range `[p.add(mid) - mid, p.add(mid) + k)` is trivially
3051         // valid for reading and writing, as required by `ptr_rotate`.
3052         unsafe {
3053             rotate::ptr_rotate(mid, p.add(mid), k);
3054         }
3055     }
3056
3057     /// Rotates the slice in-place such that the first `self.len() - k`
3058     /// elements of the slice move to the end while the last `k` elements move
3059     /// to the front. After calling `rotate_right`, the element previously at
3060     /// index `self.len() - k` will become the first element in the slice.
3061     ///
3062     /// # Panics
3063     ///
3064     /// This function will panic if `k` is greater than the length of the
3065     /// slice. Note that `k == self.len()` does _not_ panic and is a no-op
3066     /// rotation.
3067     ///
3068     /// # Complexity
3069     ///
3070     /// Takes linear (in `self.len()`) time.
3071     ///
3072     /// # Examples
3073     ///
3074     /// ```
3075     /// let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
3076     /// a.rotate_right(2);
3077     /// assert_eq!(a, ['e', 'f', 'a', 'b', 'c', 'd']);
3078     /// ```
3079     ///
3080     /// Rotate a subslice:
3081     ///
3082     /// ```
3083     /// let mut a = ['a', 'b', 'c', 'd', 'e', 'f'];
3084     /// a[1..5].rotate_right(1);
3085     /// assert_eq!(a, ['a', 'e', 'b', 'c', 'd', 'f']);
3086     /// ```
3087     #[stable(feature = "slice_rotate", since = "1.26.0")]
3088     pub fn rotate_right(&mut self, k: usize) {
3089         assert!(k <= self.len());
3090         let mid = self.len() - k;
3091         let p = self.as_mut_ptr();
3092
3093         // SAFETY: The range `[p.add(mid) - mid, p.add(mid) + k)` is trivially
3094         // valid for reading and writing, as required by `ptr_rotate`.
3095         unsafe {
3096             rotate::ptr_rotate(mid, p.add(mid), k);
3097         }
3098     }
3099
3100     /// Fills `self` with elements by cloning `value`.
3101     ///
3102     /// # Examples
3103     ///
3104     /// ```
3105     /// let mut buf = vec![0; 10];
3106     /// buf.fill(1);
3107     /// assert_eq!(buf, vec![1; 10]);
3108     /// ```
3109     #[doc(alias = "memset")]
3110     #[stable(feature = "slice_fill", since = "1.50.0")]
3111     pub fn fill(&mut self, value: T)
3112     where
3113         T: Clone,
3114     {
3115         specialize::SpecFill::spec_fill(self, value);
3116     }
3117
3118     /// Fills `self` with elements returned by calling a closure repeatedly.
3119     ///
3120     /// This method uses a closure to create new values. If you'd rather
3121     /// [`Clone`] a given value, use [`fill`]. If you want to use the [`Default`]
3122     /// trait to generate values, you can pass [`Default::default`] as the
3123     /// argument.
3124     ///
3125     /// [`fill`]: slice::fill
3126     ///
3127     /// # Examples
3128     ///
3129     /// ```
3130     /// let mut buf = vec![1; 10];
3131     /// buf.fill_with(Default::default);
3132     /// assert_eq!(buf, vec![0; 10]);
3133     /// ```
3134     #[stable(feature = "slice_fill_with", since = "1.51.0")]
3135     pub fn fill_with<F>(&mut self, mut f: F)
3136     where
3137         F: FnMut() -> T,
3138     {
3139         for el in self {
3140             *el = f();
3141         }
3142     }
3143
3144     /// Copies the elements from `src` into `self`.
3145     ///
3146     /// The length of `src` must be the same as `self`.
3147     ///
3148     /// # Panics
3149     ///
3150     /// This function will panic if the two slices have different lengths.
3151     ///
3152     /// # Examples
3153     ///
3154     /// Cloning two elements from a slice into another:
3155     ///
3156     /// ```
3157     /// let src = [1, 2, 3, 4];
3158     /// let mut dst = [0, 0];
3159     ///
3160     /// // Because the slices have to be the same length,
3161     /// // we slice the source slice from four elements
3162     /// // to two. It will panic if we don't do this.
3163     /// dst.clone_from_slice(&src[2..]);
3164     ///
3165     /// assert_eq!(src, [1, 2, 3, 4]);
3166     /// assert_eq!(dst, [3, 4]);
3167     /// ```
3168     ///
3169     /// Rust enforces that there can only be one mutable reference with no
3170     /// immutable references to a particular piece of data in a particular
3171     /// scope. Because of this, attempting to use `clone_from_slice` on a
3172     /// single slice will result in a compile failure:
3173     ///
3174     /// ```compile_fail
3175     /// let mut slice = [1, 2, 3, 4, 5];
3176     ///
3177     /// slice[..2].clone_from_slice(&slice[3..]); // compile fail!
3178     /// ```
3179     ///
3180     /// To work around this, we can use [`split_at_mut`] to create two distinct
3181     /// sub-slices from a slice:
3182     ///
3183     /// ```
3184     /// let mut slice = [1, 2, 3, 4, 5];
3185     ///
3186     /// {
3187     ///     let (left, right) = slice.split_at_mut(2);
3188     ///     left.clone_from_slice(&right[1..]);
3189     /// }
3190     ///
3191     /// assert_eq!(slice, [4, 5, 3, 4, 5]);
3192     /// ```
3193     ///
3194     /// [`copy_from_slice`]: slice::copy_from_slice
3195     /// [`split_at_mut`]: slice::split_at_mut
3196     #[stable(feature = "clone_from_slice", since = "1.7.0")]
3197     #[track_caller]
3198     pub fn clone_from_slice(&mut self, src: &[T])
3199     where
3200         T: Clone,
3201     {
3202         self.spec_clone_from(src);
3203     }
3204
3205     /// Copies all elements from `src` into `self`, using a memcpy.
3206     ///
3207     /// The length of `src` must be the same as `self`.
3208     ///
3209     /// If `T` does not implement `Copy`, use [`clone_from_slice`].
3210     ///
3211     /// # Panics
3212     ///
3213     /// This function will panic if the two slices have different lengths.
3214     ///
3215     /// # Examples
3216     ///
3217     /// Copying two elements from a slice into another:
3218     ///
3219     /// ```
3220     /// let src = [1, 2, 3, 4];
3221     /// let mut dst = [0, 0];
3222     ///
3223     /// // Because the slices have to be the same length,
3224     /// // we slice the source slice from four elements
3225     /// // to two. It will panic if we don't do this.
3226     /// dst.copy_from_slice(&src[2..]);
3227     ///
3228     /// assert_eq!(src, [1, 2, 3, 4]);
3229     /// assert_eq!(dst, [3, 4]);
3230     /// ```
3231     ///
3232     /// Rust enforces that there can only be one mutable reference with no
3233     /// immutable references to a particular piece of data in a particular
3234     /// scope. Because of this, attempting to use `copy_from_slice` on a
3235     /// single slice will result in a compile failure:
3236     ///
3237     /// ```compile_fail
3238     /// let mut slice = [1, 2, 3, 4, 5];
3239     ///
3240     /// slice[..2].copy_from_slice(&slice[3..]); // compile fail!
3241     /// ```
3242     ///
3243     /// To work around this, we can use [`split_at_mut`] to create two distinct
3244     /// sub-slices from a slice:
3245     ///
3246     /// ```
3247     /// let mut slice = [1, 2, 3, 4, 5];
3248     ///
3249     /// {
3250     ///     let (left, right) = slice.split_at_mut(2);
3251     ///     left.copy_from_slice(&right[1..]);
3252     /// }
3253     ///
3254     /// assert_eq!(slice, [4, 5, 3, 4, 5]);
3255     /// ```
3256     ///
3257     /// [`clone_from_slice`]: slice::clone_from_slice
3258     /// [`split_at_mut`]: slice::split_at_mut
3259     #[doc(alias = "memcpy")]
3260     #[stable(feature = "copy_from_slice", since = "1.9.0")]
3261     #[track_caller]
3262     pub fn copy_from_slice(&mut self, src: &[T])
3263     where
3264         T: Copy,
3265     {
3266         // The panic code path was put into a cold function to not bloat the
3267         // call site.
3268         #[inline(never)]
3269         #[cold]
3270         #[track_caller]
3271         fn len_mismatch_fail(dst_len: usize, src_len: usize) -> ! {
3272             panic!(
3273                 "source slice length ({}) does not match destination slice length ({})",
3274                 src_len, dst_len,
3275             );
3276         }
3277
3278         if self.len() != src.len() {
3279             len_mismatch_fail(self.len(), src.len());
3280         }
3281
3282         // SAFETY: `self` is valid for `self.len()` elements by definition, and `src` was
3283         // checked to have the same length. The slices cannot overlap because
3284         // mutable references are exclusive.
3285         unsafe {
3286             ptr::copy_nonoverlapping(src.as_ptr(), self.as_mut_ptr(), self.len());
3287         }
3288     }
3289
3290     /// Copies elements from one part of the slice to another part of itself,
3291     /// using a memmove.
3292     ///
3293     /// `src` is the range within `self` to copy from. `dest` is the starting
3294     /// index of the range within `self` to copy to, which will have the same
3295     /// length as `src`. The two ranges may overlap. The ends of the two ranges
3296     /// must be less than or equal to `self.len()`.
3297     ///
3298     /// # Panics
3299     ///
3300     /// This function will panic if either range exceeds the end of the slice,
3301     /// or if the end of `src` is before the start.
3302     ///
3303     /// # Examples
3304     ///
3305     /// Copying four bytes within a slice:
3306     ///
3307     /// ```
3308     /// let mut bytes = *b"Hello, World!";
3309     ///
3310     /// bytes.copy_within(1..5, 8);
3311     ///
3312     /// assert_eq!(&bytes, b"Hello, Wello!");
3313     /// ```
3314     #[stable(feature = "copy_within", since = "1.37.0")]
3315     #[track_caller]
3316     pub fn copy_within<R: RangeBounds<usize>>(&mut self, src: R, dest: usize)
3317     where
3318         T: Copy,
3319     {
3320         let Range { start: src_start, end: src_end } = slice::range(src, ..self.len());
3321         let count = src_end - src_start;
3322         assert!(dest <= self.len() - count, "dest is out of bounds");
3323         // SAFETY: the conditions for `ptr::copy` have all been checked above,
3324         // as have those for `ptr::add`.
3325         unsafe {
3326             // Derive both `src_ptr` and `dest_ptr` from the same loan
3327             let ptr = self.as_mut_ptr();
3328             let src_ptr = ptr.add(src_start);
3329             let dest_ptr = ptr.add(dest);
3330             ptr::copy(src_ptr, dest_ptr, count);
3331         }
3332     }
3333
3334     /// Swaps all elements in `self` with those in `other`.
3335     ///
3336     /// The length of `other` must be the same as `self`.
3337     ///
3338     /// # Panics
3339     ///
3340     /// This function will panic if the two slices have different lengths.
3341     ///
3342     /// # Example
3343     ///
3344     /// Swapping two elements across slices:
3345     ///
3346     /// ```
3347     /// let mut slice1 = [0, 0];
3348     /// let mut slice2 = [1, 2, 3, 4];
3349     ///
3350     /// slice1.swap_with_slice(&mut slice2[2..]);
3351     ///
3352     /// assert_eq!(slice1, [3, 4]);
3353     /// assert_eq!(slice2, [1, 2, 0, 0]);
3354     /// ```
3355     ///
3356     /// Rust enforces that there can only be one mutable reference to a
3357     /// particular piece of data in a particular scope. Because of this,
3358     /// attempting to use `swap_with_slice` on a single slice will result in
3359     /// a compile failure:
3360     ///
3361     /// ```compile_fail
3362     /// let mut slice = [1, 2, 3, 4, 5];
3363     /// slice[..2].swap_with_slice(&mut slice[3..]); // compile fail!
3364     /// ```
3365     ///
3366     /// To work around this, we can use [`split_at_mut`] to create two distinct
3367     /// mutable sub-slices from a slice:
3368     ///
3369     /// ```
3370     /// let mut slice = [1, 2, 3, 4, 5];
3371     ///
3372     /// {
3373     ///     let (left, right) = slice.split_at_mut(2);
3374     ///     left.swap_with_slice(&mut right[1..]);
3375     /// }
3376     ///
3377     /// assert_eq!(slice, [4, 5, 3, 1, 2]);
3378     /// ```
3379     ///
3380     /// [`split_at_mut`]: slice::split_at_mut
3381     #[stable(feature = "swap_with_slice", since = "1.27.0")]
3382     #[track_caller]
3383     pub fn swap_with_slice(&mut self, other: &mut [T]) {
3384         assert!(self.len() == other.len(), "destination and source slices have different lengths");
3385         // SAFETY: `self` is valid for `self.len()` elements by definition, and `src` was
3386         // checked to have the same length. The slices cannot overlap because
3387         // mutable references are exclusive.
3388         unsafe {
3389             ptr::swap_nonoverlapping(self.as_mut_ptr(), other.as_mut_ptr(), self.len());
3390         }
3391     }
3392
3393     /// Function to calculate lengths of the middle and trailing slice for `align_to{,_mut}`.
3394     fn align_to_offsets<U>(&self) -> (usize, usize) {
3395         // What we gonna do about `rest` is figure out what multiple of `U`s we can put in a
3396         // lowest number of `T`s. And how many `T`s we need for each such "multiple".
3397         //
3398         // Consider for example T=u8 U=u16. Then we can put 1 U in 2 Ts. Simple. Now, consider
3399         // for example a case where size_of::<T> = 16, size_of::<U> = 24. We can put 2 Us in
3400         // place of every 3 Ts in the `rest` slice. A bit more complicated.
3401         //
3402         // Formula to calculate this is:
3403         //
3404         // Us = lcm(size_of::<T>, size_of::<U>) / size_of::<U>
3405         // Ts = lcm(size_of::<T>, size_of::<U>) / size_of::<T>
3406         //
3407         // Expanded and simplified:
3408         //
3409         // Us = size_of::<T> / gcd(size_of::<T>, size_of::<U>)
3410         // Ts = size_of::<U> / gcd(size_of::<T>, size_of::<U>)
3411         //
3412         // Luckily since all this is constant-evaluated... performance here matters not!
3413         #[inline]
3414         fn gcd(a: usize, b: usize) -> usize {
3415             use crate::intrinsics;
3416             // iterative stein’s algorithm
3417             // We should still make this `const fn` (and revert to recursive algorithm if we do)
3418             // because relying on llvm to consteval all this is… well, it makes me uncomfortable.
3419
3420             // SAFETY: `a` and `b` are checked to be non-zero values.
3421             let (ctz_a, mut ctz_b) = unsafe {
3422                 if a == 0 {
3423                     return b;
3424                 }
3425                 if b == 0 {
3426                     return a;
3427                 }
3428                 (intrinsics::cttz_nonzero(a), intrinsics::cttz_nonzero(b))
3429             };
3430             let k = ctz_a.min(ctz_b);
3431             let mut a = a >> ctz_a;
3432             let mut b = b;
3433             loop {
3434                 // remove all factors of 2 from b
3435                 b >>= ctz_b;
3436                 if a > b {
3437                     mem::swap(&mut a, &mut b);
3438                 }
3439                 b = b - a;
3440                 // SAFETY: `b` is checked to be non-zero.
3441                 unsafe {
3442                     if b == 0 {
3443                         break;
3444                     }
3445                     ctz_b = intrinsics::cttz_nonzero(b);
3446                 }
3447             }
3448             a << k
3449         }
3450         let gcd: usize = gcd(mem::size_of::<T>(), mem::size_of::<U>());
3451         let ts: usize = mem::size_of::<U>() / gcd;
3452         let us: usize = mem::size_of::<T>() / gcd;
3453
3454         // Armed with this knowledge, we can find how many `U`s we can fit!
3455         let us_len = self.len() / ts * us;
3456         // And how many `T`s will be in the trailing slice!
3457         let ts_len = self.len() % ts;
3458         (us_len, ts_len)
3459     }
3460
3461     /// Transmute the slice to a slice of another type, ensuring alignment of the types is
3462     /// maintained.
3463     ///
3464     /// This method splits the slice into three distinct slices: prefix, correctly aligned middle
3465     /// slice of a new type, and the suffix slice. The method may make the middle slice the greatest
3466     /// length possible for a given type and input slice, but only your algorithm's performance
3467     /// should depend on that, not its correctness. It is permissible for all of the input data to
3468     /// be returned as the prefix or suffix slice.
3469     ///
3470     /// This method has no purpose when either input element `T` or output element `U` are
3471     /// zero-sized and will return the original slice without splitting anything.
3472     ///
3473     /// # Safety
3474     ///
3475     /// This method is essentially a `transmute` with respect to the elements in the returned
3476     /// middle slice, so all the usual caveats pertaining to `transmute::<T, U>` also apply here.
3477     ///
3478     /// # Examples
3479     ///
3480     /// Basic usage:
3481     ///
3482     /// ```
3483     /// unsafe {
3484     ///     let bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
3485     ///     let (prefix, shorts, suffix) = bytes.align_to::<u16>();
3486     ///     // less_efficient_algorithm_for_bytes(prefix);
3487     ///     // more_efficient_algorithm_for_aligned_shorts(shorts);
3488     ///     // less_efficient_algorithm_for_bytes(suffix);
3489     /// }
3490     /// ```
3491     #[stable(feature = "slice_align_to", since = "1.30.0")]
3492     #[must_use]
3493     pub unsafe fn align_to<U>(&self) -> (&[T], &[U], &[T]) {
3494         // Note that most of this function will be constant-evaluated,
3495         if U::IS_ZST || T::IS_ZST {
3496             // handle ZSTs specially, which is â€“ don't handle them at all.
3497             return (self, &[], &[]);
3498         }
3499
3500         // First, find at what point do we split between the first and 2nd slice. Easy with
3501         // ptr.align_offset.
3502         let ptr = self.as_ptr();
3503         // SAFETY: See the `align_to_mut` method for the detailed safety comment.
3504         let offset = unsafe { crate::ptr::align_offset(ptr, mem::align_of::<U>()) };
3505         if offset > self.len() {
3506             (self, &[], &[])
3507         } else {
3508             let (left, rest) = self.split_at(offset);
3509             let (us_len, ts_len) = rest.align_to_offsets::<U>();
3510             // SAFETY: now `rest` is definitely aligned, so `from_raw_parts` below is okay,
3511             // since the caller guarantees that we can transmute `T` to `U` safely.
3512             unsafe {
3513                 (
3514                     left,
3515                     from_raw_parts(rest.as_ptr() as *const U, us_len),
3516                     from_raw_parts(rest.as_ptr().add(rest.len() - ts_len), ts_len),
3517                 )
3518             }
3519         }
3520     }
3521
3522     /// Transmute the slice to a slice of another type, ensuring alignment of the types is
3523     /// maintained.
3524     ///
3525     /// This method splits the slice into three distinct slices: prefix, correctly aligned middle
3526     /// slice of a new type, and the suffix slice. The method may make the middle slice the greatest
3527     /// length possible for a given type and input slice, but only your algorithm's performance
3528     /// should depend on that, not its correctness. It is permissible for all of the input data to
3529     /// be returned as the prefix or suffix slice.
3530     ///
3531     /// This method has no purpose when either input element `T` or output element `U` are
3532     /// zero-sized and will return the original slice without splitting anything.
3533     ///
3534     /// # Safety
3535     ///
3536     /// This method is essentially a `transmute` with respect to the elements in the returned
3537     /// middle slice, so all the usual caveats pertaining to `transmute::<T, U>` also apply here.
3538     ///
3539     /// # Examples
3540     ///
3541     /// Basic usage:
3542     ///
3543     /// ```
3544     /// unsafe {
3545     ///     let mut bytes: [u8; 7] = [1, 2, 3, 4, 5, 6, 7];
3546     ///     let (prefix, shorts, suffix) = bytes.align_to_mut::<u16>();
3547     ///     // less_efficient_algorithm_for_bytes(prefix);
3548     ///     // more_efficient_algorithm_for_aligned_shorts(shorts);
3549     ///     // less_efficient_algorithm_for_bytes(suffix);
3550     /// }
3551     /// ```
3552     #[stable(feature = "slice_align_to", since = "1.30.0")]
3553     #[must_use]
3554     pub unsafe fn align_to_mut<U>(&mut self) -> (&mut [T], &mut [U], &mut [T]) {
3555         // Note that most of this function will be constant-evaluated,
3556         if U::IS_ZST || T::IS_ZST {
3557             // handle ZSTs specially, which is â€“ don't handle them at all.
3558             return (self, &mut [], &mut []);
3559         }
3560
3561         // First, find at what point do we split between the first and 2nd slice. Easy with
3562         // ptr.align_offset.
3563         let ptr = self.as_ptr();
3564         // SAFETY: Here we are ensuring we will use aligned pointers for U for the
3565         // rest of the method. This is done by passing a pointer to &[T] with an
3566         // alignment targeted for U.
3567         // `crate::ptr::align_offset` is called with a correctly aligned and
3568         // valid pointer `ptr` (it comes from a reference to `self`) and with
3569         // a size that is a power of two (since it comes from the alignment for U),
3570         // satisfying its safety constraints.
3571         let offset = unsafe { crate::ptr::align_offset(ptr, mem::align_of::<U>()) };
3572         if offset > self.len() {
3573             (self, &mut [], &mut [])
3574         } else {
3575             let (left, rest) = self.split_at_mut(offset);
3576             let (us_len, ts_len) = rest.align_to_offsets::<U>();
3577             let rest_len = rest.len();
3578             let mut_ptr = rest.as_mut_ptr();
3579             // We can't use `rest` again after this, that would invalidate its alias `mut_ptr`!
3580             // SAFETY: see comments for `align_to`.
3581             unsafe {
3582                 (
3583                     left,
3584                     from_raw_parts_mut(mut_ptr as *mut U, us_len),
3585                     from_raw_parts_mut(mut_ptr.add(rest_len - ts_len), ts_len),
3586                 )
3587             }
3588         }
3589     }
3590
3591     /// Split a slice into a prefix, a middle of aligned SIMD types, and a suffix.
3592     ///
3593     /// This is a safe wrapper around [`slice::align_to`], so has the same weak
3594     /// postconditions as that method.  You're only assured that
3595     /// `self.len() == prefix.len() + middle.len() * LANES + suffix.len()`.
3596     ///
3597     /// Notably, all of the following are possible:
3598     /// - `prefix.len() >= LANES`.
3599     /// - `middle.is_empty()` despite `self.len() >= 3 * LANES`.
3600     /// - `suffix.len() >= LANES`.
3601     ///
3602     /// That said, this is a safe method, so if you're only writing safe code,
3603     /// then this can at most cause incorrect logic, not unsoundness.
3604     ///
3605     /// # Panics
3606     ///
3607     /// This will panic if the size of the SIMD type is different from
3608     /// `LANES` times that of the scalar.
3609     ///
3610     /// At the time of writing, the trait restrictions on `Simd<T, LANES>` keeps
3611     /// that from ever happening, as only power-of-two numbers of lanes are
3612     /// supported.  It's possible that, in the future, those restrictions might
3613     /// be lifted in a way that would make it possible to see panics from this
3614     /// method for something like `LANES == 3`.
3615     ///
3616     /// # Examples
3617     ///
3618     /// ```
3619     /// #![feature(portable_simd)]
3620     /// use core::simd::SimdFloat;
3621     ///
3622     /// let short = &[1, 2, 3];
3623     /// let (prefix, middle, suffix) = short.as_simd::<4>();
3624     /// assert_eq!(middle, []); // Not enough elements for anything in the middle
3625     ///
3626     /// // They might be split in any possible way between prefix and suffix
3627     /// let it = prefix.iter().chain(suffix).copied();
3628     /// assert_eq!(it.collect::<Vec<_>>(), vec![1, 2, 3]);
3629     ///
3630     /// fn basic_simd_sum(x: &[f32]) -> f32 {
3631     ///     use std::ops::Add;
3632     ///     use std::simd::f32x4;
3633     ///     let (prefix, middle, suffix) = x.as_simd();
3634     ///     let sums = f32x4::from_array([
3635     ///         prefix.iter().copied().sum(),
3636     ///         0.0,
3637     ///         0.0,
3638     ///         suffix.iter().copied().sum(),
3639     ///     ]);
3640     ///     let sums = middle.iter().copied().fold(sums, f32x4::add);
3641     ///     sums.reduce_sum()
3642     /// }
3643     ///
3644     /// let numbers: Vec<f32> = (1..101).map(|x| x as _).collect();
3645     /// assert_eq!(basic_simd_sum(&numbers[1..99]), 4949.0);
3646     /// ```
3647     #[unstable(feature = "portable_simd", issue = "86656")]
3648     #[must_use]
3649     pub fn as_simd<const LANES: usize>(&self) -> (&[T], &[Simd<T, LANES>], &[T])
3650     where
3651         Simd<T, LANES>: AsRef<[T; LANES]>,
3652         T: simd::SimdElement,
3653         simd::LaneCount<LANES>: simd::SupportedLaneCount,
3654     {
3655         // These are expected to always match, as vector types are laid out like
3656         // arrays per <https://llvm.org/docs/LangRef.html#vector-type>, but we
3657         // might as well double-check since it'll optimize away anyhow.
3658         assert_eq!(mem::size_of::<Simd<T, LANES>>(), mem::size_of::<[T; LANES]>());
3659
3660         // SAFETY: The simd types have the same layout as arrays, just with
3661         // potentially-higher alignment, so the de-facto transmutes are sound.
3662         unsafe { self.align_to() }
3663     }
3664
3665     /// Split a slice into a prefix, a middle of aligned SIMD types, and a suffix.
3666     ///
3667     /// This is a safe wrapper around [`slice::align_to_mut`], so has the same weak
3668     /// postconditions as that method.  You're only assured that
3669     /// `self.len() == prefix.len() + middle.len() * LANES + suffix.len()`.
3670     ///
3671     /// Notably, all of the following are possible:
3672     /// - `prefix.len() >= LANES`.
3673     /// - `middle.is_empty()` despite `self.len() >= 3 * LANES`.
3674     /// - `suffix.len() >= LANES`.
3675     ///
3676     /// That said, this is a safe method, so if you're only writing safe code,
3677     /// then this can at most cause incorrect logic, not unsoundness.
3678     ///
3679     /// This is the mutable version of [`slice::as_simd`]; see that for examples.
3680     ///
3681     /// # Panics
3682     ///
3683     /// This will panic if the size of the SIMD type is different from
3684     /// `LANES` times that of the scalar.
3685     ///
3686     /// At the time of writing, the trait restrictions on `Simd<T, LANES>` keeps
3687     /// that from ever happening, as only power-of-two numbers of lanes are
3688     /// supported.  It's possible that, in the future, those restrictions might
3689     /// be lifted in a way that would make it possible to see panics from this
3690     /// method for something like `LANES == 3`.
3691     #[unstable(feature = "portable_simd", issue = "86656")]
3692     #[must_use]
3693     pub fn as_simd_mut<const LANES: usize>(&mut self) -> (&mut [T], &mut [Simd<T, LANES>], &mut [T])
3694     where
3695         Simd<T, LANES>: AsMut<[T; LANES]>,
3696         T: simd::SimdElement,
3697         simd::LaneCount<LANES>: simd::SupportedLaneCount,
3698     {
3699         // These are expected to always match, as vector types are laid out like
3700         // arrays per <https://llvm.org/docs/LangRef.html#vector-type>, but we
3701         // might as well double-check since it'll optimize away anyhow.
3702         assert_eq!(mem::size_of::<Simd<T, LANES>>(), mem::size_of::<[T; LANES]>());
3703
3704         // SAFETY: The simd types have the same layout as arrays, just with
3705         // potentially-higher alignment, so the de-facto transmutes are sound.
3706         unsafe { self.align_to_mut() }
3707     }
3708
3709     /// Checks if the elements of this slice are sorted.
3710     ///
3711     /// That is, for each element `a` and its following element `b`, `a <= b` must hold. If the
3712     /// slice yields exactly zero or one element, `true` is returned.
3713     ///
3714     /// Note that if `Self::Item` is only `PartialOrd`, but not `Ord`, the above definition
3715     /// implies that this function returns `false` if any two consecutive items are not
3716     /// comparable.
3717     ///
3718     /// # Examples
3719     ///
3720     /// ```
3721     /// #![feature(is_sorted)]
3722     /// let empty: [i32; 0] = [];
3723     ///
3724     /// assert!([1, 2, 2, 9].is_sorted());
3725     /// assert!(![1, 3, 2, 4].is_sorted());
3726     /// assert!([0].is_sorted());
3727     /// assert!(empty.is_sorted());
3728     /// assert!(![0.0, 1.0, f32::NAN].is_sorted());
3729     /// ```
3730     #[inline]
3731     #[unstable(feature = "is_sorted", reason = "new API", issue = "53485")]
3732     #[must_use]
3733     pub fn is_sorted(&self) -> bool
3734     where
3735         T: PartialOrd,
3736     {
3737         self.is_sorted_by(|a, b| a.partial_cmp(b))
3738     }
3739
3740     /// Checks if the elements of this slice are sorted using the given comparator function.
3741     ///
3742     /// Instead of using `PartialOrd::partial_cmp`, this function uses the given `compare`
3743     /// function to determine the ordering of two elements. Apart from that, it's equivalent to
3744     /// [`is_sorted`]; see its documentation for more information.
3745     ///
3746     /// [`is_sorted`]: slice::is_sorted
3747     #[unstable(feature = "is_sorted", reason = "new API", issue = "53485")]
3748     #[must_use]
3749     pub fn is_sorted_by<F>(&self, mut compare: F) -> bool
3750     where
3751         F: FnMut(&T, &T) -> Option<Ordering>,
3752     {
3753         self.iter().is_sorted_by(|a, b| compare(*a, *b))
3754     }
3755
3756     /// Checks if the elements of this slice are sorted using the given key extraction function.
3757     ///
3758     /// Instead of comparing the slice's elements directly, this function compares the keys of the
3759     /// elements, as determined by `f`. Apart from that, it's equivalent to [`is_sorted`]; see its
3760     /// documentation for more information.
3761     ///
3762     /// [`is_sorted`]: slice::is_sorted
3763     ///
3764     /// # Examples
3765     ///
3766     /// ```
3767     /// #![feature(is_sorted)]
3768     ///
3769     /// assert!(["c", "bb", "aaa"].is_sorted_by_key(|s| s.len()));
3770     /// assert!(![-2i32, -1, 0, 3].is_sorted_by_key(|n| n.abs()));
3771     /// ```
3772     #[inline]
3773     #[unstable(feature = "is_sorted", reason = "new API", issue = "53485")]
3774     #[must_use]
3775     pub fn is_sorted_by_key<F, K>(&self, f: F) -> bool
3776     where
3777         F: FnMut(&T) -> K,
3778         K: PartialOrd,
3779     {
3780         self.iter().is_sorted_by_key(f)
3781     }
3782
3783     /// Returns the index of the partition point according to the given predicate
3784     /// (the index of the first element of the second partition).
3785     ///
3786     /// The slice is assumed to be partitioned according to the given predicate.
3787     /// This means that all elements for which the predicate returns true are at the start of the slice
3788     /// and all elements for which the predicate returns false are at the end.
3789     /// For example, [7, 15, 3, 5, 4, 12, 6] is a partitioned under the predicate x % 2 != 0
3790     /// (all odd numbers are at the start, all even at the end).
3791     ///
3792     /// If this slice is not partitioned, the returned result is unspecified and meaningless,
3793     /// as this method performs a kind of binary search.
3794     ///
3795     /// See also [`binary_search`], [`binary_search_by`], and [`binary_search_by_key`].
3796     ///
3797     /// [`binary_search`]: slice::binary_search
3798     /// [`binary_search_by`]: slice::binary_search_by
3799     /// [`binary_search_by_key`]: slice::binary_search_by_key
3800     ///
3801     /// # Examples
3802     ///
3803     /// ```
3804     /// let v = [1, 2, 3, 3, 5, 6, 7];
3805     /// let i = v.partition_point(|&x| x < 5);
3806     ///
3807     /// assert_eq!(i, 4);
3808     /// assert!(v[..i].iter().all(|&x| x < 5));
3809     /// assert!(v[i..].iter().all(|&x| !(x < 5)));
3810     /// ```
3811     ///
3812     /// If all elements of the slice match the predicate, including if the slice
3813     /// is empty, then the length of the slice will be returned:
3814     ///
3815     /// ```
3816     /// let a = [2, 4, 8];
3817     /// assert_eq!(a.partition_point(|x| x < &100), a.len());
3818     /// let a: [i32; 0] = [];
3819     /// assert_eq!(a.partition_point(|x| x < &100), 0);
3820     /// ```
3821     ///
3822     /// If you want to insert an item to a sorted vector, while maintaining
3823     /// sort order:
3824     ///
3825     /// ```
3826     /// let mut s = vec![0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55];
3827     /// let num = 42;
3828     /// let idx = s.partition_point(|&x| x < num);
3829     /// s.insert(idx, num);
3830     /// assert_eq!(s, [0, 1, 1, 1, 1, 2, 3, 5, 8, 13, 21, 34, 42, 55]);
3831     /// ```
3832     #[stable(feature = "partition_point", since = "1.52.0")]
3833     #[must_use]
3834     pub fn partition_point<P>(&self, mut pred: P) -> usize
3835     where
3836         P: FnMut(&T) -> bool,
3837     {
3838         self.binary_search_by(|x| if pred(x) { Less } else { Greater }).unwrap_or_else(|i| i)
3839     }
3840
3841     /// Removes the subslice corresponding to the given range
3842     /// and returns a reference to it.
3843     ///
3844     /// Returns `None` and does not modify the slice if the given
3845     /// range is out of bounds.
3846     ///
3847     /// Note that this method only accepts one-sided ranges such as
3848     /// `2..` or `..6`, but not `2..6`.
3849     ///
3850     /// # Examples
3851     ///
3852     /// Taking the first three elements of a slice:
3853     ///
3854     /// ```
3855     /// #![feature(slice_take)]
3856     ///
3857     /// let mut slice: &[_] = &['a', 'b', 'c', 'd'];
3858     /// let mut first_three = slice.take(..3).unwrap();
3859     ///
3860     /// assert_eq!(slice, &['d']);
3861     /// assert_eq!(first_three, &['a', 'b', 'c']);
3862     /// ```
3863     ///
3864     /// Taking the last two elements of a slice:
3865     ///
3866     /// ```
3867     /// #![feature(slice_take)]
3868     ///
3869     /// let mut slice: &[_] = &['a', 'b', 'c', 'd'];
3870     /// let mut tail = slice.take(2..).unwrap();
3871     ///
3872     /// assert_eq!(slice, &['a', 'b']);
3873     /// assert_eq!(tail, &['c', 'd']);
3874     /// ```
3875     ///
3876     /// Getting `None` when `range` is out of bounds:
3877     ///
3878     /// ```
3879     /// #![feature(slice_take)]
3880     ///
3881     /// let mut slice: &[_] = &['a', 'b', 'c', 'd'];
3882     ///
3883     /// assert_eq!(None, slice.take(5..));
3884     /// assert_eq!(None, slice.take(..5));
3885     /// assert_eq!(None, slice.take(..=4));
3886     /// let expected: &[char] = &['a', 'b', 'c', 'd'];
3887     /// assert_eq!(Some(expected), slice.take(..4));
3888     /// ```
3889     #[inline]
3890     #[must_use = "method does not modify the slice if the range is out of bounds"]
3891     #[unstable(feature = "slice_take", issue = "62280")]
3892     pub fn take<'a, R: OneSidedRange<usize>>(self: &mut &'a Self, range: R) -> Option<&'a Self> {
3893         let (direction, split_index) = split_point_of(range)?;
3894         if split_index > self.len() {
3895             return None;
3896         }
3897         let (front, back) = self.split_at(split_index);
3898         match direction {
3899             Direction::Front => {
3900                 *self = back;
3901                 Some(front)
3902             }
3903             Direction::Back => {
3904                 *self = front;
3905                 Some(back)
3906             }
3907         }
3908     }
3909
3910     /// Removes the subslice corresponding to the given range
3911     /// and returns a mutable reference to it.
3912     ///
3913     /// Returns `None` and does not modify the slice if the given
3914     /// range is out of bounds.
3915     ///
3916     /// Note that this method only accepts one-sided ranges such as
3917     /// `2..` or `..6`, but not `2..6`.
3918     ///
3919     /// # Examples
3920     ///
3921     /// Taking the first three elements of a slice:
3922     ///
3923     /// ```
3924     /// #![feature(slice_take)]
3925     ///
3926     /// let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
3927     /// let mut first_three = slice.take_mut(..3).unwrap();
3928     ///
3929     /// assert_eq!(slice, &mut ['d']);
3930     /// assert_eq!(first_three, &mut ['a', 'b', 'c']);
3931     /// ```
3932     ///
3933     /// Taking the last two elements of a slice:
3934     ///
3935     /// ```
3936     /// #![feature(slice_take)]
3937     ///
3938     /// let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
3939     /// let mut tail = slice.take_mut(2..).unwrap();
3940     ///
3941     /// assert_eq!(slice, &mut ['a', 'b']);
3942     /// assert_eq!(tail, &mut ['c', 'd']);
3943     /// ```
3944     ///
3945     /// Getting `None` when `range` is out of bounds:
3946     ///
3947     /// ```
3948     /// #![feature(slice_take)]
3949     ///
3950     /// let mut slice: &mut [_] = &mut ['a', 'b', 'c', 'd'];
3951     ///
3952     /// assert_eq!(None, slice.take_mut(5..));
3953     /// assert_eq!(None, slice.take_mut(..5));
3954     /// assert_eq!(None, slice.take_mut(..=4));
3955     /// let expected: &mut [_] = &mut ['a', 'b', 'c', 'd'];
3956     /// assert_eq!(Some(expected), slice.take_mut(..4));
3957     /// ```
3958     #[inline]
3959     #[must_use = "method does not modify the slice if the range is out of bounds"]
3960     #[unstable(feature = "slice_take", issue = "62280")]
3961     pub fn take_mut<'a, R: OneSidedRange<usize>>(
3962         self: &mut &'a mut Self,
3963         range: R,
3964     ) -> Option<&'a mut Self> {
3965         let (direction, split_index) = split_point_of(range)?;
3966         if split_index > self.len() {
3967             return None;
3968         }
3969         let (front, back) = mem::take(self).split_at_mut(split_index);
3970         match direction {
3971             Direction::Front => {
3972                 *self = back;
3973                 Some(front)
3974             }
3975             Direction::Back => {
3976                 *self = front;
3977                 Some(back)
3978             }
3979         }
3980     }
3981
3982     /// Removes the first element of the slice and returns a reference
3983     /// to it.
3984     ///
3985     /// Returns `None` if the slice is empty.
3986     ///
3987     /// # Examples
3988     ///
3989     /// ```
3990     /// #![feature(slice_take)]
3991     ///
3992     /// let mut slice: &[_] = &['a', 'b', 'c'];
3993     /// let first = slice.take_first().unwrap();
3994     ///
3995     /// assert_eq!(slice, &['b', 'c']);
3996     /// assert_eq!(first, &'a');
3997     /// ```
3998     #[inline]
3999     #[unstable(feature = "slice_take", issue = "62280")]
4000     pub fn take_first<'a>(self: &mut &'a Self) -> Option<&'a T> {
4001         let (first, rem) = self.split_first()?;
4002         *self = rem;
4003         Some(first)
4004     }
4005
4006     /// Removes the first element of the slice and returns a mutable
4007     /// reference to it.
4008     ///
4009     /// Returns `None` if the slice is empty.
4010     ///
4011     /// # Examples
4012     ///
4013     /// ```
4014     /// #![feature(slice_take)]
4015     ///
4016     /// let mut slice: &mut [_] = &mut ['a', 'b', 'c'];
4017     /// let first = slice.take_first_mut().unwrap();
4018     /// *first = 'd';
4019     ///
4020     /// assert_eq!(slice, &['b', 'c']);
4021     /// assert_eq!(first, &'d');
4022     /// ```
4023     #[inline]
4024     #[unstable(feature = "slice_take", issue = "62280")]
4025     pub fn take_first_mut<'a>(self: &mut &'a mut Self) -> Option<&'a mut T> {
4026         let (first, rem) = mem::take(self).split_first_mut()?;
4027         *self = rem;
4028         Some(first)
4029     }
4030
4031     /// Removes the last element of the slice and returns a reference
4032     /// to it.
4033     ///
4034     /// Returns `None` if the slice is empty.
4035     ///
4036     /// # Examples
4037     ///
4038     /// ```
4039     /// #![feature(slice_take)]
4040     ///
4041     /// let mut slice: &[_] = &['a', 'b', 'c'];
4042     /// let last = slice.take_last().unwrap();
4043     ///
4044     /// assert_eq!(slice, &['a', 'b']);
4045     /// assert_eq!(last, &'c');
4046     /// ```
4047     #[inline]
4048     #[unstable(feature = "slice_take", issue = "62280")]
4049     pub fn take_last<'a>(self: &mut &'a Self) -> Option<&'a T> {
4050         let (last, rem) = self.split_last()?;
4051         *self = rem;
4052         Some(last)
4053     }
4054
4055     /// Removes the last element of the slice and returns a mutable
4056     /// reference to it.
4057     ///
4058     /// Returns `None` if the slice is empty.
4059     ///
4060     /// # Examples
4061     ///
4062     /// ```
4063     /// #![feature(slice_take)]
4064     ///
4065     /// let mut slice: &mut [_] = &mut ['a', 'b', 'c'];
4066     /// let last = slice.take_last_mut().unwrap();
4067     /// *last = 'd';
4068     ///
4069     /// assert_eq!(slice, &['a', 'b']);
4070     /// assert_eq!(last, &'d');
4071     /// ```
4072     #[inline]
4073     #[unstable(feature = "slice_take", issue = "62280")]
4074     pub fn take_last_mut<'a>(self: &mut &'a mut Self) -> Option<&'a mut T> {
4075         let (last, rem) = mem::take(self).split_last_mut()?;
4076         *self = rem;
4077         Some(last)
4078     }
4079 }
4080
4081 impl<T, const N: usize> [[T; N]] {
4082     /// Takes a `&[[T; N]]`, and flattens it to a `&[T]`.
4083     ///
4084     /// # Panics
4085     ///
4086     /// This panics if the length of the resulting slice would overflow a `usize`.
4087     ///
4088     /// This is only possible when flattening a slice of arrays of zero-sized
4089     /// types, and thus tends to be irrelevant in practice. If
4090     /// `size_of::<T>() > 0`, this will never panic.
4091     ///
4092     /// # Examples
4093     ///
4094     /// ```
4095     /// #![feature(slice_flatten)]
4096     ///
4097     /// assert_eq!([[1, 2, 3], [4, 5, 6]].flatten(), &[1, 2, 3, 4, 5, 6]);
4098     ///
4099     /// assert_eq!(
4100     ///     [[1, 2, 3], [4, 5, 6]].flatten(),
4101     ///     [[1, 2], [3, 4], [5, 6]].flatten(),
4102     /// );
4103     ///
4104     /// let slice_of_empty_arrays: &[[i32; 0]] = &[[], [], [], [], []];
4105     /// assert!(slice_of_empty_arrays.flatten().is_empty());
4106     ///
4107     /// let empty_slice_of_arrays: &[[u32; 10]] = &[];
4108     /// assert!(empty_slice_of_arrays.flatten().is_empty());
4109     /// ```
4110     #[unstable(feature = "slice_flatten", issue = "95629")]
4111     pub fn flatten(&self) -> &[T] {
4112         let len = if T::IS_ZST {
4113             self.len().checked_mul(N).expect("slice len overflow")
4114         } else {
4115             // SAFETY: `self.len() * N` cannot overflow because `self` is
4116             // already in the address space.
4117             unsafe { self.len().unchecked_mul(N) }
4118         };
4119         // SAFETY: `[T]` is layout-identical to `[T; N]`
4120         unsafe { from_raw_parts(self.as_ptr().cast(), len) }
4121     }
4122
4123     /// Takes a `&mut [[T; N]]`, and flattens it to a `&mut [T]`.
4124     ///
4125     /// # Panics
4126     ///
4127     /// This panics if the length of the resulting slice would overflow a `usize`.
4128     ///
4129     /// This is only possible when flattening a slice of arrays of zero-sized
4130     /// types, and thus tends to be irrelevant in practice. If
4131     /// `size_of::<T>() > 0`, this will never panic.
4132     ///
4133     /// # Examples
4134     ///
4135     /// ```
4136     /// #![feature(slice_flatten)]
4137     ///
4138     /// fn add_5_to_all(slice: &mut [i32]) {
4139     ///     for i in slice {
4140     ///         *i += 5;
4141     ///     }
4142     /// }
4143     ///
4144     /// let mut array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
4145     /// add_5_to_all(array.flatten_mut());
4146     /// assert_eq!(array, [[6, 7, 8], [9, 10, 11], [12, 13, 14]]);
4147     /// ```
4148     #[unstable(feature = "slice_flatten", issue = "95629")]
4149     pub fn flatten_mut(&mut self) -> &mut [T] {
4150         let len = if T::IS_ZST {
4151             self.len().checked_mul(N).expect("slice len overflow")
4152         } else {
4153             // SAFETY: `self.len() * N` cannot overflow because `self` is
4154             // already in the address space.
4155             unsafe { self.len().unchecked_mul(N) }
4156         };
4157         // SAFETY: `[T]` is layout-identical to `[T; N]`
4158         unsafe { from_raw_parts_mut(self.as_mut_ptr().cast(), len) }
4159     }
4160 }
4161
4162 #[cfg(not(test))]
4163 impl [f32] {
4164     /// Sorts the slice of floats.
4165     ///
4166     /// This sort is in-place (i.e. does not allocate), *O*(*n* \* log(*n*)) worst-case, and uses
4167     /// the ordering defined by [`f32::total_cmp`].
4168     ///
4169     /// # Current implementation
4170     ///
4171     /// This uses the same sorting algorithm as [`sort_unstable_by`](slice::sort_unstable_by).
4172     ///
4173     /// # Examples
4174     ///
4175     /// ```
4176     /// #![feature(sort_floats)]
4177     /// let mut v = [2.6, -5e-8, f32::NAN, 8.29, f32::INFINITY, -1.0, 0.0, -f32::INFINITY, -0.0];
4178     ///
4179     /// v.sort_floats();
4180     /// let sorted = [-f32::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f32::INFINITY, f32::NAN];
4181     /// assert_eq!(&v[..8], &sorted[..8]);
4182     /// assert!(v[8].is_nan());
4183     /// ```
4184     #[unstable(feature = "sort_floats", issue = "93396")]
4185     #[inline]
4186     pub fn sort_floats(&mut self) {
4187         self.sort_unstable_by(f32::total_cmp);
4188     }
4189 }
4190
4191 #[cfg(not(test))]
4192 impl [f64] {
4193     /// Sorts the slice of floats.
4194     ///
4195     /// This sort is in-place (i.e. does not allocate), *O*(*n* \* log(*n*)) worst-case, and uses
4196     /// the ordering defined by [`f64::total_cmp`].
4197     ///
4198     /// # Current implementation
4199     ///
4200     /// This uses the same sorting algorithm as [`sort_unstable_by`](slice::sort_unstable_by).
4201     ///
4202     /// # Examples
4203     ///
4204     /// ```
4205     /// #![feature(sort_floats)]
4206     /// let mut v = [2.6, -5e-8, f64::NAN, 8.29, f64::INFINITY, -1.0, 0.0, -f64::INFINITY, -0.0];
4207     ///
4208     /// v.sort_floats();
4209     /// let sorted = [-f64::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f64::INFINITY, f64::NAN];
4210     /// assert_eq!(&v[..8], &sorted[..8]);
4211     /// assert!(v[8].is_nan());
4212     /// ```
4213     #[unstable(feature = "sort_floats", issue = "93396")]
4214     #[inline]
4215     pub fn sort_floats(&mut self) {
4216         self.sort_unstable_by(f64::total_cmp);
4217     }
4218 }
4219
4220 trait CloneFromSpec<T> {
4221     fn spec_clone_from(&mut self, src: &[T]);
4222 }
4223
4224 impl<T> CloneFromSpec<T> for [T]
4225 where
4226     T: Clone,
4227 {
4228     #[track_caller]
4229     default fn spec_clone_from(&mut self, src: &[T]) {
4230         assert!(self.len() == src.len(), "destination and source slices have different lengths");
4231         // NOTE: We need to explicitly slice them to the same length
4232         // to make it easier for the optimizer to elide bounds checking.
4233         // But since it can't be relied on we also have an explicit specialization for T: Copy.
4234         let len = self.len();
4235         let src = &src[..len];
4236         for i in 0..len {
4237             self[i].clone_from(&src[i]);
4238         }
4239     }
4240 }
4241
4242 impl<T> CloneFromSpec<T> for [T]
4243 where
4244     T: Copy,
4245 {
4246     #[track_caller]
4247     fn spec_clone_from(&mut self, src: &[T]) {
4248         self.copy_from_slice(src);
4249     }
4250 }
4251
4252 #[stable(feature = "rust1", since = "1.0.0")]
4253 #[rustc_const_unstable(feature = "const_default_impls", issue = "87864")]
4254 impl<T> const Default for &[T] {
4255     /// Creates an empty slice.
4256     fn default() -> Self {
4257         &[]
4258     }
4259 }
4260
4261 #[stable(feature = "mut_slice_default", since = "1.5.0")]
4262 #[rustc_const_unstable(feature = "const_default_impls", issue = "87864")]
4263 impl<T> const Default for &mut [T] {
4264     /// Creates a mutable empty slice.
4265     fn default() -> Self {
4266         &mut []
4267     }
4268 }
4269
4270 #[unstable(feature = "slice_pattern", reason = "stopgap trait for slice patterns", issue = "56345")]
4271 /// Patterns in slices - currently, only used by `strip_prefix` and `strip_suffix`.  At a future
4272 /// point, we hope to generalise `core::str::Pattern` (which at the time of writing is limited to
4273 /// `str`) to slices, and then this trait will be replaced or abolished.
4274 pub trait SlicePattern {
4275     /// The element type of the slice being matched on.
4276     type Item;
4277
4278     /// Currently, the consumers of `SlicePattern` need a slice.
4279     fn as_slice(&self) -> &[Self::Item];
4280 }
4281
4282 #[stable(feature = "slice_strip", since = "1.51.0")]
4283 impl<T> SlicePattern for [T] {
4284     type Item = T;
4285
4286     #[inline]
4287     fn as_slice(&self) -> &[Self::Item] {
4288         self
4289     }
4290 }
4291
4292 #[stable(feature = "slice_strip", since = "1.51.0")]
4293 impl<T, const N: usize> SlicePattern for [T; N] {
4294     type Item = T;
4295
4296     #[inline]
4297     fn as_slice(&self) -> &[Self::Item] {
4298         self
4299     }
4300 }