Skip to content

Commit 5b86220

Browse files
author
Greg Echelberger
committed
feat: &OrderedFloat <op> &OrderedFloat impl workaround
1 parent 324b3e1 commit 5b86220

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

src/lib.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,16 @@ macro_rules! impl_ordered_float_binop {
454454
}
455455
}
456456

457+
// Work around for: https://github.com/reem/rust-ordered-float/issues/91
458+
impl<'a, T: $imp + Copy> $imp<Self> for &'a OrderedFloat<T> {
459+
type Output = OrderedFloat<T::Output>;
460+
461+
#[inline]
462+
fn $method(self, other: Self) -> Self::Output {
463+
OrderedFloat((self.0).$method(other.0))
464+
}
465+
}
466+
457467
impl<T: $imp> $imp<T> for OrderedFloat<T> {
458468
type Output = OrderedFloat<T::Output>;
459469

tests/test.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,7 @@ fn add() {
659659
assert_eq!(OrderedFloat(0.0) + OrderedFloat(0.0), 0.0);
660660
assert_eq!(OrderedFloat(0.0) + &OrderedFloat(0.0), 0.0);
661661
assert_eq!(&OrderedFloat(0.0) + OrderedFloat(0.0), 0.0);
662+
assert_eq!(&OrderedFloat(0.0) + &OrderedFloat(0.0), 0.0);
662663
assert_eq!(OrderedFloat(0.0) + 0.0, 0.0);
663664
assert_eq!(OrderedFloat(0.0) + &0.0, 0.0);
664665
assert_eq!(&OrderedFloat(0.0) + 0.0, 0.0);
@@ -858,6 +859,36 @@ fn test_pow_fails_on_nan() {
858859
a.pow(b);
859860
}
860861

862+
863+
#[test]
864+
fn test_ref_ref_binop_regression() {
865+
// repro from:
866+
// https://github.com/reem/rust-ordered-float/issues/91
867+
//
868+
// impl<'a, T> $imp<Self> for &'a OrderedFloat<T>
869+
// where
870+
// &'a T: $imp
871+
// {
872+
// type Output = OrderedFloat<<&'a T as $imp>::Output>;
873+
// #[inline]
874+
// fn $method(self, other: Self) -> Self::Output {
875+
// OrderedFloat((self.0).$method(&other.0))
876+
// }
877+
// }
878+
fn regression<T>(p: T) -> T
879+
where
880+
for<'a> &'a T: std::ops::Sub<&'a T, Output = T>,
881+
{
882+
&p - &p
883+
}
884+
885+
assert_eq!(regression(0.0_f64), 0.0);
886+
887+
let x = OrderedFloat(50.0);
888+
let y = OrderedFloat(40.0);
889+
assert_eq!(&x - &y, OrderedFloat(10.0));
890+
}
891+
861892
#[cfg(feature = "arbitrary")]
862893
mod arbitrary_test {
863894
use super::{NotNan, OrderedFloat};

0 commit comments

Comments
 (0)