implement replace()
and transform()
This commit is contained in:
parent
9b353bb011
commit
36b4cb977b
51
src/base.cc
51
src/base.cc
|
@ -62,13 +62,58 @@ namespace php_arma
|
|||
template <typename T, typename T1>
|
||||
PHP_ARMA_METHOD(base, replace, T, T1)
|
||||
{
|
||||
|
||||
zval *old_value;
|
||||
zval *new_value;
|
||||
ZEND_PARSE_PARAMETERS_START(2, 2)
|
||||
Z_PARAM_ZVAL(old_value)
|
||||
Z_PARAM_ZVAL(new_value)
|
||||
ZEND_PARSE_PARAMETERS_END();
|
||||
|
||||
if (UNEXPECTED(!zval_check_scalar<T>(old_value) || !zval_check_scalar<T>(new_value) )) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto native = THIS_NATIVE;
|
||||
native->replace(zval_get_scalar<T>(old_value), zval_get_scalar<T>(new_value));
|
||||
}
|
||||
|
||||
template <typename T, typename T1>
|
||||
PHP_ARMA_METHOD(base, transform, T, T1)
|
||||
{
|
||||
|
||||
zend_fcall_info fci;
|
||||
zend_fcall_info_cache fcc;
|
||||
ZEND_PARSE_PARAMETERS_START(1, 1)
|
||||
Z_PARAM_FUNC(fci, fcc);
|
||||
ZEND_PARSE_PARAMETERS_END();
|
||||
|
||||
zval params[1], retval;
|
||||
fci.param_count = 1;
|
||||
fci.params = params;
|
||||
fci.retval = &retval;
|
||||
|
||||
if constexpr (std::is_same_v<T, cx_double>) {
|
||||
// prevent segfault in `zval_set_scalar()`..
|
||||
ZVAL_UNDEF(¶ms[0]);
|
||||
}
|
||||
|
||||
auto native = THIS_NATIVE;
|
||||
native->transform([&fci, &fcc](auto&& val) {
|
||||
zval_set_scalar(&fci.params[0], val);
|
||||
zend_call_function(&fci, &fcc);
|
||||
if (!zval_check_scalar<T>(fci.retval)) {
|
||||
zval_ptr_dtor(fci.retval);
|
||||
return T();
|
||||
}
|
||||
T retval = zval_get_scalar<T>(fci.retval);
|
||||
if constexpr (std::is_same_v<T, cx_double>) {
|
||||
zval_ptr_dtor(fci.retval);
|
||||
}
|
||||
return retval;
|
||||
});
|
||||
|
||||
if constexpr (std::is_same_v<T, cx_double>) {
|
||||
zval_ptr_dtor(¶ms[0]);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T, typename T1>
|
||||
|
@ -86,7 +131,7 @@ namespace php_arma
|
|||
fci.retval = &retval;
|
||||
|
||||
auto native = THIS_NATIVE;
|
||||
native->for_each([&fci, &fcc](T& val) {
|
||||
native->for_each([&fci, &fcc](auto&& val) {
|
||||
ZVAL_OBJ(&fci.params[0], mapval_dense<T>::create(&val));
|
||||
zend_call_function(&fci, &fcc);
|
||||
zval_ptr_dtor(&fci.params[0]);
|
||||
|
|
|
@ -82,10 +82,10 @@ interface Base extends Countable
|
|||
*
|
||||
* Transformation is done column-by-column, and for SpMat only non-zero elements will be transformed.
|
||||
*
|
||||
* @param callable $callback (Scalar) => $new_value
|
||||
* @param callable $transform (number|Complex) => $new_value
|
||||
* @return void
|
||||
*/
|
||||
function transform($callback);
|
||||
function transform($transform);
|
||||
|
||||
/**
|
||||
* For each element, pass its reference to a callback function.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
--TEST--
|
||||
Test for method `forEach()`.
|
||||
Test for methods `forEach()`, `transform()`, `replace()`.
|
||||
--SKIPIF--
|
||||
<?php
|
||||
require_once 'includes/loaded.php';
|
||||
|
@ -19,6 +19,13 @@ $mat->forEach(function (Arma\MapVal $elem) {
|
|||
});
|
||||
echo PHP_EOL;
|
||||
$mat->rawPrint();
|
||||
$mat->transform(function (int $elem) {
|
||||
return $elem + 4;
|
||||
});
|
||||
$mat->rawPrint();
|
||||
$mat->replace(10, -1);
|
||||
$mat->replace(11, -2);
|
||||
$mat->rawPrint();
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
|
@ -27,3 +34,7 @@ $mat->rawPrint();
|
|||
1324
|
||||
5 6
|
||||
7 8
|
||||
9 10
|
||||
11 12
|
||||
9 -1
|
||||
-2 12
|
Reference in New Issue
Block a user