sorted_rs/simd/
mod.rs

1/// sse part
2#[cfg(feature = "use-avx2")]
3pub use avx2::is_sorted_avx2 as is_sorted;
4#[cfg(feature = "use-avx2")]
5pub use avx2::is_sorted_avx2_unroll4 as is_sorted_unroll4;
6/// avx part
7#[cfg(feature = "use-sse")]
8pub use sse::is_sorted_sse as is_sorted;
9#[cfg(feature = "use-sse")]
10pub use sse::is_sorted_sse_unroll4 as is_sorted_unroll4;
11
12mod avx2;
13mod sse;
14
15/// marker trait for inputs limitation
16pub trait SinglePrecision: Sized {}
17/// u32 is valid
18impl SinglePrecision for u32 {}
19/// i32 is valid
20impl SinglePrecision for i32 {}
21
22/// `Trend` is used to describe the trending of input which u want to check
23#[derive(Debug, Copy, Clone, PartialEq)]
24pub enum Trend {
25    Ascending,
26    Descending,
27}
28
29/// `is_sorted_scalar` a generic impls `is_sorted`
30#[inline]
31fn is_sorted_scalar<N: num::Integer, T: AsRef<[N]>>(
32    a: T,
33    len: usize,
34    mut index: usize,
35    trend: Trend,
36) -> bool {
37    let compare = match trend {
38        Trend::Ascending => |a: &N, b: &N| a > b,
39        Trend::Descending => |a: &N, b: &N| a < b,
40    };
41    let a = a.as_ref();
42    while index + 1 < len {
43        if compare(&a[index], &a[index + 1]) {
44            return false;
45        }
46        index += 1;
47    }
48    true
49}