diff --git a/include/rotgen/common/ref.hpp b/include/rotgen/common/ref.hpp index 9e21c92..6611d47 100644 --- a/include/rotgen/common/ref.hpp +++ b/include/rotgen/common/ref.hpp @@ -66,6 +66,8 @@ namespace rotgen using parent::setConstant; using parent::setRandom; using parent::setIdentity; + using parent::outerStride; + using parent::innerStride; using parent::operator=; @@ -99,6 +101,12 @@ namespace rotgen static_assert((Ref::storage_order & 1) == storage_order, "ref: Incompatible storage layout"); } + template + ref ( ref& b ) + requires(std::same_as && (TT::storage_order & 1) == storage_order) + : parent(b.data(), b.rows(), b.cols(), stride_type{b.outerStride(),b.innerStride()}) + {} + ref(parent& m) : parent(m.data(), m.rows(), m.cols()) {} friend std::ostream& operator<<(std::ostream& os, ref const& r) @@ -152,6 +160,8 @@ namespace rotgen using parent::Constant; using parent::Random; using parent::Identity; + using parent::outerStride; + using parent::innerStride; using parent::operator=; @@ -178,6 +188,12 @@ namespace rotgen : parent(b.data(), b.rows(), b.cols(), stride_type{b.outerStride(),b.innerStride()}) {} + template + ref ( ref const& b ) + requires(std::same_as && (TT::storage_order & 1) == storage_order) + : parent(b.data(), b.rows(), b.cols(), stride_type{b.outerStride(),b.innerStride()}) + {} + ref(parent const& m) : parent(m.data(), m.rows(), m.cols()) {} friend std::ostream& operator<<(std::ostream& os, ref const& r) diff --git a/test/integration/ref_magic.cpp b/test/integration/ref_magic.cpp new file mode 100644 index 0000000..7a04e93 --- /dev/null +++ b/test/integration/ref_magic.cpp @@ -0,0 +1,58 @@ +//================================================================================================== +/* + ROTGEN - Runtime Overlay for Eigen + Copyright : CODE RECKONS + SPDX-License-Identifier: BSL-1.0 +*/ +//================================================================================================== +#include "unit/tests.hpp" +#include + +template +using column = rotgen::matrix; + +template +using column_ref = rotgen::ref>; + +template +using const_column_ref = rotgen::ref const>; + + +template +void process( column_ref v ) +{ + v(0) = rotgen::sum(v); +} + +auto process( column_ref<> v ) +{ + auto sz = v.size(); + switch(sz) + { + case 1 : process<1>(v); break; + case 2 : process<2>(v); break; + case 3 : process<3>(v); break; + default: break; + } + + return sz; +} + +TTS_CASE("Reference of reference check") +{ + auto v1 = rotgen::matrix::Ones(); + auto v2 = rotgen::matrix::Random(); + auto v3 = rotgen::matrix::Constant(6.66); + + auto sum1 = v1(0); + auto sum2 = v2(0) + v2(1); + auto sum3 = v3(0) + v3(1) + v3(2); + + TTS_EQUAL(process(v1), 1); + TTS_EQUAL(process(v2), 2); + TTS_EQUAL(process(v3), 3); + + TTS_EQUAL(v1[0], sum1); + TTS_EQUAL(v2[0], sum2); + TTS_EQUAL(v3[0], sum3); +}; \ No newline at end of file