Added `impl Rem<NonZeroU{0}> for u{0}` which cannot panic

This commit is contained in:
Ohad Ravid 2020-11-18 07:48:03 +02:00
parent 3f671bc944
commit 1e9e30dc40
2 changed files with 21 additions and 1 deletions

View File

@ -1,7 +1,7 @@
//! Definitions of integer that is known not to equal zero.
use crate::fmt;
use crate::ops::{BitOr, BitOrAssign, Div};
use crate::ops::{BitOr, BitOrAssign, Div, Rem};
use crate::str::FromStr;
use super::from_str_radix;
@ -279,6 +279,18 @@ macro_rules! nonzero_integers_div {
unsafe { crate::intrinsics::unchecked_div(self, other.get()) }
}
}
#[stable(feature = "nonzero_div", since = "1.50.0")]
impl Rem<$Ty> for $Int {
type Output = $Int;
/// This operation satisfies `n % d == n - (n / d) * d`, and cannot panic.
#[inline]
fn rem(self, other: $Ty) -> $Int {
// SAFETY: rem by zero is checked because `other` is a nonzero,
// and MIN/-1 is checked because `self` is an unsigned int.
unsafe { crate::intrinsics::unchecked_rem(self, other.get()) }
}
}
)+
}
}

View File

@ -320,3 +320,11 @@ fn test_nonzero_uint_div() {
let x: u32 = 42u32 / nz;
assert_eq!(x, 42u32);
}
#[test]
fn test_nonzero_uint_rem() {
let nz = NonZeroU32::new(10).unwrap();
let x: u32 = 42u32 % nz;
assert_eq!(x, 2u32);
}