diff options
| author | Ohad Ravid <ohad.rv@gmail.com> | 2020-11-16 15:38:22 +0200 |
|---|---|---|
| committer | Ohad Ravid <ohad.rv@gmail.com> | 2020-12-17 18:41:47 +0200 |
| commit | 3f671bc94450aff38d7fcd9243327a20cb553ee0 (patch) | |
| tree | 5b90f71d1efc8577ec88743370a546aaf069c88c | |
| parent | caeb3335c052f286f6e7257ac0ff21e4f73fd8c5 (diff) | |
Added `impl Div<NonZeroU{0}> for u{0}` which cannot panic
| -rw-r--r-- | library/core/src/num/nonzero.rs | 30 | ||||
| -rw-r--r-- | library/core/tests/nonzero.rs | 8 |
2 files changed, 37 insertions, 1 deletions
diff --git a/library/core/src/num/nonzero.rs b/library/core/src/num/nonzero.rs index 716b4a90e5e..3355fb64ecf 100644 --- a/library/core/src/num/nonzero.rs +++ b/library/core/src/num/nonzero.rs @@ -1,7 +1,7 @@ //! Definitions of integer that is known not to equal zero. use crate::fmt; -use crate::ops::{BitOr, BitOrAssign}; +use crate::ops::{BitOr, BitOrAssign, Div}; use crate::str::FromStr; use super::from_str_radix; @@ -263,3 +263,31 @@ nonzero_leading_trailing_zeros! { NonZeroI128(u128), -1i128; NonZeroIsize(usize), -1isize; } + +macro_rules! nonzero_integers_div { + ( $( $Ty: ident($Int: ty); )+ ) => { + $( + #[stable(feature = "nonzero_div", since = "1.50.0")] + impl Div<$Ty> for $Int { + type Output = $Int; + /// This operation rounds towards zero, + /// truncating any fractional part of the exact result, and cannot panic. + #[inline] + fn div(self, other: $Ty) -> $Int { + // SAFETY: div by zero is checked because `other` is a nonzero, + // and MIN/-1 is checked because `self` is an unsigned int. + unsafe { crate::intrinsics::unchecked_div(self, other.get()) } + } + } + )+ + } +} + +nonzero_integers_div! { + NonZeroU8(u8); + NonZeroU16(u16); + NonZeroU32(u32); + NonZeroU64(u64); + NonZeroU128(u128); + NonZeroUsize(usize); +} diff --git a/library/core/tests/nonzero.rs b/library/core/tests/nonzero.rs index b66c482c5e5..6ec3a04adc0 100644 --- a/library/core/tests/nonzero.rs +++ b/library/core/tests/nonzero.rs @@ -312,3 +312,11 @@ fn nonzero_trailing_zeros() { const TRAILING_ZEROS: u32 = NonZeroU16::new(1 << 2).unwrap().trailing_zeros(); assert_eq!(TRAILING_ZEROS, 2); } + +#[test] +fn test_nonzero_uint_div() { + let nz = NonZeroU32::new(1).unwrap(); + + let x: u32 = 42u32 / nz; + assert_eq!(x, 42u32); +} |
