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

93 lines
2.3 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"
// Forward declarations.
namespace arma
{
template <typename T>
class SpMat_MapMat_val;
template <typename T>
class SpSubview_MapMat_val;
}
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*>;
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-03-24 08:59:29 +00:00
*to_native_object<native_t>(zobj) = val;
} else {
**to_native_object<native_t>(zobj) = val;
}
}
2019-03-24 10:57:21 +00:00
zend_always_inline
static zend_object *create(native_t init_val)
{
2019-03-25 07:14:53 +00:00
if constexpr (IsSparse) {
2019-03-24 10:57:21 +00:00
return object_create<native_t>(ce, [&init_val](native_t *obj) {
memcpy(obj, &init_val, sizeof(native_t));
return &handlers;
});
} else {
return object_create<native_t>(ce, [init_val](native_t *obj) {
*obj = init_val;
return &handlers;
});
}
}
2019-03-24 08:59:29 +00:00
PHP_ARMA_CE_HANDLRES_DECLARE();
private:
static ZEND_NAMED_FUNCTION(val);
static ZEND_NAMED_FUNCTION(setTo);
2019-03-24 10:57:21 +00:00
static T get_val(zend_object*);
2019-03-24 08:59:29 +00:00
static void ce_init(const char*, zend_class_entry*);
PHP_ARMA_START_ME()
2019-03-25 07:14:53 +00:00
PHP_ARMA_ME(val, ZEND_ACC_PUBLIC)
2019-03-24 08:59:29 +00:00
PHP_ARMA_ME(setTo, ZEND_ACC_PUBLIC)
PHP_ARMA_END_ME();
};
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();
inline zend_class_entry *mapval_ce;
inline zend_class_entry *sp_mapval_ce;
inline zend_class_entry *spsv_mapval_ce;
}
2019-03-25 07:14:53 +00:00
#endif // !PHP_ARMA_MAPVAL_HH