diff --git a/Eigen/src/Core/IndexedView.h b/Eigen/src/Core/IndexedView.h index 377f8a5cc..5c2c72496 100644 --- a/Eigen/src/Core/IndexedView.h +++ b/Eigen/src/Core/IndexedView.h @@ -54,7 +54,8 @@ struct traits > DirectAccessMask = (int(InnerIncr)!=UndefinedIncr && int(OuterIncr)!=UndefinedIncr && InnerIncr>=0 && OuterIncr>=0) ? DirectAccessBit : 0, FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0, FlagsLvalueBit = is_lvalue::value ? LvalueBit : 0, - Flags = (traits::Flags & (HereditaryBits | DirectAccessMask)) | FlagsLvalueBit | FlagsRowMajorBit + FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1) ? LinearAccessBit : 0, + Flags = (traits::Flags & (HereditaryBits | DirectAccessMask )) | FlagsLvalueBit | FlagsRowMajorBit | FlagsLinearAccessBit }; typedef Block BlockType; @@ -168,7 +169,9 @@ struct unary_evaluator, IndexBased> enum { CoeffReadCost = evaluator::CoeffReadCost /* TODO + cost of row/col index */, - Flags = (evaluator::Flags & (HereditaryBits /*| LinearAccessBit | DirectAccessBit*/)), + FlagsLinearAccessBit = (traits::RowsAtCompileTime == 1 || traits::ColsAtCompileTime == 1) ? LinearAccessBit : 0, + + Flags = (evaluator::Flags & (HereditaryBits /*| LinearAccessBit | DirectAccessBit*/)) | FlagsLinearAccessBit, Alignment = 0 }; @@ -193,6 +196,31 @@ struct unary_evaluator, IndexBased> return m_argImpl.coeffRef(m_xpr.rowIndices()[row], m_xpr.colIndices()[col]); } + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE + Scalar& coeffRef(Index index) + { + EIGEN_STATIC_ASSERT_LVALUE(XprType) + Index row = XprType::RowsAtCompileTime == 1 ? 0 : index; + Index col = XprType::RowsAtCompileTime == 1 ? index : 0; + return m_argImpl.coeffRef( m_xpr.rowIndices()[row], m_xpr.colIndices()[col]); + } + + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE + const Scalar& coeffRef(Index index) const + { + Index row = XprType::RowsAtCompileTime == 1 ? 0 : index; + Index col = XprType::RowsAtCompileTime == 1 ? index : 0; + return m_argImpl.coeffRef( m_xpr.rowIndices()[row], m_xpr.colIndices()[col]); + } + + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE + const CoeffReturnType coeff(Index index) const + { + Index row = XprType::RowsAtCompileTime == 1 ? 0 : index; + Index col = XprType::RowsAtCompileTime == 1 ? index : 0; + return m_argImpl.coeff( m_xpr.rowIndices()[row], m_xpr.colIndices()[col]); + } + protected: evaluator m_argImpl; diff --git a/test/indexed_view.cpp b/test/indexed_view.cpp index 272b6087b..1dff972d2 100644 --- a/test/indexed_view.cpp +++ b/test/indexed_view.cpp @@ -429,6 +429,16 @@ void check_indexed_view() A(all, eii).col(0) = A.col(eii(0)); } + // bug 1815: IndexedView should allow linear access + { + VERIFY( MATCH( b(eii)(0), "3" ) ); + VERIFY( MATCH( a(eii)(0), "3" ) ); + VERIFY( MATCH( A(1,eii)(0), "103")); + VERIFY( MATCH( A(eii,1)(0), "301")); + VERIFY( MATCH( A(1,all)(1), "101")); + VERIFY( MATCH( A(all,1)(1), "101")); + } + } EIGEN_DECLARE_TEST(indexed_view)