Skip to content

Commit 0f86431

Browse files
committed
Add From trait for NonZero ints to NonZero ints
1 parent 5f00849 commit 0f86431

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

src/libcore/num/mod.rs

+57
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,63 @@ macro_rules! from_str_radix_nzint_impl {
134134
from_str_radix_nzint_impl! { NonZeroU8 NonZeroU16 NonZeroU32 NonZeroU64 NonZeroU128 NonZeroUsize
135135
NonZeroI8 NonZeroI16 NonZeroI32 NonZeroI64 NonZeroI128 NonZeroIsize }
136136

137+
// Conversion traits for NonZero integer types to wider NonZero types
138+
macro_rules! impl_nz_from_nz {
139+
($Small: ty, $Large: ty, $LargePrimitive: ty, #[$attr:meta], $doc: expr) => {
140+
#[$attr]
141+
#[doc = $doc]
142+
impl From<$Small> for $Large {
143+
#[inline]
144+
fn from(small: $Small) -> $Large {
145+
// we already know a NonZero will not contain a zero
146+
unsafe {
147+
<$Large>::new_unchecked(small.get() as $LargePrimitive)
148+
}
149+
}
150+
}
151+
};
152+
($Small: ty, $Large: ty, $LargePrimitive: ty, #[$attr:meta]) => {
153+
impl_nz_from_nz!($Small,
154+
$Large,
155+
$LargePrimitive,
156+
#[$attr],
157+
concat!("Converts `",
158+
stringify!($Small),
159+
"` to `",
160+
stringify!($Large),
161+
"` losslessly.
162+
163+
```rust
164+
let small = core::num::", stringify!($Small), "::new(5).unwrap();
165+
let big: core::num::", stringify!($Large), " = small.into();
166+
"));
167+
}
168+
}
169+
170+
// NonZeroUnsigned -> NonZeroUnsigned wider
171+
impl_nz_from_nz! { NonZeroU8, NonZeroU16, u16, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
172+
impl_nz_from_nz! { NonZeroU8, NonZeroU32, u32, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
173+
impl_nz_from_nz! { NonZeroU8, NonZeroU64, u64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
174+
impl_nz_from_nz! { NonZeroU8, NonZeroU128, u128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
175+
impl_nz_from_nz! { NonZeroU16, NonZeroU32, u32, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
176+
impl_nz_from_nz! { NonZeroU16, NonZeroU64, u64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
177+
impl_nz_from_nz! { NonZeroU16, NonZeroU128, u128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
178+
impl_nz_from_nz! { NonZeroU32, NonZeroU64, u64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
179+
impl_nz_from_nz! { NonZeroU32, NonZeroU128, u128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
180+
impl_nz_from_nz! { NonZeroU64, NonZeroU128, u128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
181+
182+
// NonZeroSigned -> NonZeroSigned wider
183+
impl_nz_from_nz! { NonZeroI8, NonZeroI16, i16, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
184+
impl_nz_from_nz! { NonZeroI8, NonZeroI32, i32, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
185+
impl_nz_from_nz! { NonZeroI8, NonZeroI64, i64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
186+
impl_nz_from_nz! { NonZeroI8, NonZeroI128, i128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
187+
impl_nz_from_nz! { NonZeroI16, NonZeroI32, i32, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
188+
impl_nz_from_nz! { NonZeroI16, NonZeroI64, i64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
189+
impl_nz_from_nz! { NonZeroI16, NonZeroI128, i128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
190+
impl_nz_from_nz! { NonZeroI32, NonZeroI64, i64, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
191+
impl_nz_from_nz! { NonZeroI32, NonZeroI128, i128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
192+
impl_nz_from_nz! { NonZeroI64, NonZeroI128, i128, #[unstable(feature = "nonzero_int_to_wider_nonzero_int_lossless_conv", issue = "66196")] }
193+
137194
/// Provides intentionally-wrapped arithmetic on `T`.
138195
///
139196
/// Operations like `+` on `u32` values is intended to never overflow,

0 commit comments

Comments
 (0)