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

67 lines
1.5 KiB
C++

//
// php-armadillo/complex.hh
//
// @Author CismonX
//
#ifndef PHP_ARMA_COMPLEX_HH
#define PHP_ARMA_COMPLEX_HH
#include "php_arma.hh"
#include <complex>
typedef std::complex<double> cx_double;
namespace php_arma
{
template <typename T>
PHP_METHOD(Complex, __construct);
void complex_init();
extern zend_class_entry *complex_ce;
template <typename T>
PHP_ARMA_DECLARE_CE_HANDLERS(complex);
/// 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 <>
struct scalar_type<cx_double> {
static const int value = IS_OBJECT;
};
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