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 <zend_inheritance.h>
|
||||
|
||||
namespace php_arma
|
||||
{
|
||||
template <typename T>
|
||||
|
@ -30,12 +32,12 @@ namespace php_arma
|
|||
if (EXPECTED(has_real)) {
|
||||
if (UNEXPECTED(!zval_check_scalar<T>(real))) {
|
||||
return;
|
||||
};
|
||||
}
|
||||
object_set_property(Z_OBJ_P(current), 0, real);
|
||||
if (EXPECTED(has_imag)) {
|
||||
if (UNEXPECTED(!zval_check_scalar<T>(imag))) {
|
||||
return;
|
||||
};
|
||||
}
|
||||
object_set_property(Z_OBJ_P(current), 1, imag);
|
||||
} else {
|
||||
object_set_property(Z_OBJ_P(current), 1, &zero_val);
|
||||
|
@ -63,7 +65,7 @@ namespace php_arma
|
|||
|
||||
if (UNEXPECTED(!zval_check_scalar<T>(value))) {
|
||||
return;
|
||||
};
|
||||
}
|
||||
if (strcmp(Z_STRVAL_P(member), "real") == 0) {
|
||||
object_set_property(Z_OBJ_P(obj), 0, value);
|
||||
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));
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
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);
|
||||
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);
|
||||
complex_ce_init<double>(complex_ce);
|
||||
}
|
||||
|
||||
zend_class_entry *complex_ce;
|
||||
|
|
|
@ -106,9 +106,9 @@ namespace php_arma
|
|||
}
|
||||
|
||||
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,
|
||||
|
@ -151,7 +151,7 @@ namespace php_arma
|
|||
}
|
||||
|
||||
template <typename T>
|
||||
T *to_native_object(zend_object* zobj)
|
||||
T *to_native_object(zend_object *zobj)
|
||||
{
|
||||
return reinterpret_cast<T*>(zobj) - 1;
|
||||
}
|
||||
|
@ -193,10 +193,19 @@ namespace php_arma
|
|||
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>
|
||||
T zval_get_scalar(zval *zv)
|
||||
{
|
||||
assert(false);
|
||||
assert_bad_type<T>();
|
||||
}
|
||||
|
||||
template <> zend_always_inline
|
||||
|
@ -211,10 +220,10 @@ namespace php_arma
|
|||
return Z_LVAL_P(zv);
|
||||
}
|
||||
|
||||
template <typename>
|
||||
template <typename T>
|
||||
bool zval_is_scalar(zval *zv)
|
||||
{
|
||||
assert(false);
|
||||
assert_bad_type<T>();
|
||||
}
|
||||
|
||||
template <> zend_always_inline
|
||||
|
@ -247,10 +256,10 @@ namespace php_arma
|
|||
static const int value = IS_OBJECT;
|
||||
};
|
||||
|
||||
template <typename>
|
||||
template <typename T>
|
||||
const char *scalar_type_name()
|
||||
{
|
||||
assert(false);
|
||||
assert_bad_type<T>();
|
||||
}
|
||||
|
||||
template <> zend_always_inline
|
||||
|
|
Reference in New Issue