Skip to content

Commit e4cf02d

Browse files
authored
Implement AsPrimitive for OrderedFloat (#110)
1 parent 8962ffc commit e4cf02d

File tree

1 file changed

+47
-1
lines changed

1 file changed

+47
-1
lines changed

src/lib.rs

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
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;
2728
use num_traits::float::FloatCore as Float;
2829
#[cfg(feature = "std")]
2930
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+
};
3134

3235
// masks for the parts of the IEEE 754 float
3336
const 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+
455501
impl<T: FromPrimitive> FromPrimitive for OrderedFloat<T> {
456502
fn from_i64(n: i64) -> Option<Self> {
457503
T::from_i64(n).map(OrderedFloat)

0 commit comments

Comments
 (0)