diff --git a/src/bigint.rs b/src/bigint.rs index c2fcdef7..b7578ad4 100644 --- a/src/bigint.rs +++ b/src/bigint.rs @@ -11,7 +11,7 @@ use core::ops::{Neg, Not}; use core::str; use num_integer::{Integer, Roots}; -use num_traits::{ConstZero, Num, One, Pow, Signed, Zero}; +use num_traits::{CheckedNeg, ConstZero, Num, One, Pow, Signed, Zero}; use self::Sign::{Minus, NoSign, Plus}; @@ -344,6 +344,13 @@ impl Neg for &BigInt { } } +impl CheckedNeg for BigInt { + #[inline] + fn checked_neg(&self) -> Option { + Some(self.neg()) + } +} + impl Integer for BigInt { #[inline] fn div_rem(&self, other: &BigInt) -> (BigInt, BigInt) { diff --git a/src/bigint/division.rs b/src/bigint/division.rs index 0d4d23f3..a7731236 100644 --- a/src/bigint/division.rs +++ b/src/bigint/division.rs @@ -6,7 +6,7 @@ use crate::{IsizePromotion, UsizePromotion}; use core::ops::{Div, DivAssign, Rem, RemAssign}; use num_integer::Integer; -use num_traits::{CheckedDiv, CheckedEuclid, Euclid, Signed, ToPrimitive, Zero}; +use num_traits::{CheckedDiv, CheckedEuclid, CheckedRem, Euclid, Signed, ToPrimitive, Zero}; forward_all_binop_to_ref_ref!(impl Div for BigInt, div); @@ -447,6 +447,16 @@ impl CheckedDiv for BigInt { } } +impl CheckedRem for BigInt { + #[inline] + fn checked_rem(&self, v: &BigInt) -> Option { + if v.is_zero() { + return None; + } + Some(self.rem(v)) + } +} + impl CheckedEuclid for BigInt { #[inline] fn checked_div_euclid(&self, v: &BigInt) -> Option { diff --git a/src/biguint/division.rs b/src/biguint/division.rs index 62bedd12..f79c2007 100644 --- a/src/biguint/division.rs +++ b/src/biguint/division.rs @@ -10,7 +10,7 @@ use core::cmp::Ordering::{Equal, Greater, Less}; use core::mem; use core::ops::{Div, DivAssign, Rem, RemAssign}; use num_integer::Integer; -use num_traits::{CheckedDiv, CheckedEuclid, Euclid, ToPrimitive, Zero}; +use num_traits::{CheckedDiv, CheckedEuclid, CheckedRem, Euclid, ToPrimitive, Zero}; pub(super) const FAST_DIV_WIDE: bool = cfg!(any(target_arch = "x86", target_arch = "x86_64")); @@ -784,6 +784,16 @@ impl CheckedDiv for BigUint { } } +impl CheckedRem for BigUint { + #[inline] + fn checked_rem(&self, v: &BigUint) -> Option { + if v.is_zero() { + return None; + } + Some(self.rem(v)) + } +} + impl CheckedEuclid for BigUint { #[inline] fn checked_div_euclid(&self, v: &BigUint) -> Option {