Rollup merge of #126042 - davidzeng0:master, r=Amanieu
Implement `unsigned_signed_diff` <!-- If this PR is related to an unstable feature or an otherwise tracked effort, please link to the relevant tracking issue here. If you don't know of a related tracking issue or there are none, feel free to ignore this. This PR will get automatically assigned to a reviewer. In case you would like a specific user to review your work, you can assign it to them by using r? <reviewer name> --> Implements https://github.com/rust-lang/rust/issues/126041
This commit is contained in:
commit
7fac549ff1
1 changed files with 61 additions and 0 deletions
|
@ -765,6 +765,67 @@ macro_rules! uint_impl {
|
|||
}
|
||||
}
|
||||
|
||||
#[doc = concat!(
|
||||
"Checked integer subtraction. Computes `self - rhs` and checks if the result fits into an [`",
|
||||
stringify!($SignedT), "`], returning `None` if overflow occurred."
|
||||
)]
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(unsigned_signed_diff)]
|
||||
#[doc = concat!("assert_eq!(10", stringify!($SelfT), ".checked_signed_diff(2), Some(8));")]
|
||||
#[doc = concat!("assert_eq!(2", stringify!($SelfT), ".checked_signed_diff(10), Some(-8));")]
|
||||
#[doc = concat!(
|
||||
"assert_eq!(",
|
||||
stringify!($SelfT),
|
||||
"::MAX.checked_signed_diff(",
|
||||
stringify!($SignedT),
|
||||
"::MAX as ",
|
||||
stringify!($SelfT),
|
||||
"), None);"
|
||||
)]
|
||||
#[doc = concat!(
|
||||
"assert_eq!((",
|
||||
stringify!($SignedT),
|
||||
"::MAX as ",
|
||||
stringify!($SelfT),
|
||||
").checked_signed_diff(",
|
||||
stringify!($SelfT),
|
||||
"::MAX), Some(",
|
||||
stringify!($SignedT),
|
||||
"::MIN));"
|
||||
)]
|
||||
#[doc = concat!(
|
||||
"assert_eq!((",
|
||||
stringify!($SignedT),
|
||||
"::MAX as ",
|
||||
stringify!($SelfT),
|
||||
" + 1).checked_signed_diff(0), None);"
|
||||
)]
|
||||
#[doc = concat!(
|
||||
"assert_eq!(",
|
||||
stringify!($SelfT),
|
||||
"::MAX.checked_signed_diff(",
|
||||
stringify!($SelfT),
|
||||
"::MAX), Some(0));"
|
||||
)]
|
||||
/// ```
|
||||
#[unstable(feature = "unsigned_signed_diff", issue = "126041")]
|
||||
#[inline]
|
||||
pub const fn checked_signed_diff(self, rhs: Self) -> Option<$SignedT> {
|
||||
let res = self.wrapping_sub(rhs) as $SignedT;
|
||||
let overflow = (self >= rhs) == (res < 0);
|
||||
|
||||
if !overflow {
|
||||
Some(res)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
/// Checked integer multiplication. Computes `self * rhs`, returning
|
||||
/// `None` if overflow occurred.
|
||||
///
|
||||
|
|
Loading…
Add table
Reference in a new issue