diff --git a/CHANGELOG.md b/CHANGELOG.md index c05d9c8eb..1424b25ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -516,6 +516,28 @@ This release closes the following issue: +
+ +#### [@stdlib/math/base/napi/ternary](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/math/base/napi/ternary) + +
+ +
+ +##### Features + +- [`74f3c08`](https://github.com/stdlib-js/stdlib/commit/74f3c08113fa7555d9010d3cb814f7a8ea7ea47e) - add `dii_d` in `math/base/napi/ternary` [(#2546)](https://github.com/stdlib-js/stdlib/pull/2546) + +
+ + + +
+ +
+ + +
#### [@stdlib/math/base/napi/unary](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/math/base/napi/unary) @@ -4922,6 +4944,7 @@ A total of 29 people contributed to this release. Thank you to the following con
+- [`74f3c08`](https://github.com/stdlib-js/stdlib/commit/74f3c08113fa7555d9010d3cb814f7a8ea7ea47e) - **feat:** add `dii_d` in `math/base/napi/ternary` [(#2546)](https://github.com/stdlib-js/stdlib/pull/2546) _(by Gunj Joshi, Athan Reines)_ - [`ca18359`](https://github.com/stdlib-js/stdlib/commit/ca18359c4b18000828a214bc52a32db7ac6c1121) - **refactor:** update to use stdlib `pow` [(#2539)](https://github.com/stdlib-js/stdlib/pull/2539) _(by Gunj Joshi)_ - [`efc3551`](https://github.com/stdlib-js/stdlib/commit/efc3551764c30c6cae9a48058cae2868d4055190) - **feat:** add C implementation for `math/base/special/round2` [(##2537)](#2537) _(by Gunj Joshi)_ - [`62e703a`](https://github.com/stdlib-js/stdlib/commit/62e703a5eb7df95a40b3592366da89c5ff42a1b1) - **docs:** add missing `@private` in `math/base/special/round/lib/native.js` [(##2536)](#2536) _(by Gunj Joshi)_ diff --git a/base/napi/ternary/README.md b/base/napi/ternary/README.md index f2f386aa9..4dca5fb06 100644 --- a/base/napi/ternary/README.md +++ b/base/napi/ternary/README.md @@ -182,6 +182,46 @@ The function accepts the following arguments: void stdlib_math_base_napi_fff_f( napi_env env, napi_callback_info info, float (*fcn)( float, float, float ) ); ``` +#### stdlib_math_base_napi_dii_d( env, info, fcn ) + +Invokes a ternary function accepting a double-precision floating-point number and two signed 32-bit integers and returning a double-precision floating-point number. + +```c +#include +#include + +// ... + +static double fcn( const double x, const int32_t y, const int32_t z ) { + // ... +} + +// ... + +/** +* Receives JavaScript callback invocation data. +* +* @param env environment under which the function is invoked +* @param info callback data +* @return Node-API value +*/ +napi_value addon( napi_env env, napi_callback_info info ) { + return stdlib_math_base_napi_dii_d( env, info, fcn ); +} + +// ... +``` + +The function accepts the following arguments: + +- **env**: `[in] napi_env` environment under which the function is invoked. +- **info**: `[in] napi_callback_info` callback data. +- **fcn**: `[in] double (*fcn)( double, int32_t, int32_t )` ternary function. + +```c +void stdlib_math_base_napi_dii_d( napi_env env, napi_callback_info info, double (*fcn)( double, int32_t, int32_t ) ); +``` + #### STDLIB_MATH_BASE_NAPI_MODULE_DDD_D( fcn ) Macro for registering a Node-API module exporting an interface for invoking a ternary function accepting and returning double-precision floating-point numbers. @@ -224,6 +264,29 @@ The macro expects the following arguments: When used, this macro should be used **instead of** `NAPI_MODULE`. The macro includes `NAPI_MODULE`, thus ensuring Node-API module registration. +#### STDLIB_MATH_BASE_NAPI_MODULE_DII_D( fcn ) + +Macro for registering a Node-API module exporting an interface for invoking a ternary function accepting a double-precision floating-point number and two signed 32-bit integers and returning a double-precision floating-point number. + +```c +#include + +static double fcn( const double x, const int32_t y, const int32_t z ) { + // ... +} + +// ... + +// Register a Node-API module: +STDLIB_MATH_BASE_NAPI_MODULE_DII_D( fcn ); +``` + +The macro expects the following arguments: + +- **fcn**: `double (*fcn)( double, int32_t, int32_t )` ternary function. + +When used, this macro should be used **instead of** `NAPI_MODULE`. The macro includes `NAPI_MODULE`, thus ensuring Node-API module registration. +
diff --git a/base/napi/ternary/include/stdlib/math/base/napi/ternary.h b/base/napi/ternary/include/stdlib/math/base/napi/ternary.h index 78ea9d674..514b72add 100644 --- a/base/napi/ternary/include/stdlib/math/base/napi/ternary.h +++ b/base/napi/ternary/include/stdlib/math/base/napi/ternary.h @@ -102,6 +102,48 @@ }; \ NAPI_MODULE( NODE_GYP_MODULE_NAME, stdlib_math_base_napi_fff_f_init ) +/** +* Macro for registering a Node-API module exporting an interface invoking a ternary function accepting a double-precision floating-point number and two signed 32-bit integers and returning a double-precision floating-point number. +* +* @param fcn ternary function +* +* @example +* #include +* +* static double fcn( const double x, const int_32 y, const int_32 z ) { +* // ... +* } +* +* // ... +* +* // Register a Node-API module: +* STDLIB_MATH_BASE_NAPI_MODULE_DII_D( fcn ); +*/ +#define STDLIB_MATH_BASE_NAPI_MODULE_DII_D( fcn ) \ + static napi_value stdlib_math_base_napi_dii_d_wrapper( \ + napi_env env, \ + napi_callback_info info \ + ) { \ + return stdlib_math_base_napi_dii_d( env, info, fcn ); \ + }; \ + static napi_value stdlib_math_base_napi_dii_d_init( \ + napi_env env, \ + napi_value exports \ + ) { \ + napi_value fcn; \ + napi_status status = napi_create_function( \ + env, \ + "exports", \ + NAPI_AUTO_LENGTH, \ + stdlib_math_base_napi_dii_d_wrapper, \ + NULL, \ + &fcn \ + ); \ + assert( status == napi_ok ); \ + return fcn; \ + }; \ + NAPI_MODULE( NODE_GYP_MODULE_NAME, stdlib_math_base_napi_dii_d_init ) + /* * If C++, prevent name mangling so that the compiler emits a ternary file having undecorated names, thus mirroring the behavior of a C compiler. */ @@ -119,6 +161,11 @@ napi_value stdlib_math_base_napi_ddd_d( napi_env env, napi_callback_info info, d */ napi_value stdlib_math_base_napi_fff_f( napi_env env, napi_callback_info info, float (*fcn)( float, float, float ) ); +/** +* Invokes a ternary function accepting a double-precision floating-point number and two signed 32-bit integers and returning a double-precision floating-point number. +*/ +napi_value stdlib_math_base_napi_dii_d( napi_env env, napi_callback_info info, double (*fcn)( double, int32_t, int32_t ) ); + #ifdef __cplusplus } #endif diff --git a/base/napi/ternary/src/main.c b/base/napi/ternary/src/main.c index 60efcb7c4..92b89ca09 100644 --- a/base/napi/ternary/src/main.c +++ b/base/napi/ternary/src/main.c @@ -172,3 +172,79 @@ napi_value stdlib_math_base_napi_fff_f( napi_env env, napi_callback_info info, f return v; } + +/** +* Invokes a ternary function accepting a double-precision floating-point number and two signed 32-bit integers and returning a double-precision floating-point number. +* +* ## Notes +* +* - This function expects that the callback `info` argument provides access to the following JavaScript arguments: +* +* - `x`: input value. +* - `y`: input value. +* - `z`: input value. +* +* @param env environment under which the function is invoked +* @param info callback data +* @param fcn ternary function +* @return function return value as a Node-API double-precision floating-point number +*/ +napi_value stdlib_math_base_napi_dii_d( napi_env env, napi_callback_info info, double (*fcn)( double, int32_t, int32_t ) ) { + napi_status status; + + size_t argc = 3; + napi_value argv[ 3 ]; + status = napi_get_cb_info( env, info, &argc, argv, NULL, NULL ); + assert( status == napi_ok ); + + if ( argc < 3 ) { + status = napi_throw_error( env, NULL, "invalid invocation. Must provide three numbers." ); + assert( status == napi_ok ); + return NULL; + } + + napi_valuetype vtype0; + status = napi_typeof( env, argv[ 0 ], &vtype0 ); + assert( status == napi_ok ); + if ( vtype0 != napi_number ) { + status = napi_throw_type_error( env, NULL, "invalid argument. First argument must be a number." ); + assert( status == napi_ok ); + return NULL; + } + + napi_valuetype vtype1; + status = napi_typeof( env, argv[ 1 ], &vtype1 ); + assert( status == napi_ok ); + if ( vtype1 != napi_number ) { + status = napi_throw_type_error( env, NULL, "invalid argument. Second argument must be a number." ); + assert( status == napi_ok ); + return NULL; + } + + napi_valuetype vtype2; + status = napi_typeof( env, argv[ 2 ], &vtype2 ); + assert( status == napi_ok ); + if ( vtype2 != napi_number ) { + status = napi_throw_type_error( env, NULL, "invalid argument. Third argument must be a number." ); + assert( status == napi_ok ); + return NULL; + } + + double x; + status = napi_get_value_double( env, argv[ 0 ], &x ); + assert( status == napi_ok ); + + int32_t y; + status = napi_get_value_int32( env, argv[ 1 ], &y ); + assert( status == napi_ok ); + + int32_t z; + status = napi_get_value_int32( env, argv[ 2 ], &z ); + assert( status == napi_ok ); + + napi_value v; + status = napi_create_double( env, fcn( x, y, z ), &v ); + assert( status == napi_ok ); + + return v; +}