From 580a62daaf06170d3fc6b2e3d9a5fc288a81388a Mon Sep 17 00:00:00 2001 From: Stephen Chung Date: Thu, 25 Jun 2020 19:19:16 +0800 Subject: [PATCH] Add sign function. --- doc/src/language/num-fn.md | 9 +++++---- src/packages/arithmetic.rs | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/doc/src/language/num-fn.md b/doc/src/language/num-fn.md index c6df7900..1e415e11 100644 --- a/doc/src/language/num-fn.md +++ b/doc/src/language/num-fn.md @@ -9,10 +9,11 @@ Integer Functions The following standard functions (defined in the [`BasicMathPackage`]({{rootUrl}}/rust/packages.md) but excluded if using a [raw `Engine`]) operate on `i8`, `i16`, `i32`, `i64`, `f32` and `f64` only: -| Function | Description | -| ------------ | --------------------------------- | -| `abs` | absolute value | -| [`to_float`] | converts an integer type to `f64` | +| Function | Description | +| ------------ | --------------------------------------------------------------- | +| `abs` | absolute value | +| `sign` | returns -1 if the number is negative, +1 if positive, 0 if zero | +| [`to_float`] | converts an integer type to `f64` | Floating-Point Functions ----------------------- diff --git a/src/packages/arithmetic.rs b/src/packages/arithmetic.rs index cf109b0c..31808a2a 100644 --- a/src/packages/arithmetic.rs +++ b/src/packages/arithmetic.rs @@ -267,6 +267,19 @@ macro_rules! reg_op { $( $lib.set_fn_2($op, $func::<$par>); )* }; } +macro_rules! reg_sign { + ($lib:expr, $op:expr, $ret:ty, $($par:ty),*) => { + $( $lib.set_fn_1($op, |value: $par| -> Result<$ret, _> { + Ok(if value == (0 as $par) { + (0 as $ret) + } else if value < (0 as $par) { + (-1 as $ret) + } else { + (1 as $ret) + }) + }); )* + }; +} def_package!(crate:ArithmeticPackage:"Basic arithmetic", lib, { #[cfg(not(feature = "only_i32"))] @@ -321,6 +334,11 @@ def_package!(crate:ArithmeticPackage:"Basic arithmetic", lib, { reg_op!(lib, "%", modulo_u, i128, u128); } } + + reg_sign!(lib, "sign", INT, i8, i16, i32, i64); + + #[cfg(not(target_arch = "wasm32"))] + reg_sign!(lib, "sign", INT, i128); } // Basic arithmetic for floating-point - no need to check @@ -330,6 +348,8 @@ def_package!(crate:ArithmeticPackage:"Basic arithmetic", lib, { reg_op!(lib, "-", sub_u, f32); reg_op!(lib, "*", mul_u, f32); reg_op!(lib, "/", div_u, f32); + reg_sign!(lib, "sign", f32, f32); + reg_sign!(lib, "sign", f64, f64); } #[cfg(not(feature = "only_i32"))]