2019-03-24 08:59:29 +00:00
|
|
|
//
|
2019-03-24 10:57:21 +00:00
|
|
|
// php-armadillo/mapval.hh
|
2019-03-24 08:59:29 +00:00
|
|
|
//
|
|
|
|
// @Author CismonX
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef PHP_ARMA_MAPVAL_HH
|
|
|
|
#define PHP_ARMA_MAPVAL_HH
|
|
|
|
|
|
|
|
#include "php_arma.hh"
|
|
|
|
|
2019-06-06 15:56:10 +00:00
|
|
|
#define PHP_ARMA_MAPVAL_OPERATOR_EX(type, func) \
|
|
|
|
PHP_ARMA_OPERATOR_EX(mapval_dense <type>, func) \
|
|
|
|
PHP_ARMA_OPERATOR_EX(mapval_spmat <type>, func) \
|
|
|
|
PHP_ARMA_OPERATOR_EX(mapval_sp_subview<type>, func)
|
|
|
|
|
|
|
|
#define PHP_ARMA_MAPVAL_OPERATOR(func) \
|
|
|
|
PHP_ARMA_OPERATOR_BEGIN(scalar_ce) \
|
|
|
|
PHP_ARMA_MAPVAL_OPERATOR_EX(double, func) \
|
|
|
|
PHP_ARMA_MAPVAL_OPERATOR_EX(zend_long, func) \
|
|
|
|
PHP_ARMA_MAPVAL_OPERATOR_EX(cx_double, func) \
|
|
|
|
PHP_ARMA_OPERATOR_END()
|
|
|
|
|
2019-03-24 08:59:29 +00:00
|
|
|
namespace php_arma
|
|
|
|
{
|
|
|
|
template <typename T, bool IsSparse, bool IsSubview>
|
|
|
|
struct mapval
|
|
|
|
{
|
|
|
|
using sp_mapval_t = std::conditional_t<IsSubview,
|
|
|
|
arma::SpSubview_MapMat_val<T>, arma::SpMat_MapMat_val<T>>;
|
|
|
|
|
|
|
|
using native_t = std::conditional_t<IsSparse, sp_mapval_t, T*>;
|
|
|
|
|
2019-06-06 15:56:10 +00:00
|
|
|
struct operators;
|
|
|
|
|
2019-03-24 08:59:29 +00:00
|
|
|
friend void mapval_init();
|
|
|
|
|
|
|
|
zend_always_inline
|
|
|
|
static void set_val(zend_object *zobj, T val)
|
|
|
|
{
|
2019-03-25 07:14:53 +00:00
|
|
|
if constexpr (IsSparse) {
|
2019-05-27 08:51:46 +00:00
|
|
|
*ZOBJ_NATIVE(zobj) = val;
|
2019-03-24 08:59:29 +00:00
|
|
|
} else {
|
2019-05-27 08:51:46 +00:00
|
|
|
**ZOBJ_NATIVE(zobj) = val;
|
2019-03-24 08:59:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-06 15:56:10 +00:00
|
|
|
zend_always_inline
|
|
|
|
static T get_val(zend_object *zobj)
|
|
|
|
{
|
|
|
|
if constexpr (IsSparse) {
|
|
|
|
return *ZOBJ_NATIVE(zobj);
|
|
|
|
} else {
|
|
|
|
return **ZOBJ_NATIVE(zobj);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-24 10:57:21 +00:00
|
|
|
zend_always_inline
|
2019-09-22 17:22:08 +00:00
|
|
|
static zend_object *create(zval *parent, native_t init_val)
|
2019-03-24 10:57:21 +00:00
|
|
|
{
|
2019-09-22 17:22:08 +00:00
|
|
|
zend_object *zobj;
|
2019-03-25 07:14:53 +00:00
|
|
|
if constexpr (IsSparse) {
|
2019-09-22 17:22:08 +00:00
|
|
|
zobj = object_create<native_t>(ce, [&init_val](auto obj) {
|
2019-03-24 10:57:21 +00:00
|
|
|
memcpy(obj, &init_val, sizeof(native_t));
|
|
|
|
return &handlers;
|
|
|
|
});
|
|
|
|
} else {
|
2019-09-22 17:22:08 +00:00
|
|
|
zobj = object_create<native_t>(ce, [init_val](auto obj) {
|
2019-03-24 10:57:21 +00:00
|
|
|
*obj = init_val;
|
|
|
|
return &handlers;
|
|
|
|
});
|
|
|
|
}
|
2019-09-22 17:22:08 +00:00
|
|
|
object_set_property(zobj, 0, parent);
|
|
|
|
return zobj;
|
2019-03-24 10:57:21 +00:00
|
|
|
}
|
2019-03-24 08:59:29 +00:00
|
|
|
|
|
|
|
PHP_ARMA_CE_HANDLRES_DECLARE();
|
|
|
|
|
|
|
|
private:
|
2019-04-13 10:17:01 +00:00
|
|
|
PHP_ARMA_COMMON_DECLARE();
|
2019-04-01 06:21:38 +00:00
|
|
|
|
2019-03-29 12:18:44 +00:00
|
|
|
static PHP_FUNCTION(val);
|
|
|
|
static PHP_FUNCTION(setTo);
|
2019-03-24 08:59:29 +00:00
|
|
|
|
2019-04-01 06:04:46 +00:00
|
|
|
static void ce_init(zend_class_entry*);
|
2019-03-24 08:59:29 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <typename T>
|
2019-03-25 07:14:53 +00:00
|
|
|
using mapval_dense = mapval<T, false, false>;
|
2019-03-24 08:59:29 +00:00
|
|
|
|
|
|
|
template <typename T>
|
2019-03-25 07:14:53 +00:00
|
|
|
using mapval_spmat = mapval<T, true, false>;
|
2019-03-24 08:59:29 +00:00
|
|
|
|
|
|
|
template <typename T>
|
2019-03-25 07:14:53 +00:00
|
|
|
using mapval_sp_subview = mapval<T, true, true>;
|
2019-03-24 08:59:29 +00:00
|
|
|
|
|
|
|
void mapval_init();
|
|
|
|
|
2019-04-13 10:17:01 +00:00
|
|
|
constexpr const char scalar_php_name[] = "Scalar";
|
2019-04-01 06:04:46 +00:00
|
|
|
constexpr const char mapval_php_name[] = "MapVal";
|
|
|
|
constexpr const char sp_mapval_php_name[] = "SpMapVal";
|
|
|
|
constexpr const char spsv_mapval_php_name[] = "SpSvMapVal";
|
|
|
|
|
|
|
|
inline zend_class_entry *scalar_ce;
|
2019-03-24 08:59:29 +00:00
|
|
|
inline zend_class_entry *mapval_ce;
|
|
|
|
inline zend_class_entry *sp_mapval_ce;
|
|
|
|
inline zend_class_entry *spsv_mapval_ce;
|
2019-06-06 15:56:10 +00:00
|
|
|
|
|
|
|
template <typename T, bool IsSparse, bool IsSubview>
|
|
|
|
struct mapval<T, IsSparse, IsSubview>::operators
|
|
|
|
{
|
|
|
|
zend_always_inline
|
2019-06-07 06:32:15 +00:00
|
|
|
static bool mul(
|
2019-06-06 15:56:10 +00:00
|
|
|
#if PHP_VERSION_ID < 70300
|
2019-06-07 06:32:15 +00:00
|
|
|
zval *zv1, zval *zv2,
|
2019-06-06 15:56:10 +00:00
|
|
|
#else
|
2019-06-07 06:32:15 +00:00
|
|
|
zval *zv2, zval *zv1,
|
|
|
|
#endif
|
|
|
|
zval *retval)
|
|
|
|
{
|
|
|
|
if (EXPECTED(Z_TYPE_P(zv1) == IS_LONG)) {
|
|
|
|
if (Z_LVAL_P(zv1) == 1) {
|
|
|
|
zval_set_scalar(retval, get_val(Z_OBJ_P(zv2)));
|
|
|
|
} else if (Z_LVAL_P(zv1) == -1) {
|
|
|
|
zval_set_scalar(retval, -get_val(Z_OBJ_P(zv2)));
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
2019-06-06 15:56:10 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
};
|
2019-03-24 08:59:29 +00:00
|
|
|
}
|
|
|
|
|
2019-03-25 07:14:53 +00:00
|
|
|
#endif // !PHP_ARMA_MAPVAL_HH
|