implement `__toString()` and `__debugInfo()`

This commit is contained in:
CismonX 2019-08-20 01:29:31 +08:00
parent c50b39110e
commit b3845fa5f6
9 changed files with 129 additions and 22 deletions

View File

@ -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()

View File

@ -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();

View File

@ -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>

View File

@ -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**);

View File

@ -236,4 +236,11 @@ abstract class Complex
* @return static
*/
function atanh() {}
/**
* Convert this complex number to string.
*
* @return string
*/
function __toString() {}
}

View File

@ -226,4 +226,11 @@ class CxDouble extends Complex
* @return CxDouble
*/
function atanh() {}
/**
* {@inheritDoc}
*
* @return string
*/
function __toString() {}
}

View File

@ -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();
}

32
tests/016-debug-info.phpt Normal file
View File

@ -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"
}

View File

@ -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;