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 {
Options = Options_,
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 {
@ -34,11 +36,11 @@ struct traits<Ref<PlainObjectType_, Options_, StrideType_> >
IsVectorAtCompileTime = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime,
HasDirectAccess = internal::has_direct_access<Derived>::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<Derived>::Alignment is needed
// to workaround a very strange bug in MSVC related to the instantiation
// 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));
}
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)
{
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<Matrix3d>(Matrix3d::Ones()) );
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()));
}