2019-03-14 15:04:34 +00:00
|
|
|
//
|
|
|
|
// 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();
|
2019-03-15 15:25:24 +00:00
|
|
|
auto has_imag = num_args == 2;
|
2019-03-14 15:04:34 +00:00
|
|
|
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)) {
|
2019-03-15 15:25:24 +00:00
|
|
|
if (UNEXPECTED(!zval_check_scalar<T>(real))) {
|
|
|
|
return;
|
2019-03-16 11:49:50 +00:00
|
|
|
}
|
2019-03-14 15:04:34 +00:00
|
|
|
object_set_property(Z_OBJ_P(current), 0, real);
|
|
|
|
if (EXPECTED(has_imag)) {
|
2019-03-15 15:25:24 +00:00
|
|
|
if (UNEXPECTED(!zval_check_scalar<T>(imag))) {
|
|
|
|
return;
|
2019-03-16 11:49:50 +00:00
|
|
|
}
|
2019-03-14 15:04:34 +00:00
|
|
|
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-15 15:25:24 +00:00
|
|
|
|
2019-03-19 05:28:45 +00:00
|
|
|
Z_OBJ_HT_P(current) = PHP_ARMA_HANDLERS(complex, T);
|
2019-03-15 15:25:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2019-03-16 11:49:50 +00:00
|
|
|
}
|
2019-03-15 15:25:24 +00:00
|
|
|
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));
|
2019-03-14 15:04:34 +00:00
|
|
|
}
|
|
|
|
|
2019-03-16 11:49:50 +00:00
|
|
|
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));
|
2019-03-16 11:49:50 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2019-03-14 15:04:34 +00:00
|
|
|
void complex_init()
|
|
|
|
{
|
2019-03-19 05:28:45 +00:00
|
|
|
complex_ce = abstract_class_register("Complex");
|
2019-03-14 15:04:34 +00:00
|
|
|
|
2019-03-16 11:49:50 +00:00
|
|
|
complex_ce_init<double>(complex_ce);
|
2019-03-14 15:04:34 +00:00
|
|
|
}
|
2019-03-15 15:25:24 +00:00
|
|
|
|
2019-03-14 15:04:34 +00:00
|
|
|
zend_class_entry *complex_ce;
|
2019-03-15 15:25:24 +00:00
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
PHP_ARMA_DEFINE_CE(complex, T);
|
|
|
|
template <typename T>
|
|
|
|
PHP_ARMA_DEFINE_OBJECT_HANDLER(complex, T);
|
2019-03-14 15:04:34 +00:00
|
|
|
}
|