From 0bd7ee0163d76fb2fa968ee846931d63002570ca Mon Sep 17 00:00:00 2001 From: CismonX Date: Sat, 16 Mar 2019 19:49:50 +0800 Subject: [PATCH] Reformat code. Use static assertion. Change `Complex` to abstract class. --- src/complex.cc | 27 ++++++++++++++++++--------- src/php_arma.hh | 25 +++++++++++++++++-------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/complex.cc b/src/complex.cc index c98716b..060875c 100644 --- a/src/complex.cc +++ b/src/complex.cc @@ -6,6 +6,8 @@ #include "complex.hh" +#include + namespace php_arma { template @@ -30,12 +32,12 @@ namespace php_arma if (EXPECTED(has_real)) { if (UNEXPECTED(!zval_check_scalar(real))) { return; - }; + } object_set_property(Z_OBJ_P(current), 0, real); if (EXPECTED(has_imag)) { if (UNEXPECTED(!zval_check_scalar(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(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 + 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(complex_ce); } zend_class_entry *complex_ce; diff --git a/src/php_arma.hh b/src/php_arma.hh index 932ac91..6a253ce 100644 --- a/src/php_arma.hh +++ b/src/php_arma.hh @@ -106,9 +106,9 @@ namespace php_arma } template - 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 - T *to_native_object(zend_object* zobj) + T *to_native_object(zend_object *zobj) { return reinterpret_cast(zobj) - 1; } @@ -193,10 +193,19 @@ namespace php_arma ZVAL_LONG(zv, val); } + template + struct false_type : std::false_type {}; + + template + void assert_bad_type() + { + static_assert(false_type::value, "Type should be zend_long, double or cx_double"); + } + template T zval_get_scalar(zval *zv) { - assert(false); + assert_bad_type(); } template <> zend_always_inline @@ -211,10 +220,10 @@ namespace php_arma return Z_LVAL_P(zv); } - template + template bool zval_is_scalar(zval *zv) { - assert(false); + assert_bad_type(); } template <> zend_always_inline @@ -247,10 +256,10 @@ namespace php_arma static const int value = IS_OBJECT; }; - template + template const char *scalar_type_name() { - assert(false); + assert_bad_type(); } template <> zend_always_inline