use crate::Rational;
use crate::gaussian_rational::GaussianRational;
use malachite_base::num::conversion::traits::ConvertibleFrom;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct PrimitiveIntFromGaussianRationalError;
fn try_from_helper<'a, T: TryFrom<&'a Rational>>(
x: &'a GaussianRational,
) -> Result<T, PrimitiveIntFromGaussianRationalError> {
if x.imaginary == 0u32 {
T::try_from(&x.real).map_err(|_| PrimitiveIntFromGaussianRationalError)
} else {
Err(PrimitiveIntFromGaussianRationalError)
}
}
fn convertible_from_helper<T: for<'a> ConvertibleFrom<&'a Rational>>(x: &GaussianRational) -> bool {
x.imaginary == 0u32 && T::convertible_from(&x.real)
}
macro_rules! impl_primitive_int_from_gaussian_rational {
($t:ident) => {
impl TryFrom<&GaussianRational> for $t {
type Error = PrimitiveIntFromGaussianRationalError;
#[inline]
fn try_from(x: &GaussianRational) -> Result<$t, Self::Error> {
try_from_helper(x)
}
}
impl ConvertibleFrom<&GaussianRational> for $t {
#[inline]
fn convertible_from(x: &GaussianRational) -> bool {
convertible_from_helper::<$t>(x)
}
}
};
}
apply_to_primitive_ints!(impl_primitive_int_from_gaussian_rational);