This repository has been archived on 2020-06-07. You can view files and clone it, but cannot push or open issues or pull requests.
php-armadillo/src/complex.cc

104 lines
3.1 KiB
C++
Raw Normal View History

//
// php-armadillo/complex.cc
//
// @Author CismonX
//
#include "complex.hh"
namespace php_arma
{
template <typename T>
PHP_METHOD(Complex, __construct)
{
zval *real, *imag;
ZEND_PARSE_PARAMETERS_START(0, 2)
Z_PARAM_OPTIONAL
Z_PARAM_ZVAL(real)
Z_PARAM_ZVAL(imag)
ZEND_PARSE_PARAMETERS_END();
auto num_args = EX_NUM_ARGS();
auto has_imag = num_args == 2;
auto has_real = num_args > 0;
zval zero_val;
zval_set_scalar(&zero_val, static_cast<T>(0));
zval *current = getThis();
if (EXPECTED(has_real)) {
if (UNEXPECTED(!zval_check_scalar<T>(real))) {
return;
}
object_set_property(Z_OBJ_P(current), 0, real);
if (EXPECTED(has_imag)) {
if (UNEXPECTED(!zval_check_scalar<T>(imag))) {
return;
}
object_set_property(Z_OBJ_P(current), 1, imag);
} else {
object_set_property(Z_OBJ_P(current), 1, &zero_val);
}
} else {
object_set_property(Z_OBJ_P(current), 0, &zero_val);
object_set_property(Z_OBJ_P(current), 1, &zero_val);
}
2019-03-19 05:28:45 +00:00
Z_OBJ_HT_P(current) = PHP_ARMA_HANDLERS(complex, T);
}
PHP_ARMA_START_ME_1(complex, T)
PHP_ARMA_ME(Complex, __construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR, T)
PHP_ARMA_END_ME_1(complex, T)
template <typename T>
void complex_write_property(zval* obj, zval* member, zval* value, void** unused)
{
// Theoretically we won't get non-string values here, add type check just in case.
if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
zend_throw_exception(zend_ce_error, "Unexpected error. Please contact developer.", -2);
return;
}
if (UNEXPECTED(!zval_check_scalar<T>(value))) {
return;
}
if (strcmp(Z_STRVAL_P(member), "real") == 0) {
object_set_property(Z_OBJ_P(obj), 0, value);
return;
}
if (strcmp(Z_STRVAL_P(member), "imag") == 0) {
object_set_property(Z_OBJ_P(obj), 1, value);
return;
}
zend_throw_exception_ex(zend_ce_exception, -2,
"Bad property name for %s, expected 'real' or 'imag', '%s' given.", Z_OBJNAME_P(obj), Z_STRVAL_P(member));
}
template <typename T>
void complex_ce_init(zend_class_entry *parent_ce)
{
2019-03-19 05:28:45 +00:00
PHP_ARMA_CE(complex, T) = class_register("CxDouble", parent_ce, PHP_ARMA_METHODS(complex, T));
property_declare(PHP_ARMA_CE(complex, T), "real");
property_declare(PHP_ARMA_CE(complex, T), "imag");
object_handlers_init(PHP_ARMA_HANDLERS(complex, T));
PHP_ARMA_HANDLER_SET(complex, write_property, complex_write_property, T);
}
void complex_init()
{
2019-03-19 05:28:45 +00:00
complex_ce = abstract_class_register("Complex");
complex_ce_init<double>(complex_ce);
}
zend_class_entry *complex_ce;
template <typename T>
PHP_ARMA_DEFINE_CE(complex, T);
template <typename T>
PHP_ARMA_DEFINE_OBJECT_HANDLER(complex, T);
}