// // php-armadillo/complex.hh // // @Author CismonX // #ifndef PHP_ARMA_COMPLEX_HH #define PHP_ARMA_COMPLEX_HH #include "php_arma.hh" #include typedef std::complex cx_double; namespace php_arma { template PHP_METHOD(Complex, __construct); void complex_init(); extern zend_class_entry *complex_ce; template PHP_ARMA_DECLARE_CE_HANDLERS(complex); /// Helper functions for handling cx_double types. template <> zend_always_inline bool zval_is_scalar(zval *zv) { return Z_TYPE_P(zv) == IS_OBJECT && instanceof_function(Z_OBJCE_P(zv), PHP_ARMA_CE(complex, double)); } template <> struct scalar_type { static const int value = IS_OBJECT; }; template <> zend_always_inline const char *scalar_type_name() { return ZSTR_VAL(PHP_ARMA_CE(complex, double)->name); } template <> zend_always_inline cx_double zval_get_scalar(zval *zv) { auto zobj = Z_OBJ_P(zv); return { Z_DVAL_P(OBJ_PROP_NUM(zobj, 0)), Z_DVAL_P(OBJ_PROP_NUM(zobj, 1)) }; } zend_always_inline void zval_set_scalar(zval *zv, cx_double val) { auto zobj = object_create(PHP_ARMA_CE(complex, double), PHP_ARMA_HANDLERS(complex, double)); ZVAL_DOUBLE(OBJ_PROP_NUM(zobj, 0), val.real()); ZVAL_DOUBLE(OBJ_PROP_NUM(zobj, 1), val.imag()); zval_ptr_dtor(zv); ZVAL_OBJ(zv, zobj); } } #endif //!PHP_ARMA_COMPLEX_HH