use crate::ContainingFloat;
pub trait Goniometric {
type Output;
fn sin(self) -> Self::Output;
fn cos(self) -> Self::Output;
fn atan2(a: Self, b: Self) -> Self::Output;
}
impl<T> Goniometric for T
where
T: ContainingFloat,
T::Float: Goniometric,
{
type Output = <T::Float as Goniometric>::Output;
fn cos(self) -> Self::Output {
self.to_float().cos()
}
fn sin(self) -> Self::Output {
self.to_float().sin()
}
fn atan2(a: Self, b: Self) -> Self::Output {
T::Float::atan2(a.to_float(), b.to_float())
}
}
macro_rules! impl_float_goniometric {
($($t:ident),*) => {
$(impl Goniometric for $t {
type Output = $t;
fn sin(self) -> Self::Output {
$t::sin(self)
}
fn cos(self) -> Self::Output {
$t::cos(self)
}
fn atan2(a: Self, b: Self) -> Self::Output {
$t::atan2(a, b)
}
})*
};
}
impl_float_goniometric!(f32, f64);