File tree Expand file tree Collapse file tree 1 file changed +61
-0
lines changed Expand file tree Collapse file tree 1 file changed +61
-0
lines changed Original file line number Diff line number Diff line change @@ -726,6 +726,67 @@ macro_rules! uint_impl {
726726 }
727727 }
728728
729+ #[ doc = concat!(
730+ "Checked integer subtraction. Computes `self - rhs` and checks if the result fits into an [`" ,
731+ stringify!( $SignedT) , "`], returning `None` if overflow occurred."
732+ ) ]
733+ ///
734+ /// # Examples
735+ ///
736+ /// Basic usage:
737+ ///
738+ /// ```
739+ /// #![feature(unsigned_signed_diff)]
740+ #[ doc = concat!( "assert_eq!(10" , stringify!( $SelfT) , ".checked_signed_diff(2), Some(8));" ) ]
741+ #[ doc = concat!( "assert_eq!(2" , stringify!( $SelfT) , ".checked_signed_diff(10), Some(-8));" ) ]
742+ #[ doc = concat!(
743+ "assert_eq!(" ,
744+ stringify!( $SelfT) ,
745+ "::MAX.checked_signed_diff(" ,
746+ stringify!( $SignedT) ,
747+ "::MAX as " ,
748+ stringify!( $SelfT) ,
749+ "), None);"
750+ ) ]
751+ #[ doc = concat!(
752+ "assert_eq!((" ,
753+ stringify!( $SignedT) ,
754+ "::MAX as " ,
755+ stringify!( $SelfT) ,
756+ ").checked_signed_diff(" ,
757+ stringify!( $SelfT) ,
758+ "::MAX), Some(" ,
759+ stringify!( $SignedT) ,
760+ "::MIN));"
761+ ) ]
762+ #[ doc = concat!(
763+ "assert_eq!((" ,
764+ stringify!( $SignedT) ,
765+ "::MAX as " ,
766+ stringify!( $SelfT) ,
767+ " + 1).checked_signed_diff(0), None);"
768+ ) ]
769+ #[ doc = concat!(
770+ "assert_eq!(" ,
771+ stringify!( $SelfT) ,
772+ "::MAX.checked_signed_diff(" ,
773+ stringify!( $SelfT) ,
774+ "::MAX), Some(0));"
775+ ) ]
776+ /// ```
777+ #[ unstable( feature = "unsigned_signed_diff" , issue = "126041" ) ]
778+ #[ inline]
779+ pub const fn checked_signed_diff( self , rhs: Self ) -> Option <$SignedT> {
780+ let res = self . wrapping_sub( rhs) as $SignedT;
781+ let overflow = ( self >= rhs) == ( res < 0 ) ;
782+
783+ if !overflow {
784+ Some ( res)
785+ } else {
786+ None
787+ }
788+ }
789+
729790 /// Checked integer multiplication. Computes `self * rhs`, returning
730791 /// `None` if overflow occurred.
731792 ///
You can’t perform that action at this time.
0 commit comments