// // php-armadillo/mapval.hh // // @Author CismonX // #ifndef PHP_ARMA_MAPVAL_HH #define PHP_ARMA_MAPVAL_HH #include "php_arma.hh" // Forward declarations. namespace arma { template class SpMat_MapMat_val; template class SpSubview_MapMat_val; } namespace php_arma { template struct mapval { using sp_mapval_t = std::conditional_t, arma::SpMat_MapMat_val>; using native_t = std::conditional_t; friend void mapval_init(); zend_always_inline static void set_val(zend_object *zobj, T val) { if constexpr (IsSparse) { *to_native_object(zobj) = val; } else { **to_native_object(zobj) = val; } } zend_always_inline static zend_object *create(native_t init_val) { if constexpr (IsSparse) { return object_create(ce, [&init_val](native_t *obj) { memcpy(obj, &init_val, sizeof(native_t)); return &handlers; }); } else { return object_create(ce, [init_val](native_t *obj) { *obj = init_val; return &handlers; }); } } PHP_ARMA_CE_HANDLRES_DECLARE(); private: static ZEND_NAMED_FUNCTION(val); static ZEND_NAMED_FUNCTION(setTo); static T get_val(zend_object*); static void ce_init(const char*, zend_class_entry*); PHP_ARMA_START_ME() PHP_ARMA_ME(val, ZEND_ACC_PUBLIC) PHP_ARMA_ME(setTo, ZEND_ACC_PUBLIC) PHP_ARMA_END_ME(); }; template using mapval_dense = mapval; template using mapval_spmat = mapval; template using mapval_sp_subview = mapval; void mapval_init(); inline zend_class_entry *mapval_ce; inline zend_class_entry *sp_mapval_ce; inline zend_class_entry *spsv_mapval_ce; } #endif // !PHP_ARMA_MAPVAL_HH