This repository has been archived on 2020-06-07. You can view files and clone it, but cannot push or open issues or pull requests.
php-armadillo/src/dense.cc

150 lines
4.0 KiB
C++
Raw Normal View History

2019-05-25 18:21:48 +00:00
//
// php-armadillo/dense.cc
//
// @Author CismonX
//
#include "dense.hh"
2019-06-06 15:56:10 +00:00
#include "base.hh"
2019-05-25 18:21:48 +00:00
#include "mat.hh"
2019-07-07 16:57:25 +00:00
#include "subview_mat.hh"
2019-09-15 19:53:01 +00:00
#include "diagonal.hh"
2019-05-25 18:21:48 +00:00
namespace php_arma
{
2019-06-06 15:56:10 +00:00
template <typename T, typename T1>
PHP_ARMA_METHOD(dense, equals, T, T1)
2019-05-25 18:21:48 +00:00
{
zval *other;
ZEND_PARSE_PARAMETERS_START(1, 1)
2019-08-18 12:36:22 +00:00
Z_PARAM_ZVAL(other)
ZEND_PARSE_PARAMETERS_END();
2019-06-12 03:11:27 +00:00
operators::equals(&EX(This), other, return_value);
2019-05-30 06:01:40 +00:00
}
2019-06-06 15:56:10 +00:00
template <typename T, typename T1>
PHP_ARMA_METHOD(dense, notEquals, T, T1)
2019-05-30 06:01:40 +00:00
{
2019-06-06 15:56:10 +00:00
zval *other;
ZEND_PARSE_PARAMETERS_START(1, 1)
2019-08-18 12:36:22 +00:00
Z_PARAM_ZVAL(other)
2019-06-06 15:56:10 +00:00
ZEND_PARSE_PARAMETERS_END();
2019-05-25 18:21:48 +00:00
2019-06-12 03:11:27 +00:00
operators::not_equals(&EX(This), other, return_value);
2019-05-25 18:21:48 +00:00
}
template <typename T, typename T1>
PHP_ARMA_METHOD(dense, greaterThan, T, T1)
{
2019-06-06 15:56:10 +00:00
zval *other;
ZEND_PARSE_PARAMETERS_START(1, 1)
2019-08-18 12:36:22 +00:00
Z_PARAM_ZVAL(other)
2019-06-06 15:56:10 +00:00
ZEND_PARSE_PARAMETERS_END();
2019-06-12 03:11:27 +00:00
operators::greater_than(&EX(This), other, return_value);
2019-05-25 18:21:48 +00:00
}
template <typename T, typename T1>
PHP_ARMA_METHOD(dense, smallerThan, T, T1)
{
2019-06-06 15:56:10 +00:00
zval *other;
ZEND_PARSE_PARAMETERS_START(1, 1)
2019-08-18 12:36:22 +00:00
Z_PARAM_ZVAL(other)
2019-06-06 15:56:10 +00:00
ZEND_PARSE_PARAMETERS_END();
2019-06-12 03:11:27 +00:00
operators::smaller_than(&EX(This), other, return_value);
2019-05-25 18:21:48 +00:00
}
template <typename T, typename T1>
PHP_ARMA_METHOD(dense, notGreaterThan, T, T1)
{
2019-06-06 15:56:10 +00:00
zval *other;
ZEND_PARSE_PARAMETERS_START(1, 1)
2019-08-18 12:36:22 +00:00
Z_PARAM_ZVAL(other)
2019-06-06 15:56:10 +00:00
ZEND_PARSE_PARAMETERS_END();
2019-06-12 03:11:27 +00:00
operators::not_greater_than(&EX(This), other, return_value);
2019-05-25 18:21:48 +00:00
}
template <typename T, typename T1>
PHP_ARMA_METHOD(dense, notSmallerThan, T, T1)
{
2019-06-06 15:56:10 +00:00
zval *other;
ZEND_PARSE_PARAMETERS_START(1, 1)
2019-08-18 12:36:22 +00:00
Z_PARAM_ZVAL(other)
2019-06-06 15:56:10 +00:00
ZEND_PARSE_PARAMETERS_END();
2019-06-12 03:11:27 +00:00
operators::not_smaller_than(&EX(This), other, return_value);
2019-05-25 18:21:48 +00:00
}
template <typename T, typename T1>
PHP_ARMA_METHOD(dense, fill, T, T1)
{
2019-07-23 16:55:42 +00:00
zval *value;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_ZVAL(value);
ZEND_PARSE_PARAMETERS_END();
if (!zval_check_scalar<T>(value)) {
return;
}
auto native = THIS_NATIVE;
native->fill(zval_get_scalar<T>(value));
2019-05-25 18:21:48 +00:00
}
2019-09-15 19:53:01 +00:00
template <typename T, typename ChildT>
PHP_ARMA_METHOD(dense, imbue, T, ChildT)
2019-05-25 18:21:48 +00:00
{
2019-07-23 16:55:42 +00:00
zend_fcall_info fci;
zend_fcall_info_cache fcc;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_FUNC(fci, fcc);
ZEND_PARSE_PARAMETERS_END();
2019-09-15 19:53:01 +00:00
if constexpr (std::is_same_v<ChildT, diagview<T>>) {
throw_error("This method is not yet supported on diagview");
return;
} else {
zval retval;
fci.retval = &retval;
auto native = THIS_NATIVE;
native->imbue([&fci, &fcc]() {
zend_call_function(&fci, &fcc);
if (!zval_check_scalar<T>(fci.retval)) {
zval_ptr_dtor(fci.retval);
return T();
}
T retval = zval_get_scalar<T>(fci.retval);
if constexpr (std::is_same_v<T, cx_double>) {
zval_ptr_dtor(fci.retval);
}
return retval;
});
}
2019-05-25 18:21:48 +00:00
}
template <typename T, typename T1>
PHP_ARMA_START_ME(dense, T, T1)
PHP_ARMA_ME(equals, ZEND_ACC_PUBLIC)
PHP_ARMA_ME(notEquals, ZEND_ACC_PUBLIC)
PHP_ARMA_ME(greaterThan, ZEND_ACC_PUBLIC)
PHP_ARMA_ME(smallerThan, ZEND_ACC_PUBLIC)
PHP_ARMA_ME(notGreaterThan, ZEND_ACC_PUBLIC)
PHP_ARMA_ME(notSmallerThan, ZEND_ACC_PUBLIC)
PHP_ARMA_ME(fill, ZEND_ACC_PUBLIC)
PHP_ARMA_ME(imbue, ZEND_ACC_PUBLIC)
PHP_ARMA_END_ME();
void dense_init()
{
2019-06-06 15:56:10 +00:00
dense_ce = interface_register<dense_php_name>(base_ce);
2019-05-25 18:21:48 +00:00
}
PHP_ARMA_INSTANTIATE(dense, mat);
2019-07-07 16:57:25 +00:00
PHP_ARMA_INSTANTIATE(dense, subview_mat);
2019-09-15 19:53:01 +00:00
PHP_ARMA_INSTANTIATE(dense, diagview);
2019-05-25 18:21:48 +00:00
}