mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-16 14:49:39 +08:00
traits<Ref>::match: use correct strides
This commit is contained in:
parent
516d08a490
commit
f78c37f0af
@ -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>.
|
||||
|
15
test/ref.cpp
15
test/ref.cpp
@ -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()));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user