// // php-armadillo/complex.cc // // @Author CismonX // #include "complex.hh" namespace php_arma { template 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(0)); zval *current = getThis(); if (EXPECTED(has_real)) { if (UNEXPECTED(!zval_check_scalar(real))) { return; }; object_set_property(Z_OBJ_P(current), 0, real); if (EXPECTED(has_imag)) { if (UNEXPECTED(!zval_check_scalar(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); } Z_OBJ_P(current)->handlers = 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 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(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)); } void complex_init() { complex_ce = interface_register("Complex"); PHP_ARMA_CE(complex, double) = class_register("CxDouble", PHP_ARMA_METHODS(complex, double), complex_ce); property_declare(PHP_ARMA_CE(complex, double), "real"); property_declare(PHP_ARMA_CE(complex, double), "imag"); object_handlers_init(PHP_ARMA_HANDLERS(complex, double)); PHP_ARMA_HANDLER_SET(complex, write_property, complex_write_property, double); } zend_class_entry *complex_ce; template PHP_ARMA_DEFINE_CE(complex, T); template PHP_ARMA_DEFINE_OBJECT_HANDLER(complex, T); }