1
1
#![ no_std]
2
2
#![ cfg_attr( test, deny( warnings) ) ]
3
3
#![ deny( missing_docs) ]
4
+ #![ allow( clippy:: derive_partial_eq_without_eq) ]
4
5
5
6
//! Wrappers for total order on Floats. See the [`OrderedFloat`] and [`NotNan`] docs for details.
6
7
@@ -27,7 +28,9 @@ use core::str::FromStr;
27
28
use num_traits:: float:: FloatCore as Float ;
28
29
#[ cfg( feature = "std" ) ]
29
30
pub 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
+ } ;
31
34
32
35
// masks for the parts of the IEEE 754 float
33
36
const SIGN_MASK : u64 = 0x8000000000000000u64 ;
@@ -452,6 +455,49 @@ impl<T: NumCast> NumCast for OrderedFloat<T> {
452
455
}
453
456
}
454
457
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
+
455
501
impl < T : FromPrimitive > FromPrimitive for OrderedFloat < T > {
456
502
fn from_i64 ( n : i64 ) -> Option < Self > {
457
503
T :: from_i64 ( n) . map ( OrderedFloat )
0 commit comments