1#[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#[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
15pub trait SinglePrecision: Sized {}
17impl SinglePrecision for u32 {}
19impl SinglePrecision for i32 {}
21
22#[derive(Debug, Copy, Clone, PartialEq)]
24pub enum Trend {
25 Ascending,
26 Descending,
27}
28
29#[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}