summary refs log tree commit diff
path: root/src/libcoretest
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2015-08-16 00:42:53 -0700
committerEli Friedman <eli.friedman@gmail.com>2015-08-17 11:30:59 -0700
commit1ddee8070d3cb83609b1f71c29e3deda3d30fd51 (patch)
tree5cc0748842fb026f38f69b4932d925163afc4a15 /src/libcoretest
parent7b7fc67dd453c470a48dbdcf64693a93293c9ab0 (diff)
downloadrust-1ddee8070d3cb83609b1f71c29e3deda3d30fd51.tar.gz
rust-1ddee8070d3cb83609b1f71c29e3deda3d30fd51.zip
Remove dependencies on libm functions from libcore.
There wasn't any particular reason the functions needed to be there
anyway, so just get rid of them, and adjust libstd to compensate.

With this change, libcore depends on exactly two floating-point functions:
fmod and fmodf.  They are implicitly referenced because they are
used to implement "%".
Diffstat (limited to 'src/libcoretest')
-rw-r--r--src/libcoretest/num/flt2dec/mod.rs18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/libcoretest/num/flt2dec/mod.rs b/src/libcoretest/num/flt2dec/mod.rs
index 488cd3a779c..8ae33a44202 100644
--- a/src/libcoretest/num/flt2dec/mod.rs
+++ b/src/libcoretest/num/flt2dec/mod.rs
@@ -164,12 +164,26 @@ fn check_exact<F, T>(mut f: F, v: T, vstr: &str, expected: &[u8], expectedk: i16
     }
 }
 
+trait TestableFloat : DecodableFloat + fmt::Display {
+    /// Returns `x * 2^exp`. Almost same to `std::{f32,f64}::ldexp`.
+    /// This is used for testing.
+    fn ldexpi(f: i64, exp: isize) -> Self;
+}
+
+impl TestableFloat for f32 {
+    fn ldexpi(f: i64, exp: isize) -> Self { f as Self * (exp as Self).exp2() }
+}
+
+impl TestableFloat for f64 {
+    fn ldexpi(f: i64, exp: isize) -> Self { f as Self * (exp as Self).exp2() }
+}
+
 fn check_exact_one<F, T>(mut f: F, x: i64, e: isize, tstr: &str, expected: &[u8], expectedk: i16)
-        where T: DecodableFloat + fmt::Display,
+        where T: TestableFloat,
               F: FnMut(&Decoded, &mut [u8], i16) -> (usize, i16) {
     // use a large enough buffer
     let mut buf = [b'_'; 1024];
-    let v: T = DecodableFloat::ldexpi(x, e);
+    let v: T = TestableFloat::ldexpi(x, e);
     let decoded = decode_finite(v);
 
     try_exact!(f(&decoded) => &mut buf, &expected, expectedk;