2019-03-14 15:04:34 +00:00
|
|
|
//
|
|
|
|
// php-armadillo/complex.hh
|
|
|
|
//
|
|
|
|
// @Author CismonX
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef PHP_ARMA_COMPLEX_HH
|
|
|
|
#define PHP_ARMA_COMPLEX_HH
|
|
|
|
|
2019-03-15 15:25:24 +00:00
|
|
|
#include "php_arma.hh"
|
2019-03-14 15:04:34 +00:00
|
|
|
|
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
|
|
|
|
2019-03-14 15:04:34 +00:00
|
|
|
namespace php_arma
|
|
|
|
{
|
|
|
|
template <typename T>
|
2019-03-20 14:55:19 +00:00
|
|
|
struct complex
|
|
|
|
{
|
|
|
|
friend void complex_init();
|
2019-03-14 15:04:34 +00:00
|
|
|
|
2019-03-23 16:24:34 +00:00
|
|
|
PHP_ARMA_CE_HANDLRES_DECLARE();
|
2019-03-14 15:04:34 +00:00
|
|
|
|
2019-03-20 14:55:19 +00:00
|
|
|
private:
|
|
|
|
static ZEND_NAMED_FUNCTION(__construct);
|
2019-03-15 15:25:24 +00:00
|
|
|
|
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-15 15:25:24 +00:00
|
|
|
|
2019-03-22 08:30:44 +00:00
|
|
|
template <>
|
|
|
|
zend_always_inline
|
2019-03-15 15:25:24 +00:00
|
|
|
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
|
2019-03-15 15:25:24 +00:00
|
|
|
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);
|
|
|
|
}
|
2019-03-14 15:04:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif //!PHP_ARMA_COMPLEX_HH
|