#[cfg(feature = "try_from")]
macro_rules! try_from_integer {
(int for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_integer![@int for: $for + $for_b, from: $from + $from_b]; )+
};
(@int for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Ok(Self(f.0.try_into()?))
});
};
(int_non0 for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_integer![@int_non0 for: $for + $for_b, from: $from + $from_b]; )+
};
(@int_non0 for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Ok(Self::new(f.0.try_into()?).unwrap())
});
};
(neg_signed
for: $for:ident + $p:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_integer![@neg_signed for: $for + $p + $for_b, from: $from + $from_b]; )+
};
(@neg_signed for: $for:ident + $p:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
devela::paste! {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Ok(Self(TryInto::<[<$p$for_b>]>::try_into(f.0)?.neg()))
});
}
};
(non0_int for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_integer![@non0_int for: $for + $for_b, from: $from + $from_b]; )+
};
(@non0_int for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Self::new(f.0.try_into()?)
});
};
(negnon0_non0 for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_integer![@negnon0_non0 for: $for + $for_b, from: $from + $from_b]; )+
};
(@negnon0_non0 for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Ok(Self::new(f.0.try_into()?)?.neg())
});
};
(non0 for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_integer![@non0 for: $for + $for_b, from: $from + $from_b]; )+
};
(@non0 for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
#[cfg(feature = "safe")]
return Self::from_innermost_repr(f.0.get().try_into()?);
#[cfg(not(feature = "safe"))]
return Ok(unsafe { Self::from_innermost_repr_unchecked(f.0.get().try_into()?) });
});
};
(negnon0_signed
for: $for:ident + $p:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_integer![@negnon0_signed for: $for + $p + $for_b, from: $from + $from_b]; )+
};
(@negnon0_signed
for: $for:ident + $p:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
devela::paste! {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
#[cfg(feature = "safe")]
return Self::from_innermost_repr(TryInto::<[<$p$for_b>]>::try_into(f.0.get())?.neg());
#[cfg(not(feature = "safe"))]
return unsafe {
Ok(Self::from_innermost_repr_unchecked(
TryInto::<[<$p$for_b>]>::try_into(f.0.get())?.neg()
))
};
});
}
};
(neg_int for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_integer![@neg_int for: $for + $for_b, from: $from + $from_b]; )+
};
(@neg_int for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Ok(Self((-f.0).try_into()?))
});
};
(negnon0_int for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_integer![@negnon0_int for: $for + $for_b, from: $from + $from_b]; )+
};
(@negnon0_int for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Self::new_neg((-f.0).try_into()?)
});
};
(non0_pos for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_integer![@non0_pos for: $for + $for_b, from: $from + $from_b]; )+
};
(@non0_pos for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
#[cfg(feature = "safe")]
return Self::from_inner_repr((-f.0.get()).try_into()?);
#[cfg(not(feature = "safe"))]
return Ok(unsafe { Self::from_inner_repr_unchecked((-f.0.get()).try_into()?) });
});
};
(neg_non0neg for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_integer![@neg->non0_neg for: $for + $for_b, from: $from + $from_b]; )+
};
(@neg->non0_neg for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Self::new_neg((f.0).try_into()?)
});
};
(neg_non0 for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_integer![@neg_non0 for: $for + $for_b, from: $from + $from_b]; )+
};
(@neg_non0 for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Self::new_neg((-f.0.get()).try_into()?)
});
};
}
#[cfg(not(feature = "try_from"))]
macro_rules! try_from_integer {
($($tt:tt)*) => {};
}
pub(crate) use try_from_integer;
#[cfg(feature = "try_from")]
macro_rules! try_from_primitive {
(int for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_primitive![@int for: $for + $for_b, from: $from + $from_b]; )+
};
(@int for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: $from+$from_b, arg:f, body: {
Self::from_innermost_repr(f.try_into()?)
});
$crate::all::impl_from!(try for: $for+$for_b, from: &$from+$from_b, arg:f, body: {
Self::from_innermost_repr((*f).try_into()?)
});
};
(non0 for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_primitive![@non0 for: $for + $for_b, from: $from + $from_b]; )+
};
(@non0 for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
#[cfg(feature = "safe")]
return Self::from_innermost_repr(f.get().try_into()?);
#[cfg(not(feature = "safe"))]
return Ok(unsafe { Self::from_innermost_repr_unchecked(f.get().try_into()?) });
});
};
(non0_pos for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_primitive![@non0_pos for: $for + $for_b, from: $from + $from_b]; )+
};
(@non0_pos for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
#[cfg(feature = "safe")]
return Self::from_inner_repr((-f.get()).try_into()?);
#[cfg(not(feature = "safe"))]
return Ok(unsafe { Self::from_inner_repr_unchecked((-f.get()).try_into()?) });
});
};
(neg_int for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_primitive![@neg_int for: $for + $for_b, from: $from + $from_b]; )+
};
(@neg_int for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: $from+$from_b, arg:f, body: {
Self::from_innermost_repr((-f).try_into()?)
});
$crate::all::impl_from!(try for: $for+$for_b, from: &$from+$from_b, arg:f, body: {
Self::from_innermost_repr((-*f).try_into()?)
});
};
(negnon0_int for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_primitive![@neg_int for: $for + $for_b, from: $from + $from_b]; )+
};
(@negnon0_int for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: $from+$from_b, arg:f, body: {
Self::new_neg((-f).try_into()?)
});
$crate::all::impl_from!(try for: $for+$for_b, from: &$from+$from_b, arg:f, body: {
Self::new_neg((-*f).try_into()?)
});
};
(neg_non0 for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_primitive![@neg_non0 for: $for + $for_b, from: $from + $from_b]; )+
};
(@neg_non0 for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Self::new_neg((-f.get()).try_into()?)
});
};
}
#[cfg(not(feature = "try_from"))]
macro_rules! try_from_primitive {
($($tt:tt)*) => {};
}
pub(crate) use try_from_primitive;
#[cfg(feature = "try_from")]
macro_rules! try_for_primitive {
(int for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_for_primitive![@int for: $for + $for_b, from: $from + $from_b]; )+
};
(@int for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Ok(f.0.try_into()?)
});
};
(non0 for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_for_primitive![@non0 for: $for + $for_b, from: $from + $from_b]; )+
};
(@non0 for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Ok(f.0.get().try_into()?)
});
};
(int_non0 for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_for_primitive![@int_non0 for: $for + $for_b, from: $from + $from_b]; )+
};
(@int_non0 for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
devela::paste! {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
[<$for$for_b>]::new(f.0.try_into()?).ok_or(Self::Error::Conversion)
});
}
};
(neg for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_for_primitive![@neg for: $for + $for_b, from: $from + $from_b]; )+
};
(@neg for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
devela::paste! {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Ok([<$for$for_b>]::try_from(f.0)?.neg())
});
}
};
(neg_non0 for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_for_primitive![@neg_non0 for: $for + $for_b, from: $from + $from_b]; )+
};
(@neg_non0 for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
devela::paste! {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
[<$for$for_b>]::new([<i$for_b>]::try_from(f.0)?.neg())
.ok_or(Self::Error::Conversion)
});
}
};
(non0neg for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_for_primitive![@non0neg for: $for + $for_b, from: $from + $from_b]; )+
};
(@non0neg for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
devela::paste! {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
Ok([<$for$for_b>]::try_from(f.0.get())?.neg())
});
}
};
(non0neg_non0 for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_for_primitive![@non0neg_non0 for: $for + $for_b, from: $from + $from_b]; )+
};
(@non0neg_non0 for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
devela::paste! {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
[<$for$for_b>]::new([<i$for_b>]::try_from(f.0.get())?.neg())
.ok_or(Self::Error::Conversion)
});
}
};
}
#[cfg(not(feature = "try_from"))]
macro_rules! try_for_primitive {
($($tt:tt)*) => {};
}
pub(crate) use try_for_primitive;
#[cfg(feature = "try_from")]
macro_rules! try_from_any {
(zero for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_any![@zero for: $for + $for_b, from: $from + $from_b]; )+
};
(@zero
for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
devela::paste! {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:f, body: {
if f.is_zero() {
Ok([<$for$for_b>]::ZERO)
} else {
Err($crate::error::NumeraErrors::Conversion)
}
});
}
};
(error for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_any![@error for: $for + $for_b, from: $from + $from_b]; )+
};
(@error for: $for:ident + $for_b:expr, from: $from:ident + $from_b:expr) => {
$crate::all::impl_from!(try for: $for+$for_b, from: @$from+$from_b, arg:_f, body: {
Err($crate::error::NumeraErrors::Conversion)
});
};
}
#[cfg(not(feature = "try_from"))]
macro_rules! try_from_any {
($($tt:tt)*) => {};
}
pub(crate) use try_from_any;