use {
core::num::{NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroU128, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8},
crate::{Error, Number, Result},
};
#[cfg(any(target_pointer_width = "16", target_pointer_width = "32", target_pointer_width = "64"))]
use core::num::{NonZeroIsize, NonZeroUsize};
macro_rules! impl_from_non_zeros_for_number { ($($ty: ty),+$(,)?) => {
$(
impl From<&$ty> for Number {
fn from(n: &$ty) -> Self {
Self::from(n.get())
}
}
impl From<$ty> for Number {
fn from(n: $ty) -> Self {
Self::from(n.get())
}
}
)+
}}
impl_from_non_zeros_for_number!(
NonZeroU8, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU128,
NonZeroI8, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI128,
);
#[cfg(any(target_pointer_width = "16", target_pointer_width = "32", target_pointer_width = "64"))]
impl_from_non_zeros_for_number!(NonZeroUsize, NonZeroIsize);
macro_rules! impl_try_from_number_for_non_zeros { ($(($non_zero: ty, $ty: ty)),+$(,)?) => {
$(
impl TryFrom<&Number> for $non_zero {
type Error = Error;
fn try_from(n: &Number) -> Result<Self> {
Self::try_from(<$ty>::try_from(n)?).map_err(|e| err!("{e}"))
}
}
impl TryFrom<Number> for $non_zero {
type Error = Error;
fn try_from(n: Number) -> Result<Self> {
Self::try_from(&n)
}
}
)+
}}
impl_try_from_number_for_non_zeros!(
(NonZeroI8, i8), (NonZeroI16, i16), (NonZeroI32, i32), (NonZeroI64, i64), (NonZeroI128, i128), (NonZeroIsize, isize),
(NonZeroU8, u8), (NonZeroU16, u16), (NonZeroU32, u32), (NonZeroU64, u64), (NonZeroU128, u128), (NonZeroUsize, usize),
);