From 3dae86ec18b526baf7753383d636895ba5ca3574 Mon Sep 17 00:00:00 2001 From: Trevor Spiteri Date: Tue, 14 Jul 2020 09:11:58 +0200 Subject: [PATCH] implement num_traits checked ops --- src/impl_num_traits.rs | 125 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 1 deletion(-) diff --git a/src/impl_num_traits.rs b/src/impl_num_traits.rs index 1c26f3d..5d29c9f 100644 --- a/src/impl_num_traits.rs +++ b/src/impl_num_traits.rs @@ -21,7 +21,11 @@ use crate::{ FixedI128, FixedI16, FixedI32, FixedI64, FixedI8, FixedU128, FixedU16, FixedU32, FixedU64, FixedU8, }; -use num_traits::{Bounded, One, Zero}; +use num_traits::{ + Bounded, CheckedAdd, CheckedDiv, CheckedMul, CheckedNeg, CheckedRem, CheckedShl, CheckedShr, + CheckedSub, One, SaturatingAdd, SaturatingMul, SaturatingSub, WrappingAdd, WrappingMul, + WrappingNeg, WrappingShl, WrappingShr, WrappingSub, Zero, +}; macro_rules! impl_traits { ($Fixed:ident, $LeEqU:ident, $OneMaxFrac:ident) => { @@ -56,6 +60,125 @@ macro_rules! impl_traits { Self::from_bits(Self::from_bits(1).to_bits() << Frac::U32) } } + + impl CheckedAdd for $Fixed { + #[inline] + fn checked_add(&self, v: &Self) -> Option { + (*self).checked_add(*v) + } + } + + impl CheckedSub for $Fixed { + #[inline] + fn checked_sub(&self, v: &Self) -> Option { + (*self).checked_sub(*v) + } + } + + impl CheckedNeg for $Fixed { + #[inline] + fn checked_neg(&self) -> Option { + (*self).checked_neg() + } + } + + impl CheckedMul for $Fixed { + #[inline] + fn checked_mul(&self, v: &Self) -> Option { + (*self).checked_mul(*v) + } + } + + impl CheckedDiv for $Fixed { + #[inline] + fn checked_div(&self, v: &Self) -> Option { + (*self).checked_div(*v) + } + } + + impl CheckedRem for $Fixed { + #[inline] + fn checked_rem(&self, v: &Self) -> Option { + (*self).checked_rem(*v) + } + } + + impl CheckedShl for $Fixed { + #[inline] + fn checked_shl(&self, rhs: u32) -> Option { + (*self).checked_shl(rhs) + } + } + + impl CheckedShr for $Fixed { + #[inline] + fn checked_shr(&self, rhs: u32) -> Option { + (*self).checked_shr(rhs) + } + } + + impl SaturatingAdd for $Fixed { + #[inline] + fn saturating_add(&self, v: &Self) -> Self { + (*self).saturating_add(*v) + } + } + + impl SaturatingSub for $Fixed { + #[inline] + fn saturating_sub(&self, v: &Self) -> Self { + (*self).saturating_sub(*v) + } + } + + impl SaturatingMul for $Fixed { + #[inline] + fn saturating_mul(&self, v: &Self) -> Self { + (*self).saturating_mul(*v) + } + } + + impl WrappingAdd for $Fixed { + #[inline] + fn wrapping_add(&self, v: &Self) -> Self { + (*self).wrapping_add(*v) + } + } + + impl WrappingSub for $Fixed { + #[inline] + fn wrapping_sub(&self, v: &Self) -> Self { + (*self).wrapping_sub(*v) + } + } + + impl WrappingNeg for $Fixed { + #[inline] + fn wrapping_neg(&self) -> Self { + (*self).wrapping_neg() + } + } + + impl WrappingMul for $Fixed { + #[inline] + fn wrapping_mul(&self, v: &Self) -> Self { + (*self).wrapping_mul(*v) + } + } + + impl WrappingShl for $Fixed { + #[inline] + fn wrapping_shl(&self, rhs: u32) -> Self { + (*self).wrapping_shl(rhs) + } + } + + impl WrappingShr for $Fixed { + #[inline] + fn wrapping_shr(&self, rhs: u32) -> Self { + (*self).wrapping_shr(rhs) + } + } }; }