tawasuyu

tawasuyu/taffy

A high performance rust-powered UI layout library

HTML 5544Rust 88Markdown 11TOML 91926 Definiciones

Eliminate the num-traits dependency (#761)

Signed-off-by: Nico Burns <nico@nicoburns.com>

016b93a3d88e9620860b0c1c61de603e39142d14 · por Nico Burns · (hace 1 año) · padre c86f9223e · ver el árbol en este commit

Delta semántico · 6

src/util/sys.rs

1 archivos · +52 −22

diff --git a/src/util/sys.rs b/src/util/sys.rs
index a12313ee7..ecf299e76 100644
--- a/src/util/sys.rs
+++ b/src/util/sys.rs
@@ -77,18 +77,10 @@ mod alloc {
     }
 
     /// Rounds to the nearest whole number
-    #[must_use]
-    #[inline(always)]
-    pub(crate) fn round(value: f32) -> f32 {
-        num_traits::float::FloatCore::round(value)
-    }
+    pub(crate) use super::polyfill::round;
 
     /// Computes the absolute value
-    #[must_use]
-    #[inline(always)]
-    pub(crate) fn abs(value: f32) -> f32 {
-        num_traits::float::FloatCore::abs(value)
-    }
+    pub(crate) use super::polyfill::abs;
 
     /// Returns the largest of two f32 values
     #[inline(always)]
@@ -133,20 +125,10 @@ mod core {
     }
 
     /// Rounds to the nearest whole number
-    #[inline]
-    #[must_use]
-    #[inline(always)]
-    pub(crate) fn round(value: f32) -> f32 {
-        num_traits::float::FloatCore::round(value)
-    }
+    pub(crate) use super::polyfill::round;
 
     /// Computes the absolute value
-    #[inline]
-    #[must_use]
-    #[inline(always)]
-    pub(crate) fn abs(value: f32) -> f32 {
-        num_traits::float::FloatCore::abs(value)
-    }
+    pub(crate) use super::polyfill::abs;
 
     /// Returns the largest of two f32 values
     #[inline(always)]
@@ -160,3 +142,51 @@ mod core {
         a.min(b)
     }
 }
+
+/// Implementations of float functions for no_std and alloc builds
+/// Copied from `num-traits` crate
+mod polyfill {
+    #[inline(always)]
+    #[cfg(not(feature = "std"))]
+    fn fract(value: f32) -> f32 {
+        if value == 0.0 {
+            0.0
+        } else {
+            value % 1.0
+        }
+    }
+
+    #[must_use]
+    #[inline(always)]
+    #[cfg(not(feature = "std"))]
+    pub(crate) fn round(value: f32) -> f32 {
+        let f = fract(value);
+        if f.is_nan() || f == 0.0 {
+            value
+        } else if value > 0.0 {
+            if f < 0.5 {
+                value - f
+            } else {
+                value - f + 1.0
+            }
+        } else if -f < 0.5 {
+            value - f
+        } else {
+            value - f - 1.0
+        }
+    }
+
+    /// Computes the absolute value
+    #[must_use]
+    #[inline(always)]
+    #[cfg(not(feature = "std"))]
+    pub(crate) fn abs(value: f32) -> f32 {
+        if value.is_sign_positive() {
+            return value;
+        } else if value.is_sign_negative() {
+            return -value;
+        } else {
+            f32::NAN
+        }
+    }
+}