Skip to content

Commit dddd3d8

Browse files
Geoff Allottmbrubeck
authored andcommitted
fix partialord implementation for orderedfloat
1 parent 1fb4393 commit dddd3d8

File tree

2 files changed

+63
-5
lines changed

2 files changed

+63
-5
lines changed

src/lib.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ const CANONICAL_ZERO_BITS: u64 = 0x0u64;
4141
///
4242
/// NaN is sorted as *greater* than all other values and *equal*
4343
/// to itself, in contradiction with the IEEE standard.
44-
#[derive(PartialOrd, Debug, Default, Clone, Copy)]
44+
#[derive(Debug, Default, Clone, Copy)]
4545
pub struct OrderedFloat<T: Float>(pub T);
4646

4747
impl<T: Float> OrderedFloat<T> {
@@ -66,13 +66,21 @@ impl<T: Float> AsMut<T> for OrderedFloat<T> {
6666
}
6767
}
6868

69+
impl<T: Float + PartialOrd> PartialOrd for OrderedFloat<T> {
70+
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
71+
Some(self.cmp(other))
72+
}
73+
}
74+
6975
impl<T: Float + PartialOrd> Ord for OrderedFloat<T> {
70-
fn cmp(&self, other: &OrderedFloat<T>) -> Ordering {
71-
match self.partial_cmp(&other) {
76+
fn cmp(&self, other: &Self) -> Ordering {
77+
let lhs = self.as_ref();
78+
let rhs = other.as_ref();
79+
match lhs.partial_cmp(&rhs) {
7280
Some(ordering) => ordering,
7381
None => {
74-
if self.as_ref().is_nan() {
75-
if other.as_ref().is_nan() {
82+
if lhs.is_nan() {
83+
if rhs.is_nan() {
7684
Ordering::Equal
7785
} else {
7886
Ordering::Greater

tests/test.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,31 @@ describe! ordered_float32 {
2626
assert_eq!(OrderedFloat(f32_nan).cmp(&OrderedFloat(-100000.0f32)), Greater);
2727
assert_eq!(OrderedFloat(-100.0f32).cmp(&OrderedFloat(Float::nan())), Less);
2828
}
29+
30+
it "should compare regular floats with comparison operators" {
31+
assert!(OrderedFloat(7.0f32) == OrderedFloat(7.0));
32+
assert!(OrderedFloat(7.0f32) <= OrderedFloat(7.0));
33+
assert!(OrderedFloat(7.0f32) >= OrderedFloat(7.0));
34+
assert!(OrderedFloat(8.0f32) > OrderedFloat(7.0));
35+
assert!(OrderedFloat(8.0f32) >= OrderedFloat(7.0));
36+
assert!(OrderedFloat(4.0f32) < OrderedFloat(7.0));
37+
assert!(OrderedFloat(4.0f32) <= OrderedFloat(7.0));
38+
}
39+
40+
it "should compare NaN with comparison operators" {
41+
let f32_nan: OrderedFloat<f32> = OrderedFloat(Float::nan());
42+
assert!(f32_nan == f32_nan);
43+
assert!(f32_nan <= f32_nan);
44+
assert!(f32_nan >= f32_nan);
45+
assert!(f32_nan > OrderedFloat(-100000.0f32));
46+
assert!(f32_nan >= OrderedFloat(-100000.0f32));
47+
assert!(OrderedFloat(-100.0f32) < f32_nan);
48+
assert!(OrderedFloat(-100.0f32) <= f32_nan);
49+
assert!(f32_nan > OrderedFloat(Float::infinity()));
50+
assert!(f32_nan >= OrderedFloat(Float::infinity()));
51+
assert!(f32_nan > OrderedFloat(Float::neg_infinity()));
52+
assert!(f32_nan >= OrderedFloat(Float::neg_infinity()));
53+
}
2954
}
3055

3156
describe! ordered_float64 {
@@ -41,6 +66,31 @@ describe! ordered_float64 {
4166
assert_eq!(OrderedFloat(f64_nan).cmp(&OrderedFloat(-100000.0f64)), Greater);
4267
assert_eq!(OrderedFloat(-100.0f64).cmp(&OrderedFloat(Float::nan())), Less);
4368
}
69+
70+
it "should compare regular floats with comparison operators" {
71+
assert!(OrderedFloat(7.0) == OrderedFloat(7.0));
72+
assert!(OrderedFloat(7.0) <= OrderedFloat(7.0));
73+
assert!(OrderedFloat(7.0) >= OrderedFloat(7.0));
74+
assert!(OrderedFloat(8.0) > OrderedFloat(7.0));
75+
assert!(OrderedFloat(8.0) >= OrderedFloat(7.0));
76+
assert!(OrderedFloat(4.0) < OrderedFloat(7.0));
77+
assert!(OrderedFloat(4.0) <= OrderedFloat(7.0));
78+
}
79+
80+
it "should compare NaN with comparison operators" {
81+
let f64_nan: OrderedFloat<f64> = OrderedFloat(Float::nan());
82+
assert!(f64_nan == f64_nan);
83+
assert!(f64_nan <= f64_nan);
84+
assert!(f64_nan >= f64_nan);
85+
assert!(f64_nan > OrderedFloat(-100000.0));
86+
assert!(f64_nan >= OrderedFloat(-100000.0));
87+
assert!(OrderedFloat(-100.0) < f64_nan);
88+
assert!(OrderedFloat(-100.0) <= f64_nan);
89+
assert!(f64_nan > OrderedFloat(Float::infinity()));
90+
assert!(f64_nan >= OrderedFloat(Float::infinity()));
91+
assert!(f64_nan > OrderedFloat(Float::neg_infinity()));
92+
assert!(f64_nan >= OrderedFloat(Float::neg_infinity()));
93+
}
4494
}
4595

4696
describe! not_nan32 {

0 commit comments

Comments
 (0)