// // php-armadillo/complex.hh // // @Author CismonX // #ifndef PHP_ARMA_COMPLEX_HH #define PHP_ARMA_COMPLEX_HH #include "php_arma.hh" #include using cx_double = std::complex; namespace php_arma { template struct complex { friend void complex_init(); PHP_ARMA_CE_HANDLRES_DECLARE(); private: static ZEND_NAMED_FUNCTION(__construct); static void write_property(zval*, zval*, zval*, void**); static void ce_init(const char*, zend_class_entry*); PHP_ARMA_START_ME() PHP_ARMA_ME(__construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) PHP_ARMA_END_ME(); }; void complex_init(); inline zend_class_entry *complex_ce; /// 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 constexpr auto 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