File tree Expand file tree Collapse file tree 2 files changed +35
-0
lines changed
Expand file tree Collapse file tree 2 files changed +35
-0
lines changed Original file line number Diff line number Diff 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+
6482impl < T : Float > PartialOrd for OrderedFloat < T > {
6583 fn partial_cmp ( & self , other : & Self ) -> Option < Ordering > {
6684 Some ( self . cmp ( other) )
Original file line number Diff line number Diff 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+ }
You can’t perform that action at this time.
0 commit comments