core/slice/sort/shared/
mod.rs1#![cfg_attr(any(feature = "optimize_for_size", target_pointer_width = "16"), allow(dead_code))]
2
3use crate::marker::Freeze;
4
5pub(crate) mod pivot;
6pub(crate) mod smallsort;
7
8#[rustc_unsafe_specialization_marker]
11pub(crate) trait FreezeMarker {}
12
13impl<T: Freeze> FreezeMarker for T {}
14
15#[inline(always)]
20pub(crate) fn find_existing_run<T, F: FnMut(&T, &T) -> bool>(
21    v: &[T],
22    is_less: &mut F,
23) -> (usize, bool) {
24    let len = v.len();
25    if len < 2 {
26        return (len, false);
27    }
28
29    unsafe {
33        let mut run_len = 2;
34        let strictly_descending = is_less(v.get_unchecked(1), v.get_unchecked(0));
35        if strictly_descending {
36            while run_len < len && is_less(v.get_unchecked(run_len), v.get_unchecked(run_len - 1)) {
37                run_len += 1;
38            }
39        } else {
40            while run_len < len && !is_less(v.get_unchecked(run_len), v.get_unchecked(run_len - 1))
41            {
42                run_len += 1;
43            }
44        }
45        (run_len, strictly_descending)
46    }
47}