std: Move the `cmath` module into the `sys` module
This commit moves the `f32::cmath` and `f64::cmath` modules into the `sys` module. Note that these are not publicly exported modules, simply implementation details. These modules are already platform-specific with shims on MSVC and this is mostly just a reflection of that reality. This should also help cut down on `#[cfg]` traffic if platforms are brought on which don't directly support these functions.
This commit is contained in:
parent
1ccb50eaa6
commit
348930eb4e
|
@ -23,6 +23,8 @@ use core::num;
|
|||
use intrinsics;
|
||||
#[cfg(not(test))]
|
||||
use num::FpCategory;
|
||||
#[cfg(not(test))]
|
||||
use sys::cmath;
|
||||
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
@ -36,92 +38,6 @@ pub use core::f32::{MIN, MIN_POSITIVE, MAX};
|
|||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub use core::f32::consts;
|
||||
|
||||
#[allow(dead_code)]
|
||||
mod cmath {
|
||||
use libc::{c_float, c_int};
|
||||
|
||||
extern {
|
||||
pub fn cbrtf(n: c_float) -> c_float;
|
||||
pub fn erff(n: c_float) -> c_float;
|
||||
pub fn erfcf(n: c_float) -> c_float;
|
||||
pub fn expm1f(n: c_float) -> c_float;
|
||||
pub fn fdimf(a: c_float, b: c_float) -> c_float;
|
||||
pub fn fmodf(a: c_float, b: c_float) -> c_float;
|
||||
pub fn ilogbf(n: c_float) -> c_int;
|
||||
pub fn logbf(n: c_float) -> c_float;
|
||||
pub fn log1pf(n: c_float) -> c_float;
|
||||
pub fn modff(n: c_float, iptr: &mut c_float) -> c_float;
|
||||
pub fn nextafterf(x: c_float, y: c_float) -> c_float;
|
||||
pub fn tgammaf(n: c_float) -> c_float;
|
||||
|
||||
#[cfg_attr(all(windows, target_env = "msvc"), link_name = "__lgammaf_r")]
|
||||
pub fn lgammaf_r(n: c_float, sign: &mut c_int) -> c_float;
|
||||
#[cfg_attr(all(windows, target_env = "msvc"), link_name = "_hypotf")]
|
||||
pub fn hypotf(x: c_float, y: c_float) -> c_float;
|
||||
}
|
||||
|
||||
// See the comments in the `floor` function for why MSVC is special
|
||||
// here.
|
||||
#[cfg(not(target_env = "msvc"))]
|
||||
extern {
|
||||
pub fn acosf(n: c_float) -> c_float;
|
||||
pub fn asinf(n: c_float) -> c_float;
|
||||
pub fn atan2f(a: c_float, b: c_float) -> c_float;
|
||||
pub fn atanf(n: c_float) -> c_float;
|
||||
pub fn coshf(n: c_float) -> c_float;
|
||||
pub fn sinhf(n: c_float) -> c_float;
|
||||
pub fn tanf(n: c_float) -> c_float;
|
||||
pub fn tanhf(n: c_float) -> c_float;
|
||||
}
|
||||
|
||||
#[cfg(target_env = "msvc")]
|
||||
pub use self::shims::*;
|
||||
#[cfg(target_env = "msvc")]
|
||||
mod shims {
|
||||
use libc::c_float;
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn acosf(n: c_float) -> c_float {
|
||||
f64::acos(n as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn asinf(n: c_float) -> c_float {
|
||||
f64::asin(n as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn atan2f(n: c_float, b: c_float) -> c_float {
|
||||
f64::atan2(n as f64, b as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn atanf(n: c_float) -> c_float {
|
||||
f64::atan(n as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn coshf(n: c_float) -> c_float {
|
||||
f64::cosh(n as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn sinhf(n: c_float) -> c_float {
|
||||
f64::sinh(n as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn tanf(n: c_float) -> c_float {
|
||||
f64::tan(n as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn tanhf(n: c_float) -> c_float {
|
||||
f64::tanh(n as f64) as c_float
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(test))]
|
||||
#[lang = "f32"]
|
||||
impl f32 {
|
||||
|
|
|
@ -23,6 +23,8 @@ use core::num;
|
|||
use intrinsics;
|
||||
#[cfg(not(test))]
|
||||
use num::FpCategory;
|
||||
#[cfg(not(test))]
|
||||
use sys::cmath;
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub use core::f64::{RADIX, MANTISSA_DIGITS, DIGITS, EPSILON};
|
||||
|
@ -35,53 +37,6 @@ pub use core::f64::{MIN, MIN_POSITIVE, MAX};
|
|||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub use core::f64::consts;
|
||||
|
||||
#[allow(dead_code)]
|
||||
mod cmath {
|
||||
use libc::{c_double, c_int};
|
||||
|
||||
#[link_name = "m"]
|
||||
extern {
|
||||
pub fn acos(n: c_double) -> c_double;
|
||||
pub fn asin(n: c_double) -> c_double;
|
||||
pub fn atan(n: c_double) -> c_double;
|
||||
pub fn atan2(a: c_double, b: c_double) -> c_double;
|
||||
pub fn cbrt(n: c_double) -> c_double;
|
||||
pub fn cosh(n: c_double) -> c_double;
|
||||
pub fn erf(n: c_double) -> c_double;
|
||||
pub fn erfc(n: c_double) -> c_double;
|
||||
pub fn expm1(n: c_double) -> c_double;
|
||||
pub fn fdim(a: c_double, b: c_double) -> c_double;
|
||||
pub fn fmod(a: c_double, b: c_double) -> c_double;
|
||||
pub fn frexp(n: c_double, value: &mut c_int) -> c_double;
|
||||
pub fn ilogb(n: c_double) -> c_int;
|
||||
pub fn ldexp(x: c_double, n: c_int) -> c_double;
|
||||
pub fn logb(n: c_double) -> c_double;
|
||||
pub fn log1p(n: c_double) -> c_double;
|
||||
pub fn nextafter(x: c_double, y: c_double) -> c_double;
|
||||
pub fn modf(n: c_double, iptr: &mut c_double) -> c_double;
|
||||
pub fn sinh(n: c_double) -> c_double;
|
||||
pub fn tan(n: c_double) -> c_double;
|
||||
pub fn tanh(n: c_double) -> c_double;
|
||||
pub fn tgamma(n: c_double) -> c_double;
|
||||
|
||||
// These are commonly only available for doubles
|
||||
|
||||
pub fn j0(n: c_double) -> c_double;
|
||||
pub fn j1(n: c_double) -> c_double;
|
||||
pub fn jn(i: c_int, n: c_double) -> c_double;
|
||||
|
||||
pub fn y0(n: c_double) -> c_double;
|
||||
pub fn y1(n: c_double) -> c_double;
|
||||
pub fn yn(i: c_int, n: c_double) -> c_double;
|
||||
|
||||
#[cfg_attr(all(windows, target_env = "msvc"), link_name = "__lgamma_r")]
|
||||
pub fn lgamma_r(n: c_double, sign: &mut c_int) -> c_double;
|
||||
|
||||
#[cfg_attr(all(windows, target_env = "msvc"), link_name = "_hypot")]
|
||||
pub fn hypot(x: c_double, y: c_double) -> c_double;
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(test))]
|
||||
#[lang = "f64"]
|
||||
impl f64 {
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![cfg(not(test))]
|
||||
|
||||
use libc::{c_float, c_double};
|
||||
|
||||
#[link_name = "m"]
|
||||
extern {
|
||||
pub fn acos(n: c_double) -> c_double;
|
||||
pub fn acosf(n: c_float) -> c_float;
|
||||
pub fn asin(n: c_double) -> c_double;
|
||||
pub fn asinf(n: c_float) -> c_float;
|
||||
pub fn atan(n: c_double) -> c_double;
|
||||
pub fn atan2(a: c_double, b: c_double) -> c_double;
|
||||
pub fn atan2f(a: c_float, b: c_float) -> c_float;
|
||||
pub fn atanf(n: c_float) -> c_float;
|
||||
pub fn cbrt(n: c_double) -> c_double;
|
||||
pub fn cbrtf(n: c_float) -> c_float;
|
||||
pub fn cosh(n: c_double) -> c_double;
|
||||
pub fn coshf(n: c_float) -> c_float;
|
||||
pub fn expm1(n: c_double) -> c_double;
|
||||
pub fn expm1f(n: c_float) -> c_float;
|
||||
pub fn fdim(a: c_double, b: c_double) -> c_double;
|
||||
pub fn fdimf(a: c_float, b: c_float) -> c_float;
|
||||
pub fn hypot(x: c_double, y: c_double) -> c_double;
|
||||
pub fn hypotf(x: c_float, y: c_float) -> c_float;
|
||||
pub fn log1p(n: c_double) -> c_double;
|
||||
pub fn log1pf(n: c_float) -> c_float;
|
||||
pub fn sinh(n: c_double) -> c_double;
|
||||
pub fn sinhf(n: c_float) -> c_float;
|
||||
pub fn tan(n: c_double) -> c_double;
|
||||
pub fn tanf(n: c_float) -> c_float;
|
||||
pub fn tanh(n: c_double) -> c_double;
|
||||
pub fn tanhf(n: c_float) -> c_float;
|
||||
}
|
|
@ -17,6 +17,7 @@ pub use self::rand::hashmap_random_keys;
|
|||
pub mod args;
|
||||
#[cfg(feature = "backtrace")]
|
||||
pub mod backtrace;
|
||||
pub mod cmath;
|
||||
pub mod condvar;
|
||||
pub mod env;
|
||||
pub mod ext;
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![cfg(not(test))]
|
||||
|
||||
use libc::{c_float, c_double};
|
||||
|
||||
#[link_name = "m"]
|
||||
extern {
|
||||
pub fn acos(n: c_double) -> c_double;
|
||||
pub fn acosf(n: c_float) -> c_float;
|
||||
pub fn asin(n: c_double) -> c_double;
|
||||
pub fn asinf(n: c_float) -> c_float;
|
||||
pub fn atan(n: c_double) -> c_double;
|
||||
pub fn atan2(a: c_double, b: c_double) -> c_double;
|
||||
pub fn atan2f(a: c_float, b: c_float) -> c_float;
|
||||
pub fn atanf(n: c_float) -> c_float;
|
||||
pub fn cbrt(n: c_double) -> c_double;
|
||||
pub fn cbrtf(n: c_float) -> c_float;
|
||||
pub fn cosh(n: c_double) -> c_double;
|
||||
pub fn coshf(n: c_float) -> c_float;
|
||||
pub fn expm1(n: c_double) -> c_double;
|
||||
pub fn expm1f(n: c_float) -> c_float;
|
||||
pub fn fdim(a: c_double, b: c_double) -> c_double;
|
||||
pub fn fdimf(a: c_float, b: c_float) -> c_float;
|
||||
pub fn hypot(x: c_double, y: c_double) -> c_double;
|
||||
pub fn hypotf(x: c_float, y: c_float) -> c_float;
|
||||
pub fn log1p(n: c_double) -> c_double;
|
||||
pub fn log1pf(n: c_float) -> c_float;
|
||||
pub fn sinh(n: c_double) -> c_double;
|
||||
pub fn sinhf(n: c_float) -> c_float;
|
||||
pub fn tan(n: c_double) -> c_double;
|
||||
pub fn tanf(n: c_float) -> c_float;
|
||||
pub fn tanh(n: c_double) -> c_double;
|
||||
pub fn tanhf(n: c_float) -> c_float;
|
||||
}
|
|
@ -38,6 +38,7 @@ pub mod args;
|
|||
pub mod android;
|
||||
#[cfg(feature = "backtrace")]
|
||||
pub mod backtrace;
|
||||
pub mod cmath;
|
||||
pub mod condvar;
|
||||
pub mod env;
|
||||
pub mod ext;
|
||||
|
|
|
@ -0,0 +1,103 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![cfg(not(test))]
|
||||
|
||||
use libc::{c_float, c_double};
|
||||
|
||||
#[link_name = "m"]
|
||||
extern {
|
||||
pub fn acos(n: c_double) -> c_double;
|
||||
pub fn asin(n: c_double) -> c_double;
|
||||
pub fn atan(n: c_double) -> c_double;
|
||||
pub fn atan2(a: c_double, b: c_double) -> c_double;
|
||||
pub fn cbrt(n: c_double) -> c_double;
|
||||
pub fn cbrtf(n: c_float) -> c_float;
|
||||
pub fn cosh(n: c_double) -> c_double;
|
||||
pub fn expm1(n: c_double) -> c_double;
|
||||
pub fn expm1f(n: c_float) -> c_float;
|
||||
pub fn fdim(a: c_double, b: c_double) -> c_double;
|
||||
pub fn fdimf(a: c_float, b: c_float) -> c_float;
|
||||
#[cfg_attr(target_env = "msvc", link_name = "_hypot")]
|
||||
pub fn hypot(x: c_double, y: c_double) -> c_double;
|
||||
#[cfg_attr(target_env = "msvc", link_name = "_hypotf")]
|
||||
pub fn hypotf(x: c_float, y: c_float) -> c_float;
|
||||
pub fn log1p(n: c_double) -> c_double;
|
||||
pub fn log1pf(n: c_float) -> c_float;
|
||||
pub fn sinh(n: c_double) -> c_double;
|
||||
pub fn tan(n: c_double) -> c_double;
|
||||
pub fn tanh(n: c_double) -> c_double;
|
||||
}
|
||||
|
||||
pub use self::shims::*;
|
||||
|
||||
#[cfg(not(target_env = "msvc"))]
|
||||
mod shims {
|
||||
use libc::c_float;
|
||||
|
||||
extern {
|
||||
pub fn acosf(n: c_float) -> c_float;
|
||||
pub fn asinf(n: c_float) -> c_float;
|
||||
pub fn atan2f(a: c_float, b: c_float) -> c_float;
|
||||
pub fn atanf(n: c_float) -> c_float;
|
||||
pub fn coshf(n: c_float) -> c_float;
|
||||
pub fn sinhf(n: c_float) -> c_float;
|
||||
pub fn tanf(n: c_float) -> c_float;
|
||||
pub fn tanhf(n: c_float) -> c_float;
|
||||
}
|
||||
}
|
||||
|
||||
// On MSVC these functions aren't defined, so we just define shims which promote
|
||||
// everything fo f64, perform the calculation, and then demote back to f32.
|
||||
// While not precisely correct should be "correct enough" for now.
|
||||
#[cfg(target_env = "msvc")]
|
||||
mod shims {
|
||||
use libc::c_float;
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn acosf(n: c_float) -> c_float {
|
||||
f64::acos(n as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn asinf(n: c_float) -> c_float {
|
||||
f64::asin(n as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn atan2f(n: c_float, b: c_float) -> c_float {
|
||||
f64::atan2(n as f64, b as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn atanf(n: c_float) -> c_float {
|
||||
f64::atan(n as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn coshf(n: c_float) -> c_float {
|
||||
f64::cosh(n as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn sinhf(n: c_float) -> c_float {
|
||||
f64::sinh(n as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn tanf(n: c_float) -> c_float {
|
||||
f64::tan(n as f64) as c_float
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub unsafe fn tanhf(n: c_float) -> c_float {
|
||||
f64::tanh(n as f64) as c_float
|
||||
}
|
||||
}
|
|
@ -25,6 +25,7 @@ pub mod args;
|
|||
#[cfg(feature = "backtrace")]
|
||||
pub mod backtrace;
|
||||
pub mod c;
|
||||
pub mod cmath;
|
||||
pub mod condvar;
|
||||
#[cfg(feature = "backtrace")]
|
||||
pub mod dynamic_lib;
|
||||
|
|
Loading…
Reference in New Issue