Reformat code. Use static assertion. Change `Complex` to abstract class.

This commit is contained in:
CismonX 2019-03-16 19:49:50 +08:00
parent 88136e9900
commit 0bd7ee0163
2 changed files with 35 additions and 17 deletions

View File

@ -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;

View File

@ -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