From a3e1c358b62f773616c8c7de21bc34f00702e6a8 Mon Sep 17 00:00:00 2001 From: Iago-lito Date: Thu, 15 Apr 2021 12:14:25 +0200 Subject: [PATCH] NonZero unchecked_add. --- library/core/src/num/nonzero.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/library/core/src/num/nonzero.rs b/library/core/src/num/nonzero.rs index 54c67bccdac..28bd8a90b18 100644 --- a/library/core/src/num/nonzero.rs +++ b/library/core/src/num/nonzero.rs @@ -351,6 +351,34 @@ macro_rules! nonzero_unsigned_operations { // so the result cannot be zero. unsafe { $Ty::new_unchecked(self.get().saturating_add(other)) } } + + /// Add an unsigned integer to a non-zero value, + /// assuming overflow cannot occur. + /// This results in undefined behaviour when + #[doc = concat!("`self + rhs > ", stringify!($Int), "::MAX`")] + #[doc = concat!(" or `self + rhs < ", stringify!($Int), "::MIN`.")] + /// + /// # Examples + /// + /// ``` + /// #![feature(nonzero_ops)] + /// # #![feature(try_trait)] + #[doc = concat!("# use std::num::", stringify!($Ty), ";")] + /// + /// # fn main() -> Result<(), std::option::NoneError> { + #[doc = concat!("let one = ", stringify!($Ty), "::new(1)?;")] + #[doc = concat!("let two = ", stringify!($Ty), "::new(2)?;")] + /// + /// assert_eq!(two, unsafe { one.unchecked_add(1) }); + /// # Ok(()) + /// # } + /// ``` + #[unstable(feature = "nonzero_ops", issue = "84186")] + #[inline] + pub unsafe fn unchecked_add(self, other: $Int) -> $Ty { + // SAFETY: The caller ensures there is no overflow. + unsafe { $Ty::new_unchecked(self.get().unchecked_add(other)) } + } } )+ }