use rustfft::FftNum;
use std::marker::{Send, Sync};
pub use num::Complex;
pub trait Float
where
Self: 'static + Send + Sync,
Self: num::traits::Float,
Self: num::traits::FloatConst,
Self: num::traits::NumAssignOps,
Self: FftNum,
{
}
impl<T> Float for T
where
T: 'static + Send + Sync,
T: num::traits::Float,
T: num::traits::FloatConst,
T: num::traits::NumAssignOps,
T: FftNum,
{
}
#[macro_export]
macro_rules! flt {
($x:expr) => {
<Flt as ::num::traits::NumCast>::from($x).expect("could not convert number into float")
};
}
pub use flt;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_generic_float_f32() {
fn inner<Flt: Float>(x: Flt) -> Flt {
Flt::from(2.0).unwrap() * x
}
assert_eq!(inner(3.5f32), 7.0f32);
}
#[test]
fn test_generic_float_f64() {
fn inner<Flt: Float>(x: Flt) -> Flt {
Flt::from(2.0).unwrap() * x
}
assert_eq!(inner(3.5f64), 7.0f64);
}
}