]> git.lizzy.rs Git - rust.git/blob - src/libstd/sys/windows/cmath.rs
Rollup merge of #60429 - estebank:pub-path, r=michaelwoerister
[rust.git] / src / libstd / sys / windows / cmath.rs
1 #![cfg(not(test))]
2
3 use libc::{c_float, c_double};
4
5 #[link_name = "m"]
6 extern {
7     pub fn acos(n: c_double) -> c_double;
8     pub fn asin(n: c_double) -> c_double;
9     pub fn atan(n: c_double) -> c_double;
10     pub fn atan2(a: c_double, b: c_double) -> c_double;
11     pub fn cbrt(n: c_double) -> c_double;
12     pub fn cbrtf(n: c_float) -> c_float;
13     pub fn cosh(n: c_double) -> c_double;
14     pub fn expm1(n: c_double) -> c_double;
15     pub fn expm1f(n: c_float) -> c_float;
16     pub fn fdim(a: c_double, b: c_double) -> c_double;
17     pub fn fdimf(a: c_float, b: c_float) -> c_float;
18     #[cfg_attr(target_env = "msvc", link_name = "_hypot")]
19     pub fn hypot(x: c_double, y: c_double) -> c_double;
20     #[cfg_attr(target_env = "msvc", link_name = "_hypotf")]
21     pub fn hypotf(x: c_float, y: c_float) -> c_float;
22     pub fn log1p(n: c_double) -> c_double;
23     pub fn log1pf(n: c_float) -> c_float;
24     pub fn sinh(n: c_double) -> c_double;
25     pub fn tan(n: c_double) -> c_double;
26     pub fn tanh(n: c_double) -> c_double;
27 }
28
29 pub use self::shims::*;
30
31 #[cfg(not(target_env = "msvc"))]
32 mod shims {
33     use libc::c_float;
34
35     extern {
36         pub fn acosf(n: c_float) -> c_float;
37         pub fn asinf(n: c_float) -> c_float;
38         pub fn atan2f(a: c_float, b: c_float) -> c_float;
39         pub fn atanf(n: c_float) -> c_float;
40         pub fn coshf(n: c_float) -> c_float;
41         pub fn sinhf(n: c_float) -> c_float;
42         pub fn tanf(n: c_float) -> c_float;
43         pub fn tanhf(n: c_float) -> c_float;
44     }
45 }
46
47 // On MSVC these functions aren't defined, so we just define shims which promote
48 // everything fo f64, perform the calculation, and then demote back to f32.
49 // While not precisely correct should be "correct enough" for now.
50 #[cfg(target_env = "msvc")]
51 mod shims {
52     use libc::c_float;
53
54     #[inline]
55     pub unsafe fn acosf(n: c_float) -> c_float {
56         f64::acos(n as f64) as c_float
57     }
58
59     #[inline]
60     pub unsafe fn asinf(n: c_float) -> c_float {
61         f64::asin(n as f64) as c_float
62     }
63
64     #[inline]
65     pub unsafe fn atan2f(n: c_float, b: c_float) -> c_float {
66         f64::atan2(n as f64, b as f64) as c_float
67     }
68
69     #[inline]
70     pub unsafe fn atanf(n: c_float) -> c_float {
71         f64::atan(n as f64) as c_float
72     }
73
74     #[inline]
75     pub unsafe fn coshf(n: c_float) -> c_float {
76         f64::cosh(n as f64) as c_float
77     }
78
79     #[inline]
80     pub unsafe fn sinhf(n: c_float) -> c_float {
81         f64::sinh(n as f64) as c_float
82     }
83
84     #[inline]
85     pub unsafe fn tanf(n: c_float) -> c_float {
86         f64::tan(n as f64) as c_float
87     }
88
89     #[inline]
90     pub unsafe fn tanhf(n: c_float) -> c_float {
91         f64::tanh(n as f64) as c_float
92     }
93 }