Skip to content

Commit 184a381

Browse files
Geoff Allottmbrubeck
authored andcommitted
fix partialord implementation for orderedfloat
1 parent 87048b1 commit 184a381

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
@@ -30,7 +30,7 @@ const CANONICAL_ZERO_BITS: u64 = 0x0u64;
3030
///
3131
/// NaN is sorted as *greater* than all other values and *equal*
3232
/// to itself, in contradiction with the IEEE standard.
33-
#[derive(PartialOrd, Debug, Default, Clone, Copy)]
33+
#[derive(Debug, Default, Clone, Copy)]
3434
pub struct OrderedFloat<T: Float>(pub T);
3535

3636
impl<T: Float> OrderedFloat<T> {
@@ -55,13 +55,21 @@ impl<T: Float> AsMut<T> for OrderedFloat<T> {
5555
}
5656
}
5757

58+
impl<T: Float + PartialOrd> PartialOrd for OrderedFloat<T> {
59+
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
60+
Some(self.cmp(other))
61+
}
62+
}
63+
5864
impl<T: Float + PartialOrd> Ord for OrderedFloat<T> {
59-
fn cmp(&self, other: &OrderedFloat<T>) -> Ordering {
60-
match self.partial_cmp(&other) {
65+
fn cmp(&self, other: &Self) -> Ordering {
66+
let lhs = self.as_ref();
67+
let rhs = other.as_ref();
68+
match lhs.partial_cmp(&rhs) {
6169
Some(ordering) => ordering,
6270
None => {
63-
if self.as_ref().is_nan() {
64-
if other.as_ref().is_nan() {
71+
if lhs.is_nan() {
72+
if rhs.is_nan() {
6573
Ordering::Equal
6674
} else {
6775
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)