diff --git a/src/diagonal.cc b/src/diagonal.cc index 750275d..5eec5f0 100644 --- a/src/diagonal.cc +++ b/src/diagonal.cc @@ -29,6 +29,7 @@ namespace php_arma PHP_ARMA_FENTRY((base ::me)), PHP_ARMA_FENTRY((parent_t ::me)), PHP_ARMA_FENTRY((non_resizable::me)), + PHP_ARMA_FENTRY((subview ::me)), PHP_ARMA_FENTRY(me) )); ce->create_object = object_non_constructible; diff --git a/src/mapval.cc b/src/mapval.cc index 15ef336..4cccf05 100644 --- a/src/mapval.cc +++ b/src/mapval.cc @@ -5,6 +5,7 @@ // #include "mapval.hh" +#include "subview.hh" #include "complex.hh" namespace php_arma @@ -42,7 +43,10 @@ namespace php_arma zend_always_inline void mapval::ce_init(zend_class_entry *parent_ce) { - ce = class_register(parent_ce, me); + ce = class_register(parent_ce, fentry_list_concat( + PHP_ARMA_FENTRY((subview::me)), + PHP_ARMA_FENTRY(me) + )); ce->create_object = object_non_constructible; declare_subview_parent(ce); @@ -67,17 +71,17 @@ namespace php_arma { scalar_ce = interface_register(); - mapval_ce = abstract_class_register(scalar_ce); + mapval_ce = abstract_class_register(scalar_ce, subview_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); + sp_mapval_ce = abstract_class_register(scalar_ce, subview_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); + spsv_mapval_ce = abstract_class_register(scalar_ce, subview_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); diff --git a/src/subview.cc b/src/subview.cc index 3829f9a..95cf281 100644 --- a/src/subview.cc +++ b/src/subview.cc @@ -5,11 +5,32 @@ // #include "subview.hh" +#include "mapval.hh" +#include "subview_mat.hh" +#include "diagonal.hh" namespace php_arma { + template + PHP_ARMA_METHOD(subview, getParent, T, T1) + { + auto current = Z_OBJ(EX(This)); + ZVAL_COPY(return_value, OBJ_PROP_NUM(current, 0)); + } + + template + PHP_ARMA_START_ME(subview, T, T1) + PHP_ARMA_ME(getParent, ZEND_ACC_PUBLIC) + PHP_ARMA_END_ME(); + void subview_init() { subview_ce = interface_register(); } + + PHP_ARMA_INSTANTIATE(subview, mapval_dense); + PHP_ARMA_INSTANTIATE(subview, mapval_spmat); + PHP_ARMA_INSTANTIATE(subview, mapval_sp_subview); + PHP_ARMA_INSTANTIATE(subview, subview_mat); + PHP_ARMA_INSTANTIATE(subview, diagview); } diff --git a/src/subview.hh b/src/subview.hh index f69f4dd..c251502 100644 --- a/src/subview.hh +++ b/src/subview.hh @@ -11,6 +11,17 @@ namespace php_arma { + template + struct subview + { + using native_t = typename ChildT::native_t; + + PHP_ARMA_COMMON_DECLARE(); + + private: + static PHP_FUNCTION(getParent); + }; + void subview_init(); constexpr const char subview_php_name[] = "Subview"; diff --git a/src/subview_mat.cc b/src/subview_mat.cc index 4fdc532..953cdd7 100644 --- a/src/subview_mat.cc +++ b/src/subview_mat.cc @@ -31,6 +31,7 @@ namespace php_arma PHP_ARMA_FENTRY((non_resizable ::me)), PHP_ARMA_FENTRY((non_resizable_matrix ::me)), PHP_ARMA_FENTRY((dense_non_resizable_matrix::me)), + PHP_ARMA_FENTRY((subview ::me)), PHP_ARMA_FENTRY(me) )); ce->create_object = object_non_constructible; diff --git a/stubs/MapVal.php b/stubs/MapVal.php index e18f975..6d2f7c3 100644 --- a/stubs/MapVal.php +++ b/stubs/MapVal.php @@ -7,7 +7,7 @@ namespace Arma; * * @package Arma */ -abstract class MapVal implements Internal\Scalar +abstract class MapVal implements Internal\Scalar, Internal\Subview { } diff --git a/stubs/SpMapVal.php b/stubs/SpMapVal.php index 95f4f59..6115bc1 100644 --- a/stubs/SpMapVal.php +++ b/stubs/SpMapVal.php @@ -7,7 +7,7 @@ namespace Arma; * * @package Arma */ -abstract class SpMapVal implements Internal\Scalar +abstract class SpMapVal implements Internal\Scalar, Internal\Subview { } diff --git a/stubs/internal/Subview.php b/stubs/internal/Subview.php index 9970324..0085e01 100644 --- a/stubs/internal/Subview.php +++ b/stubs/internal/Subview.php @@ -9,5 +9,10 @@ namespace Arma\Internal; */ interface Subview { - + /** + * Returns the parent object referenced by current subview. + * + * @return static + */ + function getParent(); } diff --git a/tests/010-subview-mat.phpt b/tests/010-subview-mat.phpt index 5d88933..0179556 100644 --- a/tests/010-subview-mat.phpt +++ b/tests/010-subview-mat.phpt @@ -34,6 +34,9 @@ batch_assert('orphaned `SvMat`', [$orphaned_submat->at(0, 0)->val(), 1], [$orphaned_submat->at(1, 0)->val(), 3] ); +$orphaned_submat->getParent()->rawPrint(); ?> --EXPECT-- +1 2 +3 4