11#![ no_std]
22#![ cfg_attr( test, deny( warnings) ) ]
33#![ deny( missing_docs) ]
4+ #![ allow( clippy:: derive_partial_eq_without_eq) ]
45
56//! Wrappers for total order on Floats. See the [`OrderedFloat`] and [`NotNan`] docs for details.
67
@@ -27,7 +28,9 @@ use core::str::FromStr;
2728use num_traits:: float:: FloatCore as Float ;
2829#[ cfg( feature = "std" ) ]
2930pub use num_traits:: Float ;
30- use num_traits:: { Bounded , FromPrimitive , Num , NumCast , One , Signed , ToPrimitive , Zero } ;
31+ use num_traits:: {
32+ AsPrimitive , Bounded , FromPrimitive , Num , NumCast , One , Signed , ToPrimitive , Zero ,
33+ } ;
3134
3235// masks for the parts of the IEEE 754 float
3336const SIGN_MASK : u64 = 0x8000000000000000u64 ;
@@ -452,6 +455,49 @@ impl<T: NumCast> NumCast for OrderedFloat<T> {
452455 }
453456}
454457
458+ macro_rules! impl_as_primitive {
459+ ( @ ( OrderedFloat <$T: ty>) => $( #[ $cfg: meta] ) * impl ( OrderedFloat <$U: ty>) ) => {
460+ $( #[ $cfg] ) *
461+ impl AsPrimitive <OrderedFloat <$U>> for OrderedFloat <$T> {
462+ #[ inline] fn as_( self ) -> OrderedFloat <$U> { OrderedFloat ( self . 0 as $U) }
463+ }
464+ } ;
465+ ( @ ( $T: ty) => $( #[ $cfg: meta] ) * impl ( OrderedFloat <$U: ty>) ) => {
466+ $( #[ $cfg] ) *
467+ impl AsPrimitive <OrderedFloat <$U>> for $T {
468+ #[ inline] fn as_( self ) -> OrderedFloat <$U> { OrderedFloat ( self as $U) }
469+ }
470+ } ;
471+ ( @ ( OrderedFloat <$T: ty>) => $( #[ $cfg: meta] ) * impl ( $U: ty) ) => {
472+ $( #[ $cfg] ) *
473+ impl AsPrimitive <$U> for OrderedFloat <$T> {
474+ #[ inline] fn as_( self ) -> $U { self . 0 as $U }
475+ }
476+ } ;
477+ ( $T: tt => { $( $U: tt ) ,* } ) => { $(
478+ impl_as_primitive!( @ $T => impl $U) ;
479+ ) * } ;
480+ }
481+
482+ impl_as_primitive ! ( ( OrderedFloat <f32 >) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
483+ impl_as_primitive ! ( ( OrderedFloat <f64 >) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
484+
485+ impl_as_primitive ! ( ( u8 ) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
486+ impl_as_primitive ! ( ( i8 ) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
487+ impl_as_primitive ! ( ( u16 ) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
488+ impl_as_primitive ! ( ( i16 ) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
489+ impl_as_primitive ! ( ( u32 ) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
490+ impl_as_primitive ! ( ( i32 ) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
491+ impl_as_primitive ! ( ( u64 ) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
492+ impl_as_primitive ! ( ( i64 ) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
493+ impl_as_primitive ! ( ( usize ) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
494+ impl_as_primitive ! ( ( isize ) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
495+ impl_as_primitive ! ( ( f32 ) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
496+ impl_as_primitive ! ( ( f64 ) => { ( OrderedFloat <f32 >) , ( OrderedFloat <f64 >) } ) ;
497+
498+ impl_as_primitive ! ( ( OrderedFloat <f32 >) => { ( u8 ) , ( u16 ) , ( u32 ) , ( u64 ) , ( usize ) , ( i8 ) , ( i16 ) , ( i32 ) , ( i64 ) , ( isize ) , ( f32 ) , ( f64 ) } ) ;
499+ impl_as_primitive ! ( ( OrderedFloat <f64 >) => { ( u8 ) , ( u16 ) , ( u32 ) , ( u64 ) , ( usize ) , ( i8 ) , ( i16 ) , ( i32 ) , ( i64 ) , ( isize ) , ( f32 ) , ( f64 ) } ) ;
500+
455501impl < T : FromPrimitive > FromPrimitive for OrderedFloat < T > {
456502 fn from_i64 ( n : i64 ) -> Option < Self > {
457503 T :: from_i64 ( n) . map ( OrderedFloat )
0 commit comments