Skip to content

Commit 8e37330

Browse files
authored
Rollup merge of #77339 - fusion-engineering-forks:tryfrom-nonzero-to-nonzero, r=dtolnay
Implement TryFrom between NonZero types. This will instantly be stable, as trait implementations for stable types and traits can not be `#[unstable]`. Closes #77258. @rustbot modify labels: +T-libs
2 parents b40ca64 + b9db54b commit 8e37330

File tree

1 file changed

+46
-0
lines changed
  • library/core/src/convert

1 file changed

+46
-0
lines changed

library/core/src/convert/num.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,3 +485,49 @@ nzint_impl_try_from_int! { i32, NonZeroI32, #[stable(feature = "nzint_try_from_i
485485
nzint_impl_try_from_int! { i64, NonZeroI64, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
486486
nzint_impl_try_from_int! { i128, NonZeroI128, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
487487
nzint_impl_try_from_int! { isize, NonZeroIsize, #[stable(feature = "nzint_try_from_int_conv", since = "1.46.0")] }
488+
489+
macro_rules! nzint_impl_try_from_nzint {
490+
($From:ty => $To:ty, $doc: expr) => {
491+
#[stable(feature = "nzint_try_from_nzint_conv", since = "1.49.0")]
492+
#[doc = $doc]
493+
impl TryFrom<$From> for $To {
494+
type Error = TryFromIntError;
495+
496+
#[inline]
497+
fn try_from(value: $From) -> Result<Self, Self::Error> {
498+
TryFrom::try_from(value.get()).map(|v| {
499+
// SAFETY: $From is a NonZero type, so v is not zero.
500+
unsafe { Self::new_unchecked(v) }
501+
})
502+
}
503+
}
504+
};
505+
($To:ty: $($From: ty),*) => {$(
506+
nzint_impl_try_from_nzint!(
507+
$From => $To,
508+
concat!(
509+
"Attempts to convert `",
510+
stringify!($From),
511+
"` to `",
512+
stringify!($To),
513+
"`.",
514+
)
515+
);
516+
)*};
517+
}
518+
519+
// Non-zero int -> non-zero unsigned int
520+
nzint_impl_try_from_nzint! { NonZeroU8: NonZeroI8, NonZeroU16, NonZeroI16, NonZeroU32, NonZeroI32, NonZeroU64, NonZeroI64, NonZeroU128, NonZeroI128, NonZeroUsize, NonZeroIsize }
521+
nzint_impl_try_from_nzint! { NonZeroU16: NonZeroI8, NonZeroI16, NonZeroU32, NonZeroI32, NonZeroU64, NonZeroI64, NonZeroU128, NonZeroI128, NonZeroUsize, NonZeroIsize }
522+
nzint_impl_try_from_nzint! { NonZeroU32: NonZeroI8, NonZeroI16, NonZeroI32, NonZeroU64, NonZeroI64, NonZeroU128, NonZeroI128, NonZeroUsize, NonZeroIsize }
523+
nzint_impl_try_from_nzint! { NonZeroU64: NonZeroI8, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroU128, NonZeroI128, NonZeroUsize, NonZeroIsize }
524+
nzint_impl_try_from_nzint! { NonZeroU128: NonZeroI8, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI128, NonZeroUsize, NonZeroIsize }
525+
nzint_impl_try_from_nzint! { NonZeroUsize: NonZeroI8, NonZeroI16, NonZeroU32, NonZeroI32, NonZeroU64, NonZeroI64, NonZeroU128, NonZeroI128, NonZeroIsize }
526+
527+
// Non-zero int -> non-zero signed int
528+
nzint_impl_try_from_nzint! { NonZeroI8: NonZeroU8, NonZeroU16, NonZeroI16, NonZeroU32, NonZeroI32, NonZeroU64, NonZeroI64, NonZeroU128, NonZeroI128, NonZeroUsize, NonZeroIsize }
529+
nzint_impl_try_from_nzint! { NonZeroI16: NonZeroU16, NonZeroU32, NonZeroI32, NonZeroU64, NonZeroI64, NonZeroU128, NonZeroI128, NonZeroUsize, NonZeroIsize }
530+
nzint_impl_try_from_nzint! { NonZeroI32: NonZeroU32, NonZeroU64, NonZeroI64, NonZeroU128, NonZeroI128, NonZeroUsize, NonZeroIsize }
531+
nzint_impl_try_from_nzint! { NonZeroI64: NonZeroU64, NonZeroU128, NonZeroI128, NonZeroUsize, NonZeroIsize }
532+
nzint_impl_try_from_nzint! { NonZeroI128: NonZeroU128, NonZeroUsize, NonZeroIsize }
533+
nzint_impl_try_from_nzint! { NonZeroIsize: NonZeroU16, NonZeroU32, NonZeroI32, NonZeroU64, NonZeroI64, NonZeroU128, NonZeroI128, NonZeroUsize }

0 commit comments

Comments
 (0)