// // php-armadillo/mapval.cc // // @Author CismonX // #include "mapval.hh" #include "complex.hh" #include namespace php_arma { template zend_always_inline T mapval::get_val(zend_object *zobj) { if constexpr (IsSparse) { return *to_native_object(zobj); } else { return **to_native_object(zobj); } } template PHP_ARMA_METHOD(mapval, val, T, B1, B2) { auto current = Z_OBJ_P(getThis()); zval_set_scalar(return_value, get_val(current)); } template PHP_ARMA_METHOD(mapval, setTo, T, B1, B2) { zval *val; ZEND_PARSE_PARAMETERS_START(1, 1) Z_PARAM_ZVAL_DEREF(val) ZEND_PARSE_PARAMETERS_END(); if (!zval_check_scalar(val)) { return; } auto current = Z_OBJ_P(getThis()); set_val(current, zval_get_scalar(val)); } template PHP_ARMA_START_ME(mapval, T, B1, B2) PHP_ARMA_ME(val, ZEND_ACC_PUBLIC) PHP_ARMA_ME(setTo, ZEND_ACC_PUBLIC) PHP_ARMA_END_ME(); template zend_always_inline void mapval::ce_init(zend_class_entry *parent_ce) { ce = class_register(parent_ce, me); ce->create_object = object_non_constructible; object_handlers_init(&handlers); handlers.offset = sizeof(native_t); handlers.clone_obj = nullptr; } PHP_ARMA_NAME_DECLARE(mapval_dense, "DMapVal", double); PHP_ARMA_NAME_DECLARE(mapval_dense, "IMapVal", zend_long); PHP_ARMA_NAME_DECLARE(mapval_dense, "CxDMapVal", cx_double); PHP_ARMA_NAME_DECLARE(mapval_spmat, "SpDMapVal", double); PHP_ARMA_NAME_DECLARE(mapval_spmat, "SpIMapVal", zend_long); PHP_ARMA_NAME_DECLARE(mapval_spmat, "SpCxDMapVal", cx_double); PHP_ARMA_NAME_DECLARE(mapval_sp_subview, "SpSvDMapVal", double); PHP_ARMA_NAME_DECLARE(mapval_sp_subview, "SpSvIMapVal", zend_long); PHP_ARMA_NAME_DECLARE(mapval_sp_subview, "SpSvCxDMapVal", cx_double); void mapval_init() { scalar_ce = interface_register(); mapval_ce = abstract_class_register(scalar_ce); mapval_dense::ce_init(mapval_ce); mapval_dense::ce_init(mapval_ce); mapval_dense::ce_init(mapval_ce); sp_mapval_ce = abstract_class_register(scalar_ce); mapval_spmat::ce_init(sp_mapval_ce); mapval_spmat::ce_init(sp_mapval_ce); mapval_spmat::ce_init(sp_mapval_ce); spsv_mapval_ce = abstract_class_register(scalar_ce); mapval_sp_subview::ce_init(spsv_mapval_ce); mapval_sp_subview::ce_init(spsv_mapval_ce); mapval_sp_subview::ce_init(spsv_mapval_ce); } }