Auto merge of #72717 - poliorcetics:try-from-int-to-nzint, r=dtolnay
Add TryFrom<{int}> for NonZero{int} Adds `TryFrom<{int}> for NonZero{int}`. It uses the existing `NonZero{int}::new()` and `Option::ok_or()` functions, meaning the checks are not repeated. I also added tests, I tried to follow the convention I saw in the test file. I also used `#[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")]`, but I have no idea if the feature/version are correctly named or even correct.
This commit is contained in:
commit
50fc24d8a1
@ -445,3 +445,42 @@ fn from(small: $Small) -> Self {
|
||||
nzint_impl_from! { NonZeroU32, NonZeroI64, #[stable(feature = "nz_int_conv", since = "1.41.0")] }
|
||||
nzint_impl_from! { NonZeroU32, NonZeroI128, #[stable(feature = "nz_int_conv", since = "1.41.0")] }
|
||||
nzint_impl_from! { NonZeroU64, NonZeroI128, #[stable(feature = "nz_int_conv", since = "1.41.0")] }
|
||||
|
||||
macro_rules! nzint_impl_try_from_int {
|
||||
($Int: ty, $NonZeroInt: ty, #[$attr:meta], $doc: expr) => {
|
||||
#[$attr]
|
||||
#[doc = $doc]
|
||||
impl TryFrom<$Int> for $NonZeroInt {
|
||||
type Error = TryFromIntError;
|
||||
|
||||
#[inline]
|
||||
fn try_from(value: $Int) -> Result<Self, Self::Error> {
|
||||
Self::new(value).ok_or(TryFromIntError(()))
|
||||
}
|
||||
}
|
||||
};
|
||||
($Int: ty, $NonZeroInt: ty, #[$attr:meta]) => {
|
||||
nzint_impl_try_from_int!($Int,
|
||||
$NonZeroInt,
|
||||
#[$attr],
|
||||
concat!("Attempts to convert `",
|
||||
stringify!($Int),
|
||||
"` to `",
|
||||
stringify!($NonZeroInt),
|
||||
"`."));
|
||||
}
|
||||
}
|
||||
|
||||
// Int -> Non-zero Int
|
||||
nzint_impl_try_from_int! { u8, NonZeroU8, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
|
||||
nzint_impl_try_from_int! { u16, NonZeroU16, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
|
||||
nzint_impl_try_from_int! { u32, NonZeroU32, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
|
||||
nzint_impl_try_from_int! { u64, NonZeroU64, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
|
||||
nzint_impl_try_from_int! { u128, NonZeroU128, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
|
||||
nzint_impl_try_from_int! { usize, NonZeroUsize, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
|
||||
nzint_impl_try_from_int! { i8, NonZeroI8, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
|
||||
nzint_impl_try_from_int! { i16, NonZeroI16, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
|
||||
nzint_impl_try_from_int! { i32, NonZeroI32, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
|
||||
nzint_impl_try_from_int! { i64, NonZeroI64, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
|
||||
nzint_impl_try_from_int! { i128, NonZeroI128, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
|
||||
nzint_impl_try_from_int! { isize, NonZeroIsize, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
|
||||
|
@ -1,3 +1,4 @@
|
||||
use core::convert::TryFrom;
|
||||
use core::num::{IntErrorKind, NonZeroI32, NonZeroI8, NonZeroU32, NonZeroU8};
|
||||
use core::option::Option::{self, None, Some};
|
||||
use std::mem::size_of;
|
||||
@ -176,3 +177,21 @@ fn test_nonzero_bitor_assign() {
|
||||
target |= 0;
|
||||
assert_eq!(target.get(), 0b1011_1111);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_nonzero_from_int_on_success() {
|
||||
assert_eq!(NonZeroU8::try_from(5), Ok(NonZeroU8::new(5).unwrap()));
|
||||
assert_eq!(NonZeroU32::try_from(5), Ok(NonZeroU32::new(5).unwrap()));
|
||||
|
||||
assert_eq!(NonZeroI8::try_from(-5), Ok(NonZeroI8::new(-5).unwrap()));
|
||||
assert_eq!(NonZeroI32::try_from(-5), Ok(NonZeroI32::new(-5).unwrap()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_nonzero_from_int_on_err() {
|
||||
assert!(NonZeroU8::try_from(0).is_err());
|
||||
assert!(NonZeroU32::try_from(0).is_err());
|
||||
|
||||
assert!(NonZeroI8::try_from(0).is_err());
|
||||
assert!(NonZeroI32::try_from(0).is_err());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user