Skip to content

Commit ac3eb90

Browse files
committed
NonZero checked_mul.
1 parent 7e7b316 commit ac3eb90

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed

library/core/src/num/nonzero.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,64 @@ nonzero_signed_operations! {
641641
NonZeroIsize(isize) -> NonZeroUsize(usize);
642642
}
643643

644+
// A bunch of methods for both signed and unsigned nonzero types.
645+
macro_rules! nonzero_unsigned_signed_operations {
646+
( $( $Ty: ident($Int: ty); )+ ) => {
647+
$(
648+
impl $Ty {
649+
/// Multiply two non-zero integers together.
650+
/// Return [`None`] on overflow.
651+
///
652+
/// # Examples
653+
///
654+
/// ```
655+
/// #![feature(nonzero_ops)]
656+
/// # #![feature(try_trait)]
657+
#[doc = concat!("# use std::num::", stringify!($Ty), ";")]
658+
///
659+
/// # fn main() -> Result<(), std::option::NoneError> {
660+
#[doc = concat!("let two = ", stringify!($Ty), "::new(2)?;")]
661+
#[doc = concat!("let four = ", stringify!($Ty), "::new(4)?;")]
662+
#[doc = concat!("let max = ", stringify!($Ty), "::new(",
663+
stringify!($Int), "::MAX)?;")]
664+
///
665+
/// assert_eq!(Some(four), two.checked_mul(two));
666+
/// assert_eq!(None, max.checked_mul(two));
667+
/// # Ok(())
668+
/// # }
669+
/// ```
670+
#[unstable(feature = "nonzero_ops", issue = "84186")]
671+
#[inline]
672+
pub const fn checked_mul(self, other: $Ty) -> Option<$Ty> {
673+
if let Some(result) = self.get().checked_mul(other.get()) {
674+
// SAFETY: checked_mul returns None on overflow
675+
// and `other` is also non-null
676+
// so the result cannot be zero.
677+
Some(unsafe { $Ty::new_unchecked(result) })
678+
} else {
679+
None
680+
}
681+
}
682+
}
683+
)+
684+
}
685+
}
686+
687+
nonzero_unsigned_signed_operations! {
688+
NonZeroU8(u8);
689+
NonZeroU16(u16);
690+
NonZeroU32(u32);
691+
NonZeroU64(u64);
692+
NonZeroU128(u128);
693+
NonZeroUsize(usize);
694+
NonZeroI8(i8);
695+
NonZeroI16(i16);
696+
NonZeroI32(i32);
697+
NonZeroI64(i64);
698+
NonZeroI128(i128);
699+
NonZeroIsize(isize);
700+
}
701+
644702
macro_rules! nonzero_unsigned_is_power_of_two {
645703
( $( $Ty: ident )+ ) => {
646704
$(

0 commit comments

Comments
 (0)