#[cfg(feature = "try_from")]
macro_rules! try_from_primitive {
(float_f for: $for:ident + $for_b:expr, from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_primitive![@float_f for: $for + $for_b, from: $from + $from_b]; )+
};
(@float_f 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: {
let converted = f as [<$from$for_b>];
if f.is_finite() && converted.is_infinite() {
Err(Self::Error::Conversion)
} else {
Ok(Self(converted))
}
});
$crate::all::impl_from!(try for: $for+$for_b, from: &$from+$from_b, arg:f, body: {
let converted = *f as [<$from$for_b>];
if f.is_finite() && converted.is_infinite() {
Err(Self::Error::Conversion)
} else {
Ok(Self(converted))
}
});
}
};
(float_half for: $for:ident + $for_i:ident + $for_b:expr,
from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_primitive![@float_half for: $for + $for_i + $for_b, from: $from + $from_b]; )+
};
(@float_half for: $for:ident + $for_i: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: {
let converted = [<$for_i$for_b>]::[<from_f$from_b>](f);
if f.is_finite() && converted.is_infinite() {
Err(Self::Error::Conversion)
} else {
Ok(Self(converted))
}
});
$crate::all::impl_from!(try for: $for+$for_b, from: &$from+$from_b, arg:f, body: {
let converted = [<$for_i$for_b>]::[<from_f$from_b>](*f);
if f.is_finite() && converted.is_infinite() {
Err(Self::Error::Conversion)
} else {
Ok(Self(converted))
}
});
}
};
(float_half_ne for: $for:ident + $for_i:ident + $for_b:expr,
from: $from:ident + $( $from_b:expr ),+) => {
$( try_from_primitive![@float_half_ne for: $for + $for_i + $for_b, from: $from + $from_b]; )+
};
(@float_half_ne for: $for:ident + $for_i: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: {
let converted = [<$for_i$for_b>]::from_f32(f.to_f32());
if f.is_finite() && converted.is_infinite() {
Err(Self::Error::Conversion)
} else {
Ok(Self(converted))
}
});
}
};
}
#[cfg(not(feature = "try_from"))]
macro_rules! try_from_primitive {
($($tt:tt)*) => {};
}
pub(crate) use try_from_primitive;