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

84 lines
1.8 KiB
C++
Raw Normal View History

//
// php-armadillo/complex.hh
//
// @Author CismonX
//
#ifndef PHP_ARMA_COMPLEX_HH
#define PHP_ARMA_COMPLEX_HH
#include "php_arma.hh"
2019-03-17 03:30:03 +00:00
#include <complex>
2019-03-20 14:55:19 +00:00
using cx_double = std::complex<double>;
2019-03-17 03:30:03 +00:00
namespace php_arma
{
template <typename T>
2019-03-20 14:55:19 +00:00
struct complex
{
friend void complex_init();
2019-03-23 16:24:34 +00:00
PHP_ARMA_CE_HANDLRES_DECLARE();
2019-03-20 14:55:19 +00:00
private:
static ZEND_NAMED_FUNCTION(__construct);
2019-03-20 14:55:19 +00:00
static void write_property(zval*, zval*, zval*, void**);
2019-03-23 16:24:34 +00:00
static void ce_init(const char*, zend_class_entry*);
2019-03-20 14:55:19 +00:00
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;
2019-03-17 03:30:03 +00:00
/// Helper functions for handling cx_double types.
2019-03-22 08:30:44 +00:00
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));
}
2019-03-17 03:30:03 +00:00
template <>
2019-03-20 14:55:19 +00:00
struct scalar_type<cx_double>
{
static constexpr auto value = IS_OBJECT;
2019-03-17 03:30:03 +00:00
};
2019-03-22 08:30:44 +00:00
template <>
zend_always_inline
const char *scalar_type_name<cx_double>()
{
return ZSTR_VAL(PHP_ARMA_CE(complex, double)->name);
}
2019-03-17 03:30:03 +00:00
2019-03-22 08:30:44 +00:00
template <>
zend_always_inline
2019-03-17 03:30:03 +00:00
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