polars_utils/
ord.rs

1use std::cmp::Ordering;
2
3use crate::float::IsFloat;
4
5#[inline]
6/// NaN will be smaller than every valid value
7pub fn compare_fn_nan_min<T>(a: &T, b: &T) -> Ordering
8where
9    T: PartialOrd + IsFloat,
10{
11    // this branch should be optimized away for integers
12    if T::is_float() {
13        match (a.is_nan(), b.is_nan()) {
14            // SAFETY: we checked nans
15            (false, false) => unsafe { a.partial_cmp(b).unwrap_unchecked() },
16            (true, true) => Ordering::Equal,
17            (true, false) => Ordering::Less,
18            (false, true) => Ordering::Greater,
19        }
20    } else {
21        // SAFETY:
22        // all integers are Ord
23        unsafe { a.partial_cmp(b).unwrap_unchecked() }
24    }
25}
26
27#[inline]
28/// NaN will be larger than every valid value
29pub fn compare_fn_nan_max<T>(a: &T, b: &T) -> Ordering
30where
31    T: PartialOrd + IsFloat,
32{
33    // this branch should be optimized away for integers
34    if T::is_float() {
35        match (a.is_nan(), b.is_nan()) {
36            // SAFETY: we checked nans
37            (false, false) => unsafe { a.partial_cmp(b).unwrap_unchecked() },
38            (true, true) => Ordering::Equal,
39            (true, false) => Ordering::Greater,
40            (false, true) => Ordering::Less,
41        }
42    } else {
43        // SAFETY:
44        // all integers are Ord
45        unsafe { a.partial_cmp(b).unwrap_unchecked() }
46    }
47}