@@ -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+
644702macro_rules! nonzero_unsigned_is_power_of_two {
645703 ( $( $Ty: ident ) + ) => {
646704 $(
0 commit comments