From c1cccb809d132111c79f1fdfaeaa2fb4b0246d59 Mon Sep 17 00:00:00 2001 From: LEXUGE Date: Thu, 5 Apr 2018 19:02:55 +0800 Subject: [PATCH] Add `CheckedRem` and `CheckedAbs` traits Also impl them for u8~size and i8~size --- src/ops/checked.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/ops/checked.rs b/src/ops/checked.rs index 020f649..7339020 100644 --- a/src/ops/checked.rs +++ b/src/ops/checked.rs @@ -90,6 +90,51 @@ checked_impl!(CheckedDiv, checked_div, i32); checked_impl!(CheckedDiv, checked_div, i64); checked_impl!(CheckedDiv, checked_div, isize); +// CheckedRem +pub trait CheckedRem: Sized + Rem { + fn checked_rem(&self, v: &Self) -> Option; +} + +checked_impl!(CheckedRem, checked_rem, u8); +checked_impl!(CheckedRem, checked_rem, u16); +checked_impl!(CheckedRem, checked_rem, u32); +checked_impl!(CheckedRem, checked_rem, u64); +checked_impl!(CheckedRem, checked_rem, usize); + +checked_impl!(CheckedRem, checked_rem, i8); +checked_impl!(CheckedRem, checked_rem, i16); +checked_impl!(CheckedRem, checked_rem, i32); +checked_impl!(CheckedRem, checked_rem, i64); +checked_impl!(CheckedRem, checked_rem, isize); + +macro_rules! checked_abs_impl { + ($t:ty) => { + impl CheckedAbs for $t { + #[inline] + fn checked_abs(self) -> Option<$t> { + <$t>::checked_abs(*self) + } + } + } +} + +// CheckedAbs +pub trait CheckedAbs: Sized { + fn checked_abs(&self) -> Option; +} + +checked_abs_impl!(u8); +checked_abs_impl!(u16); +checked_abs_impl!(u32); +checked_abs_impl!(u64); +checked_abs_impl!(usize); + +checked_abs_impl!(i8); +checked_abs_impl!(i16); +checked_abs_impl!(i32); +checked_abs_impl!(i64); +checked_abs_impl!(isize); + /// Performs a left shift that returns `None` on overflow. pub trait CheckedShl: Sized + Shl { /// Shifts a number to the left, checking for overflow. If overflow happens,