diff --git a/src/libstd/num/num.rs b/src/libstd/num/num.rs index f35f495def3a..d6ae08e31fcb 100644 --- a/src/libstd/num/num.rs +++ b/src/libstd/num/num.rs @@ -45,18 +45,23 @@ pub trait Orderable: Ord { fn clamp(&self, mn: &Self, mx: &Self) -> Self; } -#[inline(always)] pub fn min(a: T, b: T) -> T { a.min(&b) } -#[inline(always)] pub fn max(a: T, b: T) -> T { a.max(&b) } +#[inline(always)] pub fn min(x: T, y: T) -> T { x.min(&y) } +#[inline(always)] pub fn max(x: T, y: T) -> T { x.max(&y) } +#[inline(always)] pub fn clamp(value: T, mn: T, mx: T) -> T { value.clamp(&mn, &mx) } pub trait Zero { fn zero() -> Self; // FIXME (#5527): This should be an associated constant fn is_zero(&self) -> bool; } +#[inline(always)] pub fn zero() -> T { Zero::zero() } + pub trait One { fn one() -> Self; // FIXME (#5527): This should be an associated constant } +#[inline(always)] pub fn one() -> T { One::one() } + pub trait Signed: Num + Neg { fn abs(&self) -> Self; @@ -68,6 +73,7 @@ pub trait Signed: Num } #[inline(always)] pub fn abs(value: T) -> T { value.abs() } +#[inline(always)] pub fn abs_sub(x: T, y: T) -> T { x.abs_sub(&y) } #[inline(always)] pub fn signum(value: T) -> T { value.signum() } pub trait Unsigned: Num {} @@ -90,6 +96,9 @@ pub trait Integer: Num fn is_odd(&self) -> bool; } +#[inline(always)] pub fn gcd(x: T, y: T) -> T { x.gcd(&y) } +#[inline(always)] pub fn lcm(x: T, y: T) -> T { x.lcm(&y) } + pub trait Round { fn floor(&self) -> Self; fn ceil(&self) -> Self; @@ -113,15 +122,21 @@ pub trait Algebraic { fn hypot(&self, other: &Self) -> Self; } +#[inline(always)] pub fn pow(value: T, n: T) -> T { value.pow(&n) } #[inline(always)] pub fn sqrt(value: T) -> T { value.sqrt() } +#[inline(always)] pub fn rsqrt(value: T) -> T { value.rsqrt() } +#[inline(always)] pub fn cbrt(value: T) -> T { value.cbrt() } +#[inline(always)] pub fn hypot(x: T, y: T) -> T { x.hypot(&y) } pub trait Trigonometric { fn sin(&self) -> Self; fn cos(&self) -> Self; fn tan(&self) -> Self; + fn asin(&self) -> Self; fn acos(&self) -> Self; fn atan(&self) -> Self; + fn atan2(&self, other: &Self) -> Self; fn sin_cos(&self) -> (Self, Self); } @@ -135,10 +150,12 @@ pub trait Trigonometric { #[inline(always)] pub fn atan(value: T) -> T { value.atan() } #[inline(always)] pub fn atan2(x: T, y: T) -> T { x.atan2(&y) } +#[inline(always)] pub fn sin_cos(value: T) -> (T, T) { value.sin_cos() } pub trait Exponential { fn exp(&self) -> Self; fn exp2(&self) -> Self; + fn ln(&self) -> Self; fn log(&self, base: &Self) -> Self; fn log2(&self) -> Self; @@ -157,6 +174,7 @@ pub trait Hyperbolic: Exponential { fn sinh(&self) -> Self; fn cosh(&self) -> Self; fn tanh(&self) -> Self; + fn asinh(&self) -> Self; fn acosh(&self) -> Self; fn atanh(&self) -> Self; @@ -326,6 +344,10 @@ pub trait Float: Real } /// +#[inline(always)] pub fn exp_m1(value: T) -> T { value.exp_m1() } +#[inline(always)] pub fn ln_1p(value: T) -> T { value.ln_1p() } +#[inline(always)] pub fn mul_add(a: T, b: T, c: T) -> T { a.mul_add(b, c) } + /// Cast from one machine scalar to another /// /// # Example