use crate::{CommutativeRing, Float};
use core::cmp::PartialOrd;
use core::ops::{AddAssign, MulAssign, Neg, SubAssign};
pub trait Real:
CommutativeRing + PartialOrd + Neg<Output = Self> + Copy + Clone + AddAssign + SubAssign + MulAssign
{
fn nan() -> Self;
fn is_nan(self) -> bool;
fn is_infinite(self) -> bool;
fn is_finite(self) -> bool;
fn clamp(self, min: Self, max: Self) -> Self;
fn sqrt(self) -> Self;
fn abs(self) -> Self;
fn floor(self) -> Self;
fn ceil(self) -> Self;
fn round(self) -> Self;
fn exp(self) -> Self;
fn ln(self) -> Self;
fn log(self, base: Self) -> Self;
fn log2(self) -> Self;
fn log10(self) -> Self;
fn powf(self, n: Self) -> Self;
fn sin(self) -> Self;
fn asin(self) -> Self;
fn cos(self) -> Self;
fn acos(self) -> Self;
fn tan(self) -> Self;
fn sinh(self) -> Self;
fn cosh(self) -> Self;
fn tanh(self) -> Self;
fn atan(self) -> Self;
fn atan2(self, other: Self) -> Self;
fn pi() -> Self;
fn e() -> Self;
fn epsilon() -> Self; }
impl<T: Float> Real for T {
#[inline]
fn nan() -> Self {
Float::nan()
}
#[inline]
fn is_nan(self) -> bool {
Float::is_nan(self)
}
#[inline]
fn is_infinite(self) -> bool {
Float::is_infinite(self)
}
#[inline]
fn is_finite(self) -> bool {
Float::is_finite(self)
}
#[inline]
fn clamp(self, min: Self, max: Self) -> Self {
Float::clamp(self, min, max)
}
#[inline]
fn sqrt(self) -> Self {
Float::sqrt(self)
}
#[inline]
fn abs(self) -> Self {
Float::abs(self)
}
#[inline]
fn floor(self) -> Self {
Float::floor(self)
}
#[inline]
fn ceil(self) -> Self {
Float::ceil(self)
}
#[inline]
fn round(self) -> Self {
Float::round(self)
}
#[inline]
fn exp(self) -> Self {
Float::exp(self)
}
#[inline]
fn ln(self) -> Self {
Float::ln(self)
}
#[inline]
fn log(self, base: Self) -> Self {
Float::log(self, base)
}
#[inline]
fn log2(self) -> Self {
Float::log2(self)
}
#[inline]
fn log10(self) -> Self {
Float::log10(self)
}
#[inline]
fn powf(self, n: Self) -> Self {
Float::powf(self, n)
}
#[inline]
fn sin(self) -> Self {
Float::sin(self)
}
#[inline]
fn asin(self) -> Self {
Float::asin(self)
}
#[inline]
fn cos(self) -> Self {
Float::cos(self)
}
#[inline]
fn acos(self) -> Self {
Float::acos(self)
}
#[inline]
fn tan(self) -> Self {
Float::tan(self)
}
#[inline]
fn sinh(self) -> Self {
Float::sinh(self)
}
#[inline]
fn cosh(self) -> Self {
Float::cosh(self)
}
#[inline]
fn tanh(self) -> Self {
Float::tanh(self)
}
#[inline]
fn atan(self) -> Self {
Float::atan(self)
}
#[inline]
fn atan2(self, other: Self) -> Self {
Float::atan2(self, other)
}
#[inline]
fn pi() -> Self {
Float::pi()
}
#[inline]
fn e() -> Self {
Float::e()
}
#[inline]
fn epsilon() -> Self {
Float::epsilon()
}
}