1use std::cmp::Ordering;
2
3use crate::float::IsFloat;
4
5#[inline]
6pub fn compare_fn_nan_min<T>(a: &T, b: &T) -> Ordering
8where
9 T: PartialOrd + IsFloat,
10{
11 if T::is_float() {
13 match (a.is_nan(), b.is_nan()) {
14 (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 unsafe { a.partial_cmp(b).unwrap_unchecked() }
24 }
25}
26
27#[inline]
28pub fn compare_fn_nan_max<T>(a: &T, b: &T) -> Ordering
30where
31 T: PartialOrd + IsFloat,
32{
33 if T::is_float() {
35 match (a.is_nan(), b.is_nan()) {
36 (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 unsafe { a.partial_cmp(b).unwrap_unchecked() }
46 }
47}