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 binding for Armadillo.
# php-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;
}
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_OPERATOR_END();
@ -105,7 +105,7 @@ namespace php_arma
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_OPERATOR_END();
@ -120,7 +120,7 @@ namespace php_arma
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_OPERATOR_END();
@ -135,7 +135,7 @@ namespace php_arma
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_OPERATOR_END();
@ -150,7 +150,7 @@ namespace php_arma
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_OPERATOR_END();
@ -165,7 +165,7 @@ namespace php_arma
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_OPERATOR_END();
@ -180,7 +180,7 @@ namespace php_arma
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_OPERATOR_END();
@ -195,7 +195,7 @@ namespace php_arma
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_OPERATOR_END();
@ -210,7 +210,7 @@ namespace php_arma
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_OPERATOR_END();
@ -225,7 +225,7 @@ namespace php_arma
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_OPERATOR_END();
@ -240,7 +240,7 @@ namespace php_arma
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_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()
{
zend_set_user_opcode_handler(ZEND_ADD, add_handler);
zend_set_user_opcode_handler(ZEND_ASSIGN_ADD, add_assign_handler);
zend_set_user_opcode_handler(ZEND_SUB, sub_handler);
zend_set_user_opcode_handler(ZEND_ASSIGN_SUB, sub_assign_handler);
zend_set_user_opcode_handler(ZEND_MUL, mul_handler);
zend_set_user_opcode_handler(ZEND_ASSIGN_MUL, mul_assign_handler);
zend_set_user_opcode_handler(ZEND_DIV, div_handler);
zend_set_user_opcode_handler(ZEND_ASSIGN_DIV, div_assign_handler);
zend_set_user_opcode_handler(ZEND_POW, pow_handler);
zend_set_user_opcode_handler(ZEND_ASSIGN_POW, pow_assign_handler);
zend_set_user_opcode_handler(ZEND_BW_NOT, bw_not_handler);
set_op_handlers(
std::tuple(ZEND_ADD, add_handler),
std::tuple(ZEND_ASSIGN_ADD, add_assign_handler),
std::tuple(ZEND_SUB, sub_handler),
std::tuple(ZEND_ASSIGN_SUB, sub_assign_handler),
std::tuple(ZEND_MUL, mul_handler),
std::tuple(ZEND_ASSIGN_MUL, mul_assign_handler),
std::tuple(ZEND_DIV, div_handler),
std::tuple(ZEND_ASSIGN_DIV, div_assign_handler),
std::tuple(ZEND_POW, pow_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
//
#ifndef PHP_ARMA_OPERATOR_HH
#define PHP_ARMA_OPERATOR_HH
#ifndef PHP_ARMA_OPERATORS_HH
#define PHP_ARMA_OPERATORS_HH
namespace php_arma
{
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.
#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)) {
#define PHP_ARMA_OPERATOR_END() \