// // php-armadillo/dense_matrix.cc // // @Author CismonX // #include "dense_matrix.hh" #include "dense.hh" #include "matrix.hh" #include "mapval.hh" #include "mat.hh" #include namespace php_arma { template PHP_ARMA_METHOD(dense_matrix, __invoke, T, T1) { zend_long i, j; ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_LONG_DEREF(i) Z_PARAM_OPTIONAL Z_PARAM_LONG_DEREF(j) ZEND_PARSE_PARAMETERS_END(); auto native = THIS_NATIVE; zend_object *zobj; try { if (EX_NUM_ARGS() == 1) { zobj = mapval_dense::create(&native->operator()(i)); } else { zobj = mapval_dense::create(&native->operator()(i, j)); } } catch (const std::logic_error& err) { zend_throw_exception(zend_ce_exception, "index out of bounds", 0); return; } RETVAL_OBJ(zobj); } template PHP_ARMA_METHOD(dense_matrix, at, T, T1) { zend_long i, j; ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_LONG_DEREF(i) Z_PARAM_OPTIONAL Z_PARAM_LONG_DEREF(j) ZEND_PARSE_PARAMETERS_END(); auto native = THIS_NATIVE; zend_object *zobj; if (EX_NUM_ARGS() == 1) { zobj = mapval_dense::create(&native->at(i)); } else { zobj = mapval_dense::create(&native->at(i, j)); } RETVAL_OBJ(zobj); } template PHP_ARMA_METHOD(dense_matrix, col, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, row, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, cols, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, rows, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, submat, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, headCols, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, headRows, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, tailCols, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, tailRows, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, diag, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, eachRow, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, eachCol, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, i, T, T1) { } template PHP_ARMA_METHOD(dense_matrix, isSympd, T, T1) { zval *tol = nullptr; ZEND_PARSE_PARAMETERS_START(0, 1) Z_PARAM_OPTIONAL Z_PARAM_ZVAL_DEREF(tol) ZEND_PARSE_PARAMETERS_END(); auto native = THIS_NATIVE; if constexpr (std::is_same_v) { zend_throw_exception(zend_ce_error, "Method isSympd() is not supported on IMat.", 0); } else { if (tol == nullptr) { RETURN_BOOL(native->is_sympd()); } using base_t = typename arma::get_pod_type::result; if (!zval_check_scalar(tol)) { return; } RETVAL_BOOL(native->is_sympd(zval_get_scalar(tol))); } } template PHP_ARMA_START_ME(dense_matrix, T, T1) PHP_ARMA_ME(__invoke, ZEND_ACC_PUBLIC | ZEND_ACC_CALL_VIA_HANDLER) PHP_ARMA_ME(at, ZEND_ACC_PUBLIC) PHP_ARMA_ME(col, ZEND_ACC_PUBLIC) PHP_ARMA_ME(row, ZEND_ACC_PUBLIC) PHP_ARMA_ME(cols, ZEND_ACC_PUBLIC) PHP_ARMA_ME(rows, ZEND_ACC_PUBLIC) PHP_ARMA_ME(submat, ZEND_ACC_PUBLIC) PHP_ARMA_ME(headCols, ZEND_ACC_PUBLIC) PHP_ARMA_ME(headRows, ZEND_ACC_PUBLIC) PHP_ARMA_ME(tailCols, ZEND_ACC_PUBLIC) PHP_ARMA_ME(tailRows, ZEND_ACC_PUBLIC) PHP_ARMA_ME(diag, ZEND_ACC_PUBLIC) PHP_ARMA_ME(eachRow, ZEND_ACC_PUBLIC) PHP_ARMA_ME(eachCol, ZEND_ACC_PUBLIC) PHP_ARMA_ME(i, ZEND_ACC_PUBLIC) PHP_ARMA_ME(isSympd, ZEND_ACC_PUBLIC) PHP_ARMA_END_ME(); void dense_matrix_init() { dense_matrix_ce = interface_register(dense_ce, matrix_ce); } PHP_ARMA_INSTANTIATE(dense_matrix, mat); }