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.hh
2019-03-27 16:29:00 +08:00

78 lines
1.7 KiB
C++

//
// php-armadillo/complex.hh
//
// @Author CismonX
//
#ifndef PHP_ARMA_COMPLEX_HH
#define PHP_ARMA_COMPLEX_HH
#include "php_arma.hh"
#include <complex>
using cx_double = std::complex<double>;
namespace php_arma
{
template <typename T>
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<cx_double>(zval *zv)
{
return Z_TYPE_P(zv) == IS_OBJECT && instanceof_function(Z_OBJCE_P(zv), PHP_ARMA_CE(complex, double));
}
template <>
zend_always_inline
const char *scalar_type_name<cx_double>()
{
return ZSTR_VAL(PHP_ARMA_CE(complex, double)->name);
}
template <>
zend_always_inline
cx_double zval_get_scalar<cx_double>(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