From 0f864310322e346a522c0c2fe7578e8d5a1f73fd Mon Sep 17 00:00:00 2001 From: Chris Tomlinson Date: Sat, 16 Nov 2019 22:32:09 +0000 Subject: [PATCH 1/2] Add From trait for NonZero ints to NonZero ints --- src/libcore/num/mod.rs | 57 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index b5d61a3fd4e7..9e336f02869b 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -134,6 +134,63 @@ macro_rules! from_str_radix_nzint_impl { from_str_radix_nzint_impl! { NonZeroU8 NonZeroU16 NonZeroU32 NonZeroU64 NonZeroU128 NonZeroUsize NonZeroI8 NonZeroI16 NonZeroI32 NonZeroI64 NonZeroI128 NonZeroIsize } +// Conversion traits for NonZero integer types to wider NonZero types +macro_rules! impl_nz_from_nz { + ($Small: ty, $Large: ty, $LargePrimitive: ty, #[$attr:meta], $doc: expr) => { + #[$attr] + #[doc = $doc] + impl From<$Small> for $Large { + #[inline] + fn from(small: $Small) -> $Large { + // we already know a NonZero will not contain a zero + unsafe { + <$Large>::new_unchecked(small.get() as $LargePrimitive) + } + } + } + }; + ($Small: ty, $Large: ty, $LargePrimitive: ty, #[$attr:meta]) => { + impl_nz_from_nz!($Small, + $Large, + $LargePrimitive, + #[$attr], + concat!("Converts `", + stringify!($Small), + "` to `", + stringify!($Large), + "` losslessly. + +```rust +let small = core::num::", stringify!($Small), "::new(5).unwrap(); +let big: core::num::", stringify!($Large), " = small.into(); +")); + } +} + +// NonZeroUnsigned -> NonZeroUnsigned wider +impl_nz_from_nz! { NonZeroU8, NonZeroU16, u16, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU8, NonZeroU32, u32, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU8, NonZeroU64, u64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU8, NonZeroU128, u128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU16, NonZeroU32, u32, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU16, NonZeroU64, u64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU16, NonZeroU128, u128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU32, NonZeroU64, u64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU32, NonZeroU128, u128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU64, NonZeroU128, u128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } + +// NonZeroSigned -> NonZeroSigned wider +impl_nz_from_nz! { NonZeroI8, NonZeroI16, i16, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI8, NonZeroI32, i32, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI8, NonZeroI64, i64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI8, NonZeroI128, i128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI16, NonZeroI32, i32, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI16, NonZeroI64, i64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI16, NonZeroI128, i128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI32, NonZeroI64, i64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI32, NonZeroI128, i128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI64, NonZeroI128, i128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } + /// Provides intentionally-wrapped arithmetic on `T`. /// /// Operations like `+` on `u32` values is intended to never overflow, From 5cc730c85d8f72fdc391e691b1b1cabf3fef8410 Mon Sep 17 00:00:00 2001 From: Chris Tomlinson Date: Sat, 16 Nov 2019 23:38:12 +0000 Subject: [PATCH 2/2] Fix tidy errors --- src/libcore/num/mod.rs | 62 ++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 9e336f02869b..f0a8b801ccd2 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -142,7 +142,7 @@ macro_rules! impl_nz_from_nz { impl From<$Small> for $Large { #[inline] fn from(small: $Small) -> $Large { - // we already know a NonZero will not contain a zero + // SAFETY: we already know a NonZero will not contain a zero unsafe { <$Large>::new_unchecked(small.get() as $LargePrimitive) } @@ -168,28 +168,48 @@ let big: core::num::", stringify!($Large), " = small.into(); } // NonZeroUnsigned -> NonZeroUnsigned wider -impl_nz_from_nz! { NonZeroU8, NonZeroU16, u16, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroU8, NonZeroU32, u32, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroU8, NonZeroU64, u64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroU8, NonZeroU128, u128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroU16, NonZeroU32, u32, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroU16, NonZeroU64, u64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroU16, NonZeroU128, u128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroU32, NonZeroU64, u64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroU32, NonZeroU128, u128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroU64, NonZeroU128, u128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU8, NonZeroU16, u16, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU8, NonZeroU32, u32, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU8, NonZeroU64, u64, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU8, NonZeroU128, u128, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU16, NonZeroU32, u32, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU16, NonZeroU64, u64, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU16, NonZeroU128, u128, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU32, NonZeroU64, u64, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU32, NonZeroU128, u128, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroU64, NonZeroU128, u128, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } // NonZeroSigned -> NonZeroSigned wider -impl_nz_from_nz! { NonZeroI8, NonZeroI16, i16, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroI8, NonZeroI32, i32, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroI8, NonZeroI64, i64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroI8, NonZeroI128, i128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroI16, NonZeroI32, i32, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroI16, NonZeroI64, i64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroI16, NonZeroI128, i128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroI32, NonZeroI64, i64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroI32, NonZeroI128, i128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } -impl_nz_from_nz! { NonZeroI64, NonZeroI128, i128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI8, NonZeroI16, i16, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI8, NonZeroI32, i32, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI8, NonZeroI64, i64, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI8, NonZeroI128, i128, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI16, NonZeroI32, i32, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI16, NonZeroI64, i64, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI16, NonZeroI128, i128, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI32, NonZeroI64, i64, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI32, NonZeroI128, i128, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } +impl_nz_from_nz! { NonZeroI64, NonZeroI128, i128, + #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] } /// Provides intentionally-wrapped arithmetic on `T`. ///