diff --git a/src/core/utils/math.rs b/src/core/utils/math.rs index a08cb206..ed157daf 100644 --- a/src/core/utils/math.rs +++ b/src/core/utils/math.rs @@ -1,10 +1,11 @@ mod expected; +mod tried; use std::{cmp, convert::TryFrom}; pub use checked_ops::checked_ops; -pub use self::expected::Expected; +pub use self::{expected::Expected, tried::Tried}; use crate::{debug::type_name, err, Err, Error, Result}; /// Checked arithmetic expression. Returns a Result diff --git a/src/core/utils/math/tried.rs b/src/core/utils/math/tried.rs new file mode 100644 index 00000000..2006d2d5 --- /dev/null +++ b/src/core/utils/math/tried.rs @@ -0,0 +1,47 @@ +use num_traits::ops::checked::{CheckedAdd, CheckedDiv, CheckedMul, CheckedRem, CheckedSub}; + +use crate::{checked, Result}; + +pub trait Tried { + #[inline] + fn try_add(self, rhs: Self) -> Result + where + Self: CheckedAdd + Sized, + { + checked!(self + rhs) + } + + #[inline] + fn try_sub(self, rhs: Self) -> Result + where + Self: CheckedSub + Sized, + { + checked!(self - rhs) + } + + #[inline] + fn try_mul(self, rhs: Self) -> Result + where + Self: CheckedMul + Sized, + { + checked!(self * rhs) + } + + #[inline] + fn try_div(self, rhs: Self) -> Result + where + Self: CheckedDiv + Sized, + { + checked!(self / rhs) + } + + #[inline] + fn try_rem(self, rhs: Self) -> Result + where + Self: CheckedRem + Sized, + { + checked!(self % rhs) + } +} + +impl Tried for T {}