macro_rules! math {
($f: ident, $domain: expr, $codomain: expr) => {
#[allow(clippy::redundant_closure_call)]
(stringify!($f), v(0), |_, cv| {
once_with(move || Ok($codomain(libm::$f($domain(&cv.1)?))))
})
};
($f: ident, $domain1: expr, $domain2: expr, $codomain: expr) => {
(stringify!($f), v(2), |_, mut cv| {
once_with(move || {
let y = cv.0.pop_var();
let x = cv.0.pop_var();
Ok($codomain(libm::$f($domain1(&x)?, $domain2(&y)?)))
})
})
};
($f: ident, $domain1: expr, $domain2: expr, $domain3: expr, $codomain: expr) => {
(stringify!($f), v(3), |_, mut cv| {
once_with(move || {
let z = cv.0.pop_var();
let y = cv.0.pop_var();
let x = cv.0.pop_var();
Ok($codomain(libm::$f(
$domain1(&x)?,
$domain2(&y)?,
$domain3(&z)?,
)))
})
})
};
}
pub(crate) use math;
macro_rules! f_f {
($f: ident) => {
crate::math::math!($f, V::as_f64, V::from)
};
}
macro_rules! f_i {
($f: ident) => {
crate::math::math!($f, V::as_f64, |x| V::from(x as isize))
};
}
macro_rules! f_fi {
($f: ident) => {
crate::math::math!($f, V::as_f64, |(x, y)| [V::from(x), V::from(y as isize)]
.into_iter()
.collect())
};
}
macro_rules! f_ff {
($f: ident) => {
crate::math::math!($f, V::as_f64, |(x, y)| [V::from(x), V::from(y)]
.into_iter()
.collect())
};
}
macro_rules! ff_f {
($f: ident) => {
crate::math::math!($f, V::as_f64, V::as_f64, V::from)
};
}
macro_rules! if_f {
($f: ident) => {
crate::math::math!($f, V::try_as_i32, V::as_f64, V::from)
};
}
macro_rules! fi_f {
($f: ident) => {
crate::math::math!($f, V::as_f64, V::try_as_i32, V::from)
};
}
macro_rules! fff_f {
($f: ident) => {
crate::math::math!($f, V::as_f64, V::as_f64, V::as_f64, V::from)
};
}
pub(crate) use f_f;
pub(crate) use f_ff;
pub(crate) use f_fi;
pub(crate) use f_i;
pub(crate) use ff_f;
pub(crate) use fff_f;
pub(crate) use fi_f;
pub(crate) use if_f;