@@ -726,6 +726,67 @@ macro_rules! uint_impl {
|
726 | 726 | } |
727 | 727 | } |
728 | 728 | |
| 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 | + |
729 | 790 | /// Checked integer multiplication. Computes `self * rhs`, returning |
730 | 791 | /// `None` if overflow occurred. |
731 | 792 | /// |
|