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/mapval.hh

141 lines
4.0 KiB
C++
Raw Normal View History

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"
#ifdef PHP_ARMA_OPERATORS
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()
#endif // PHP_ARMA_OPERATORS
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
static zend_object *create(zval *parent, native_t init_val)
2019-03-24 10:57:21 +00:00
{
zend_object *zobj;
2019-03-25 07:14:53 +00:00
if constexpr (IsSparse) {
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 {
zobj = object_create<native_t>(ce, [init_val](auto obj) {
2019-03-24 10:57:21 +00:00
*obj = init_val;
return &handlers;
});
}
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