From f78c37f0afdfe4cdf7e69368c91dbf5af9ac34bc Mon Sep 17 00:00:00 2001 From: wk Date: Thu, 9 Nov 2023 12:19:38 +0100 Subject: [PATCH] traits::match: use correct strides --- Eigen/src/Core/Ref.h | 12 +++++++----- test/ref.cpp | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Eigen/src/Core/Ref.h b/Eigen/src/Core/Ref.h index df43c05e4..5be39cecd 100644 --- a/Eigen/src/Core/Ref.h +++ b/Eigen/src/Core/Ref.h @@ -26,7 +26,9 @@ struct traits > enum { Options = Options_, Flags = traits >::Flags | NestByRefBit, - Alignment = traits >::Alignment + Alignment = traits >::Alignment, + InnerStrideAtCompileTime = traits >::InnerStrideAtCompileTime, + OuterStrideAtCompileTime = traits >::OuterStrideAtCompileTime }; template struct match { @@ -34,11 +36,11 @@ struct traits > IsVectorAtCompileTime = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime, HasDirectAccess = internal::has_direct_access::ret, StorageOrderMatch = IsVectorAtCompileTime || ((PlainObjectType::Flags&RowMajorBit)==(Derived::Flags&RowMajorBit)), - InnerStrideMatch = int(StrideType::InnerStrideAtCompileTime)==int(Dynamic) - || int(StrideType::InnerStrideAtCompileTime)==int(Derived::InnerStrideAtCompileTime) - || (int(StrideType::InnerStrideAtCompileTime)==0 && int(Derived::InnerStrideAtCompileTime)==1), + InnerStrideMatch = int(InnerStrideAtCompileTime)==int(Dynamic) + || int(InnerStrideAtCompileTime)==int(Derived::InnerStrideAtCompileTime) + || (int(InnerStrideAtCompileTime)==0 && int(Derived::InnerStrideAtCompileTime)==1), OuterStrideMatch = IsVectorAtCompileTime - || int(StrideType::OuterStrideAtCompileTime)==int(Dynamic) || int(StrideType::OuterStrideAtCompileTime)==int(Derived::OuterStrideAtCompileTime), + || int(OuterStrideAtCompileTime)==int(Dynamic) || int(OuterStrideAtCompileTime)==int(Derived::OuterStrideAtCompileTime), // NOTE, this indirection of evaluator::Alignment is needed // to workaround a very strange bug in MSVC related to the instantiation // of has_*ary_operator in evaluator. diff --git a/test/ref.cpp b/test/ref.cpp index f28353735..f0faa9423 100644 --- a/test/ref.cpp +++ b/test/ref.cpp @@ -341,6 +341,17 @@ template void test_cref_move_ctor(const VERIFY(test_is_equal(data1, obj_data2, MatrixType::MaxSizeAtCompileTime == Dynamic && owns_data)); } +template +void test_contiguous_ref_no_copy(const PlainObjectBase &obj) { + typedef Ref> Ref_; + typedef Ref> CRef_; + MatrixType m(obj); + Ref_ ref(m); + VERIFY(test_is_equal(ref.data(), m.data(), true)); + CRef_ cref(m); + VERIFY(test_is_equal(cref.data(), m.data(), true)); +} + EIGEN_DECLARE_TEST(ref) { for(int i = 0; i < g_repeat; i++) { @@ -375,4 +386,8 @@ EIGEN_DECLARE_TEST(ref) CALL_SUBTEST_9( test_cref_move_ctor(MatrixXd(9, 5)) ); CALL_SUBTEST_9( test_cref_move_ctor(Matrix3d::Ones()) ); CALL_SUBTEST_9( test_cref_move_ctor(Matrix3d()) ); + CALL_SUBTEST_10(test_contiguous_ref_no_copy(VectorXd(9))); + CALL_SUBTEST_10(test_contiguous_ref_no_copy(Vector3d())); + CALL_SUBTEST_10(test_contiguous_ref_no_copy(MatrixXd(9, 5))); + CALL_SUBTEST_10(test_contiguous_ref_no_copy(Matrix3d())); }