diff --git a/src/convert.rs b/src/convert.rs index ffc405e..d1c76e6 100644 --- a/src/convert.rs +++ b/src/convert.rs @@ -578,6 +578,47 @@ fixed_to_int! { (FixedU64, FixedI64) -> wider (u128, i128) } fixed_to_int! { (FixedU128, FixedI128) -> (u128, i128) } +macro_rules! fixed_to_int_lossless { + ($Src:ty, $Dst:ident) => { + impl LosslessTryFrom<$Src> for $Dst { + /// Converts a fixed-point number to an integer. + /// + /// This conversion may fail (fallible) but cannot lose + /// any fractional bits (lossless). + #[inline] + fn lossless_try_from(src: $Src) -> Option { + $Dst::checked_from_fixed(src) + } + } + }; + + ($Src:ty) => { + fixed_to_int_lossless! { $Src, i8 } + fixed_to_int_lossless! { $Src, i16 } + fixed_to_int_lossless! { $Src, i32 } + fixed_to_int_lossless! { $Src, i64 } + fixed_to_int_lossless! { $Src, i128 } + fixed_to_int_lossless! { $Src, isize } + fixed_to_int_lossless! { $Src, u8 } + fixed_to_int_lossless! { $Src, u16 } + fixed_to_int_lossless! { $Src, u32 } + fixed_to_int_lossless! { $Src, u64 } + fixed_to_int_lossless! { $Src, u128 } + fixed_to_int_lossless! { $Src, usize } + }; +} + +fixed_to_int_lossless! { FixedI8} +fixed_to_int_lossless! { FixedI16} +fixed_to_int_lossless! { FixedI32} +fixed_to_int_lossless! { FixedI64} +fixed_to_int_lossless! { FixedI128} +fixed_to_int_lossless! { FixedU8} +fixed_to_int_lossless! { FixedU16} +fixed_to_int_lossless! { FixedU32} +fixed_to_int_lossless! { FixedU64} +fixed_to_int_lossless! { FixedU128} + macro_rules! fixed_to_int_lossy { ( ($SrcU:ident, $SrcI:ident, $SrcBits:ident, $SrcLeEqU:ident) ->