traits<Ref>::match: use correct strides

This commit is contained in:
wk 2023-11-09 12:19:38 +01:00 committed by Charles Schlosser
parent 516d08a490
commit f78c37f0af
2 changed files with 22 additions and 5 deletions

View File

@ -26,7 +26,9 @@ struct traits<Ref<PlainObjectType_, Options_, StrideType_> >
enum { enum {
Options = Options_, Options = Options_,
Flags = traits<Map<PlainObjectType_, Options_, StrideType_> >::Flags | NestByRefBit, Flags = traits<Map<PlainObjectType_, Options_, StrideType_> >::Flags | NestByRefBit,
Alignment = traits<Map<PlainObjectType_, Options_, StrideType_> >::Alignment Alignment = traits<Map<PlainObjectType_, Options_, StrideType_> >::Alignment,
InnerStrideAtCompileTime = traits<Map<PlainObjectType_, Options_, StrideType_> >::InnerStrideAtCompileTime,
OuterStrideAtCompileTime = traits<Map<PlainObjectType_, Options_, StrideType_> >::OuterStrideAtCompileTime
}; };
template<typename Derived> struct match { template<typename Derived> struct match {
@ -34,11 +36,11 @@ struct traits<Ref<PlainObjectType_, Options_, StrideType_> >
IsVectorAtCompileTime = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime, IsVectorAtCompileTime = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime,
HasDirectAccess = internal::has_direct_access<Derived>::ret, HasDirectAccess = internal::has_direct_access<Derived>::ret,
StorageOrderMatch = IsVectorAtCompileTime || ((PlainObjectType::Flags&RowMajorBit)==(Derived::Flags&RowMajorBit)), StorageOrderMatch = IsVectorAtCompileTime || ((PlainObjectType::Flags&RowMajorBit)==(Derived::Flags&RowMajorBit)),
InnerStrideMatch = int(StrideType::InnerStrideAtCompileTime)==int(Dynamic) InnerStrideMatch = int(InnerStrideAtCompileTime)==int(Dynamic)
|| int(StrideType::InnerStrideAtCompileTime)==int(Derived::InnerStrideAtCompileTime) || int(InnerStrideAtCompileTime)==int(Derived::InnerStrideAtCompileTime)
|| (int(StrideType::InnerStrideAtCompileTime)==0 && int(Derived::InnerStrideAtCompileTime)==1), || (int(InnerStrideAtCompileTime)==0 && int(Derived::InnerStrideAtCompileTime)==1),
OuterStrideMatch = IsVectorAtCompileTime 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<Derived>::Alignment is needed // NOTE, this indirection of evaluator<Derived>::Alignment is needed
// to workaround a very strange bug in MSVC related to the instantiation // to workaround a very strange bug in MSVC related to the instantiation
// of has_*ary_operator in evaluator<CwiseNullaryOp>. // of has_*ary_operator in evaluator<CwiseNullaryOp>.

View File

@ -341,6 +341,17 @@ template <typename MatrixType, typename Derived> void test_cref_move_ctor(const
VERIFY(test_is_equal(data1, obj_data2, MatrixType::MaxSizeAtCompileTime == Dynamic && owns_data)); VERIFY(test_is_equal(data1, obj_data2, MatrixType::MaxSizeAtCompileTime == Dynamic && owns_data));
} }
template <typename MatrixType>
void test_contiguous_ref_no_copy(const PlainObjectBase<MatrixType> &obj) {
typedef Ref<MatrixType, Unaligned, Stride<0, 0>> Ref_;
typedef Ref<const MatrixType, Unaligned, Stride<0, 0>> 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) EIGEN_DECLARE_TEST(ref)
{ {
for(int i = 0; i < g_repeat; i++) { for(int i = 0; i < g_repeat; i++) {
@ -375,4 +386,8 @@ EIGEN_DECLARE_TEST(ref)
CALL_SUBTEST_9( test_cref_move_ctor<MatrixXd>(MatrixXd(9, 5)) ); CALL_SUBTEST_9( test_cref_move_ctor<MatrixXd>(MatrixXd(9, 5)) );
CALL_SUBTEST_9( test_cref_move_ctor<Matrix3d>(Matrix3d::Ones()) ); CALL_SUBTEST_9( test_cref_move_ctor<Matrix3d>(Matrix3d::Ones()) );
CALL_SUBTEST_9( test_cref_move_ctor<Matrix3d>(Matrix3d()) ); CALL_SUBTEST_9( test_cref_move_ctor<Matrix3d>(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()));
} }