implement `__toString()` and `__debugInfo()`
This commit is contained in:
parent
c50b39110e
commit
b3845fa5f6
80
src/base.cc
80
src/base.cc
|
@ -5,6 +5,7 @@
|
|||
//
|
||||
|
||||
#include "base.hh"
|
||||
#include "dense.hh"
|
||||
#include "mat.hh"
|
||||
#include "subview_mat.hh"
|
||||
#include "mapval.hh"
|
||||
|
@ -15,6 +16,21 @@
|
|||
|
||||
namespace php_arma
|
||||
{
|
||||
template <typename T>
|
||||
zend_always_inline
|
||||
void to_string(T *src, zval *dest)
|
||||
{
|
||||
if (UNEXPECTED(src->n_elem == 0)) {
|
||||
ZVAL_EMPTY_STRING(dest);
|
||||
return;
|
||||
}
|
||||
std::ostringstream oss;
|
||||
src->raw_print(oss);
|
||||
std::string str = oss.str();
|
||||
std::replace(str.begin(), str.end(), '\n', ';');
|
||||
ZVAL_STRINGL(dest, str.c_str(), str.size() - 1);
|
||||
}
|
||||
|
||||
template <typename T, typename T1>
|
||||
PHP_ARMA_METHOD(base, nElem, T, T1)
|
||||
{
|
||||
|
@ -260,28 +276,52 @@ namespace php_arma
|
|||
}
|
||||
}
|
||||
|
||||
template <typename T, typename T1>
|
||||
PHP_ARMA_METHOD(base, __toString, T, T1)
|
||||
{
|
||||
auto native = THIS_NATIVE;
|
||||
to_string(native, return_value);
|
||||
}
|
||||
|
||||
template <typename T, typename ChildT>
|
||||
PHP_ARMA_METHOD(base, __debugInfo, T, ChildT)
|
||||
{
|
||||
auto native = THIS_NATIVE;
|
||||
zval n_rows, n_cols, data;
|
||||
ZVAL_LONG(&n_rows, native->n_rows);
|
||||
ZVAL_LONG(&n_cols, native->n_cols);
|
||||
to_string(native, &data);
|
||||
auto retval = zend_new_array(HT_MIN_SIZE);
|
||||
zend_hash_str_add(retval, "nRows", sizeof("nRows") - 1, &n_rows);
|
||||
zend_hash_str_add(retval, "nCols", sizeof("nRows") - 1, &n_cols);
|
||||
zend_hash_str_add(retval, "data", sizeof("data") - 1, &data);
|
||||
RETVAL_ARR(retval);
|
||||
}
|
||||
|
||||
template <typename T, typename T1>
|
||||
PHP_ARMA_START_ME(base, T, T1)
|
||||
PHP_ARMA_ME(nElem, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(add, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(sub, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(neg, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(mul, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(dotMul, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(div, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(replace, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(transform, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(forEach, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(min, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(max, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(indexMin, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(indexMax, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(isEmpty, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(isFinite, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(hasInf, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(hasNan, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(print, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(rawPrint, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(nElem, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(add, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(sub, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(neg, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(mul, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(dotMul, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(div, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(replace, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(transform, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(forEach, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(min, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(max, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(indexMin, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(indexMax, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(isEmpty, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(isFinite, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(hasInf, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(hasNan, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(print, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(rawPrint, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(__toString, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(__debugInfo, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_END_ME();
|
||||
|
||||
void base_init()
|
||||
|
|
|
@ -148,6 +148,8 @@ namespace php_arma
|
|||
static PHP_FUNCTION(hasNan);
|
||||
static PHP_FUNCTION(print);
|
||||
static PHP_FUNCTION(rawPrint);
|
||||
static PHP_FUNCTION(__toString);
|
||||
static PHP_FUNCTION(__debugInfo);
|
||||
};
|
||||
|
||||
void base_init();
|
||||
|
|
|
@ -279,6 +279,16 @@ namespace php_arma
|
|||
zval_set_scalar(return_value, std::atanh(current));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
PHP_ARMA_METHOD(complex, __toString, T)
|
||||
{
|
||||
auto current = zval_get_scalar<native_t>(&EX(This));
|
||||
std::ostringstream oss;
|
||||
oss << current;
|
||||
auto retval = oss.str();
|
||||
RETVAL_STRING(retval.c_str());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
zval *complex<T>::read_dimension(zval *obj, zval *offset, int type, zval*)
|
||||
{
|
||||
|
@ -375,6 +385,7 @@ namespace php_arma
|
|||
PHP_ARMA_ME(asinh, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(acosh, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(atanh, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_ME(__toString, ZEND_ACC_PUBLIC)
|
||||
PHP_ARMA_END_ME();
|
||||
|
||||
template <typename T>
|
||||
|
|
|
@ -106,6 +106,7 @@ namespace php_arma
|
|||
static PHP_FUNCTION(asinh);
|
||||
static PHP_FUNCTION(acosh);
|
||||
static PHP_FUNCTION(atanh);
|
||||
static PHP_FUNCTION(__toString);
|
||||
|
||||
static zval *read_dimension(zval*, zval*, int, zval*);
|
||||
static void write_property(zval*, zval*, zval*, void**);
|
||||
|
|
|
@ -236,4 +236,11 @@ abstract class Complex
|
|||
* @return static
|
||||
*/
|
||||
function atanh() {}
|
||||
|
||||
/**
|
||||
* Convert this complex number to string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function __toString() {}
|
||||
}
|
||||
|
|
|
@ -226,4 +226,11 @@ class CxDouble extends Complex
|
|||
* @return CxDouble
|
||||
*/
|
||||
function atanh() {}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function __toString() {}
|
||||
}
|
||||
|
|
|
@ -174,4 +174,11 @@ interface Base extends Countable
|
|||
* @return void
|
||||
*/
|
||||
function rawPrint($stream = STDOUT);
|
||||
|
||||
/**
|
||||
* Returns a string of all elements in this object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function __toString();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
--TEST--
|
||||
Test for methods `__toString()` and `__debugInfo()`.
|
||||
--SKIPIF--
|
||||
<?php
|
||||
require_once 'includes/loaded.php';
|
||||
is_php_arma_loaded();
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
require_once 'includes/assert.php';
|
||||
|
||||
$cx = Arma\cx_double(1., 2.);
|
||||
$mat = Arma\IMat::fromString('1 2; 3 4');
|
||||
echo $cx, ' ', $mat, PHP_EOL;
|
||||
var_dump(strval($cx));
|
||||
var_dump(strval($mat));
|
||||
var_dump($mat);
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
(1,2) 1 2;3 4
|
||||
string(5) "(1,2)"
|
||||
string(7) "1 2;3 4"
|
||||
object(Arma\IMat)#2 (3) {
|
||||
["nRows"]=>
|
||||
int(2)
|
||||
["nCols"]=>
|
||||
int(2)
|
||||
["data"]=>
|
||||
string(7) "1 2;3 4"
|
||||
}
|
|
@ -17,8 +17,8 @@ function batch_assert_ex($test, $comp, ...$cases) {
|
|||
continue;
|
||||
}
|
||||
echo "Test for $test failed.\n";
|
||||
$expected = var_export($expected, true);
|
||||
$got = var_export($got, true);
|
||||
$expected = strval($expected);
|
||||
$got = strval($got);
|
||||
echo "Expected:\n$expected\n";
|
||||
echo "Got:\n$got\n";
|
||||
return false;
|
||||
|
|
Reference in New Issue