Reformat code. Use static assertion. Change `Complex` to abstract class.
This commit is contained in:
parent
88136e9900
commit
0bd7ee0163
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
#include "complex.hh"
|
#include "complex.hh"
|
||||||
|
|
||||||
|
#include <zend_inheritance.h>
|
||||||
|
|
||||||
namespace php_arma
|
namespace php_arma
|
||||||
{
|
{
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -30,12 +32,12 @@ namespace php_arma
|
||||||
if (EXPECTED(has_real)) {
|
if (EXPECTED(has_real)) {
|
||||||
if (UNEXPECTED(!zval_check_scalar<T>(real))) {
|
if (UNEXPECTED(!zval_check_scalar<T>(real))) {
|
||||||
return;
|
return;
|
||||||
};
|
}
|
||||||
object_set_property(Z_OBJ_P(current), 0, real);
|
object_set_property(Z_OBJ_P(current), 0, real);
|
||||||
if (EXPECTED(has_imag)) {
|
if (EXPECTED(has_imag)) {
|
||||||
if (UNEXPECTED(!zval_check_scalar<T>(imag))) {
|
if (UNEXPECTED(!zval_check_scalar<T>(imag))) {
|
||||||
return;
|
return;
|
||||||
};
|
}
|
||||||
object_set_property(Z_OBJ_P(current), 1, imag);
|
object_set_property(Z_OBJ_P(current), 1, imag);
|
||||||
} else {
|
} else {
|
||||||
object_set_property(Z_OBJ_P(current), 1, &zero_val);
|
object_set_property(Z_OBJ_P(current), 1, &zero_val);
|
||||||
|
@ -63,7 +65,7 @@ namespace php_arma
|
||||||
|
|
||||||
if (UNEXPECTED(!zval_check_scalar<T>(value))) {
|
if (UNEXPECTED(!zval_check_scalar<T>(value))) {
|
||||||
return;
|
return;
|
||||||
};
|
}
|
||||||
if (strcmp(Z_STRVAL_P(member), "real") == 0) {
|
if (strcmp(Z_STRVAL_P(member), "real") == 0) {
|
||||||
object_set_property(Z_OBJ_P(obj), 0, value);
|
object_set_property(Z_OBJ_P(obj), 0, value);
|
||||||
return;
|
return;
|
||||||
|
@ -77,15 +79,22 @@ namespace php_arma
|
||||||
"Bad property name for %s, expected 'real' or 'imag', '%s' given.", Z_OBJNAME_P(obj), Z_STRVAL_P(member));
|
"Bad property name for %s, expected 'real' or 'imag', '%s' given.", Z_OBJNAME_P(obj), Z_STRVAL_P(member));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void complex_ce_init(zend_class_entry *parent_ce)
|
||||||
|
{
|
||||||
|
PHP_ARMA_CE(complex, T) = class_register("CxDouble", PHP_ARMA_METHODS(complex, T));
|
||||||
|
zend_do_inheritance(PHP_ARMA_CE(complex, T), parent_ce);
|
||||||
|
property_declare(PHP_ARMA_CE(complex, T), "real");
|
||||||
|
property_declare(PHP_ARMA_CE(complex, T), "imag");
|
||||||
|
object_handlers_init(PHP_ARMA_HANDLERS(complex, T));
|
||||||
|
PHP_ARMA_HANDLER_SET(complex, write_property, complex_write_property, T);
|
||||||
|
}
|
||||||
|
|
||||||
void complex_init()
|
void complex_init()
|
||||||
{
|
{
|
||||||
complex_ce = interface_register("Complex");
|
complex_ce = class_register("Complex", nullptr);
|
||||||
|
|
||||||
PHP_ARMA_CE(complex, double) = class_register("CxDouble", PHP_ARMA_METHODS(complex, double), complex_ce);
|
complex_ce_init<double>(complex_ce);
|
||||||
property_declare(PHP_ARMA_CE(complex, double), "real");
|
|
||||||
property_declare(PHP_ARMA_CE(complex, double), "imag");
|
|
||||||
object_handlers_init(PHP_ARMA_HANDLERS(complex, double));
|
|
||||||
PHP_ARMA_HANDLER_SET(complex, write_property, complex_write_property, double);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
zend_class_entry *complex_ce;
|
zend_class_entry *complex_ce;
|
||||||
|
|
|
@ -106,9 +106,9 @@ namespace php_arma
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename... Ts>
|
template <typename... Ts>
|
||||||
zend_class_entry *class_register(const char *name, const zend_function_entry *methods, Ts... parents)
|
zend_class_entry *class_register(const char *name, const zend_function_entry *methods, Ts... interfaces)
|
||||||
{
|
{
|
||||||
return ce_init(name, methods, zend_register_internal_class, parents...);
|
return ce_init(name, methods, zend_register_internal_class, interfaces...);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Although methods are declared in interfaces as you see in the stubs,
|
// Although methods are declared in interfaces as you see in the stubs,
|
||||||
|
@ -151,7 +151,7 @@ namespace php_arma
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T *to_native_object(zend_object* zobj)
|
T *to_native_object(zend_object *zobj)
|
||||||
{
|
{
|
||||||
return reinterpret_cast<T*>(zobj) - 1;
|
return reinterpret_cast<T*>(zobj) - 1;
|
||||||
}
|
}
|
||||||
|
@ -193,10 +193,19 @@ namespace php_arma
|
||||||
ZVAL_LONG(zv, val);
|
ZVAL_LONG(zv, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename>
|
||||||
|
struct false_type : std::false_type {};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void assert_bad_type()
|
||||||
|
{
|
||||||
|
static_assert(false_type<T>::value, "Type should be zend_long, double or cx_double");
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T zval_get_scalar(zval *zv)
|
T zval_get_scalar(zval *zv)
|
||||||
{
|
{
|
||||||
assert(false);
|
assert_bad_type<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <> zend_always_inline
|
template <> zend_always_inline
|
||||||
|
@ -211,10 +220,10 @@ namespace php_arma
|
||||||
return Z_LVAL_P(zv);
|
return Z_LVAL_P(zv);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename>
|
template <typename T>
|
||||||
bool zval_is_scalar(zval *zv)
|
bool zval_is_scalar(zval *zv)
|
||||||
{
|
{
|
||||||
assert(false);
|
assert_bad_type<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <> zend_always_inline
|
template <> zend_always_inline
|
||||||
|
@ -247,10 +256,10 @@ namespace php_arma
|
||||||
static const int value = IS_OBJECT;
|
static const int value = IS_OBJECT;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename>
|
template <typename T>
|
||||||
const char *scalar_type_name()
|
const char *scalar_type_name()
|
||||||
{
|
{
|
||||||
assert(false);
|
assert_bad_type<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <> zend_always_inline
|
template <> zend_always_inline
|
||||||
|
|
Reference in New Issue