Skip to content

Commit 923c571

Browse files
committed
Add conversions from &T to &OrderedFloat<T>
Fixes #72.
1 parent f4f5d4c commit 923c571

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

src/lib.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,24 @@ impl<T: Float> AsMut<T> for OrderedFloat<T> {
6161
}
6262
}
6363

64+
impl<'a, T: Float> From<&'a T> for &'a OrderedFloat<T> {
65+
fn from(t: &'a T) -> &'a OrderedFloat<T> {
66+
// Safety: OrderedFloat is #[repr(transparent)] and has no invalid values.
67+
unsafe {
68+
&*(t as *const T as *const OrderedFloat<T>)
69+
}
70+
}
71+
}
72+
73+
impl<'a, T: Float> From<&'a mut T> for &'a mut OrderedFloat<T> {
74+
fn from(t: &'a mut T) -> &'a mut OrderedFloat<T> {
75+
// Safety: OrderedFloat is #[repr(transparent)] and has no invalid values.
76+
unsafe {
77+
&mut *(t as *mut T as *mut OrderedFloat<T>)
78+
}
79+
}
80+
}
81+
6482
impl<T: Float> PartialOrd for OrderedFloat<T> {
6583
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
6684
Some(self.cmp(other))

tests/test.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,3 +605,20 @@ fn not_nan_panic_safety() {
605605
assert!(!catch_op(not_nan(0.0), |a| *a /= 0.0).is_nan());
606606
assert!(!catch_op(not_nan(0.0), |a| *a %= 0.0).is_nan());
607607
}
608+
609+
#[test]
610+
fn from_ref() {
611+
let f = 1.0f32;
612+
let o: &OrderedFloat<f32> = (&f).into();
613+
assert_eq!(*o, 1.0f32);
614+
615+
let mut f = 1.0f64;
616+
let o: &OrderedFloat<f64> = (&f).into();
617+
assert_eq!(*o, 1.0f64);
618+
619+
let o: &mut OrderedFloat<f64> = (&mut f).into();
620+
assert_eq!(*o, 1.0f64);
621+
*o = OrderedFloat(2.0);
622+
assert_eq!(*o, 2.0f64);
623+
assert_eq!(f, 2.0f64);
624+
}

0 commit comments

Comments
 (0)