This commit is contained in:
CismonX 2019-04-16 21:23:47 +08:00
parent 8163e4af9d
commit 1461b148b2
4 changed files with 44 additions and 29 deletions

View File

@ -1,2 +1,6 @@
# ext-armadillo # php-armadillo
PHP binding for Armadillo.
[![Travis-CI](https://travis-ci.org/CismonX/php-armadillo.svg?branch=master)](https://travis-ci.org/CismonX/php-armadillo)
[![MIT license](https://img.shields.io/badge/licence-MIT-blue.svg)](https://opensource.org/licenses/MIT)
PHP bindings for Armadillo.

View File

@ -90,7 +90,7 @@ namespace php_arma
return false; return false;
} }
PHP_ARMA_OPERATOR_BEGIN(Z_OBJCE_P(zv1), complex_ce) PHP_ARMA_OPERATOR_BEGIN(zv1, complex_ce)
PHP_ARMA_COMPLEX_OPERATOR(double, add) PHP_ARMA_COMPLEX_OPERATOR(double, add)
PHP_ARMA_OPERATOR_END(); PHP_ARMA_OPERATOR_END();
@ -105,7 +105,7 @@ namespace php_arma
return false; return false;
} }
PHP_ARMA_OPERATOR_BEGIN(Z_OBJCE_P(zv1), complex_ce) PHP_ARMA_OPERATOR_BEGIN(zv1, complex_ce)
PHP_ARMA_COMPLEX_OPERATOR_ASSIGN(double, add) PHP_ARMA_COMPLEX_OPERATOR_ASSIGN(double, add)
PHP_ARMA_OPERATOR_END(); PHP_ARMA_OPERATOR_END();
@ -120,7 +120,7 @@ namespace php_arma
return false; return false;
} }
PHP_ARMA_OPERATOR_BEGIN(Z_OBJCE_P(zv1), complex_ce) PHP_ARMA_OPERATOR_BEGIN(zv1, complex_ce)
PHP_ARMA_COMPLEX_OPERATOR(double, sub) PHP_ARMA_COMPLEX_OPERATOR(double, sub)
PHP_ARMA_OPERATOR_END(); PHP_ARMA_OPERATOR_END();
@ -135,7 +135,7 @@ namespace php_arma
return false; return false;
} }
PHP_ARMA_OPERATOR_BEGIN(Z_OBJCE_P(zv1), complex_ce) PHP_ARMA_OPERATOR_BEGIN(zv1, complex_ce)
PHP_ARMA_COMPLEX_OPERATOR_ASSIGN(double, sub) PHP_ARMA_COMPLEX_OPERATOR_ASSIGN(double, sub)
PHP_ARMA_OPERATOR_END(); PHP_ARMA_OPERATOR_END();
@ -150,7 +150,7 @@ namespace php_arma
return false; return false;
} }
PHP_ARMA_OPERATOR_BEGIN(Z_OBJCE_P(zv1), complex_ce) PHP_ARMA_OPERATOR_BEGIN(zv1, complex_ce)
PHP_ARMA_COMPLEX_OPERATOR(double, mul) PHP_ARMA_COMPLEX_OPERATOR(double, mul)
PHP_ARMA_OPERATOR_END(); PHP_ARMA_OPERATOR_END();
@ -165,7 +165,7 @@ namespace php_arma
return false; return false;
} }
PHP_ARMA_OPERATOR_BEGIN(Z_OBJCE_P(zv1), complex_ce) PHP_ARMA_OPERATOR_BEGIN(zv1, complex_ce)
PHP_ARMA_COMPLEX_OPERATOR_ASSIGN(double, mul) PHP_ARMA_COMPLEX_OPERATOR_ASSIGN(double, mul)
PHP_ARMA_OPERATOR_END(); PHP_ARMA_OPERATOR_END();
@ -180,7 +180,7 @@ namespace php_arma
return false; return false;
} }
PHP_ARMA_OPERATOR_BEGIN(Z_OBJCE_P(zv1), complex_ce) PHP_ARMA_OPERATOR_BEGIN(zv1, complex_ce)
PHP_ARMA_COMPLEX_OPERATOR(double, div) PHP_ARMA_COMPLEX_OPERATOR(double, div)
PHP_ARMA_OPERATOR_END(); PHP_ARMA_OPERATOR_END();
@ -195,7 +195,7 @@ namespace php_arma
return false; return false;
} }
PHP_ARMA_OPERATOR_BEGIN(Z_OBJCE_P(zv1), complex_ce) PHP_ARMA_OPERATOR_BEGIN(zv1, complex_ce)
PHP_ARMA_COMPLEX_OPERATOR_ASSIGN(double, div) PHP_ARMA_COMPLEX_OPERATOR_ASSIGN(double, div)
PHP_ARMA_OPERATOR_END(); PHP_ARMA_OPERATOR_END();
@ -210,7 +210,7 @@ namespace php_arma
return false; return false;
} }
PHP_ARMA_OPERATOR_BEGIN(Z_OBJCE_P(zv1), complex_ce) PHP_ARMA_OPERATOR_BEGIN(zv1, complex_ce)
PHP_ARMA_COMPLEX_OPERATOR(double, pow) PHP_ARMA_COMPLEX_OPERATOR(double, pow)
PHP_ARMA_OPERATOR_END(); PHP_ARMA_OPERATOR_END();
@ -225,7 +225,7 @@ namespace php_arma
return false; return false;
} }
PHP_ARMA_OPERATOR_BEGIN(Z_OBJCE_P(zv1), complex_ce) PHP_ARMA_OPERATOR_BEGIN(zv1, complex_ce)
PHP_ARMA_COMPLEX_OPERATOR_ASSIGN(double, pow) PHP_ARMA_COMPLEX_OPERATOR_ASSIGN(double, pow)
PHP_ARMA_OPERATOR_END(); PHP_ARMA_OPERATOR_END();
@ -240,7 +240,7 @@ namespace php_arma
return false; return false;
} }
PHP_ARMA_OPERATOR_BEGIN(Z_OBJCE_P(zv1), complex_ce) PHP_ARMA_OPERATOR_BEGIN(zv1, complex_ce)
PHP_ARMA_COMPLEX_OPERATOR(double, conj) PHP_ARMA_COMPLEX_OPERATOR(double, conj)
PHP_ARMA_OPERATOR_END(); PHP_ARMA_OPERATOR_END();
@ -248,18 +248,29 @@ namespace php_arma
}); });
} }
template <typename... Ts>
zend_always_inline
void set_op_handlers(Ts... op_handlers)
{
for (auto [opcode, handler] : { op_handlers... }) {
zend_set_user_opcode_handler(opcode, handler);
}
}
void operators_init() void operators_init()
{ {
zend_set_user_opcode_handler(ZEND_ADD, add_handler); set_op_handlers(
zend_set_user_opcode_handler(ZEND_ASSIGN_ADD, add_assign_handler); std::tuple(ZEND_ADD, add_handler),
zend_set_user_opcode_handler(ZEND_SUB, sub_handler); std::tuple(ZEND_ASSIGN_ADD, add_assign_handler),
zend_set_user_opcode_handler(ZEND_ASSIGN_SUB, sub_assign_handler); std::tuple(ZEND_SUB, sub_handler),
zend_set_user_opcode_handler(ZEND_MUL, mul_handler); std::tuple(ZEND_ASSIGN_SUB, sub_assign_handler),
zend_set_user_opcode_handler(ZEND_ASSIGN_MUL, mul_assign_handler); std::tuple(ZEND_MUL, mul_handler),
zend_set_user_opcode_handler(ZEND_DIV, div_handler); std::tuple(ZEND_ASSIGN_MUL, mul_assign_handler),
zend_set_user_opcode_handler(ZEND_ASSIGN_DIV, div_assign_handler); std::tuple(ZEND_DIV, div_handler),
zend_set_user_opcode_handler(ZEND_POW, pow_handler); std::tuple(ZEND_ASSIGN_DIV, div_assign_handler),
zend_set_user_opcode_handler(ZEND_ASSIGN_POW, pow_assign_handler); std::tuple(ZEND_POW, pow_handler),
zend_set_user_opcode_handler(ZEND_BW_NOT, bw_not_handler); std::tuple(ZEND_ASSIGN_POW, pow_assign_handler),
std::tuple(ZEND_BW_NOT, bw_not_handler)
);
} }
} }

View File

@ -4,12 +4,12 @@
// @Author CismonX // @Author CismonX
// //
#ifndef PHP_ARMA_OPERATOR_HH #ifndef PHP_ARMA_OPERATORS_HH
#define PHP_ARMA_OPERATOR_HH #define PHP_ARMA_OPERATORS_HH
namespace php_arma namespace php_arma
{ {
void operators_init(); void operators_init();
} }
#endif // !PHP_ARMA_OPERATOR_HH #endif // !PHP_ARMA_OPERATORS_HH

View File

@ -69,9 +69,9 @@ extern zend_module_entry arma_module_entry;
/// Helper macros for handling operator overloading. /// Helper macros for handling operator overloading.
#define PHP_ARMA_OPERATOR_BEGIN(ce, parent_ce) \ #define PHP_ARMA_OPERATOR_BEGIN(zv, parent_ce) \
{ \ { \
auto _ce = ce; \ auto _ce = Z_OBJCE_P(zv); \
if (instanceof_function(_ce, parent_ce)) { if (instanceof_function(_ce, parent_ce)) {
#define PHP_ARMA_OPERATOR_END() \ #define PHP_ARMA_OPERATOR_END() \