From cca7b146a2018a74aa5f83edc0797fab89b1040e Mon Sep 17 00:00:00 2001 From: Jitse Niesen Date: Tue, 5 Apr 2011 18:15:59 +0100 Subject: [PATCH] Implement evaluator for Map --- Eigen/src/Core/CoreEvaluators.h | 166 ++++++++++++++++++-------------- test/evaluators.cpp | 12 +++ 2 files changed, 106 insertions(+), 72 deletions(-) diff --git a/Eigen/src/Core/CoreEvaluators.h b/Eigen/src/Core/CoreEvaluators.h index 6fe7177c6..3060ca982 100644 --- a/Eigen/src/Core/CoreEvaluators.h +++ b/Eigen/src/Core/CoreEvaluators.h @@ -334,6 +334,97 @@ protected: PlainObject m_result; }; +// -------------------- Map -------------------- + +template +struct evaluator_impl > +{ + typedef MapBase MapType; + typedef typename MapType::PointerType PointerType; + typedef typename MapType::Index Index; + typedef typename MapType::Scalar Scalar; + typedef typename MapType::CoeffReturnType CoeffReturnType; + typedef typename MapType::PacketScalar PacketScalar; + typedef typename MapType::PacketReturnType PacketReturnType; + + evaluator_impl(const MapType& map) + : m_data(const_cast(map.data())), + m_rowStride(map.rowStride()), + m_colStride(map.colStride()) + { } + + enum { + RowsAtCompileTime = MapType::RowsAtCompileTime + }; + + CoeffReturnType coeff(Index row, Index col) const + { + return m_data[col * m_colStride + row * m_rowStride]; + } + + CoeffReturnType coeff(Index index) const + { + return coeff(RowsAtCompileTime == 1 ? 0 : index, + RowsAtCompileTime == 1 ? index : 0); + } + + Scalar& coeffRef(Index row, Index col) + { + return m_data[col * m_colStride + row * m_rowStride]; + } + + Scalar& coeffRef(Index index) + { + return coeffRef(RowsAtCompileTime == 1 ? 0 : index, + RowsAtCompileTime == 1 ? index : 0); + } + + template + PacketReturnType packet(Index row, Index col) const + { + PointerType ptr = m_data + row * m_rowStride + col * m_colStride; + return internal::ploadt(ptr); + } + + template + PacketReturnType packet(Index index) const + { + return packet(RowsAtCompileTime == 1 ? 0 : index, + RowsAtCompileTime == 1 ? index : 0); + } + + template + void writePacket(Index row, Index col, const PacketScalar& x) + { + PointerType ptr = m_data + row * m_rowStride + col * m_colStride; + return internal::pstoret(ptr, x); + } + + template + void writePacket(Index index, const PacketScalar& x) + { + return writePacket(RowsAtCompileTime == 1 ? 0 : index, + RowsAtCompileTime == 1 ? index : 0, + x); + } + +protected: + PointerType m_data; + int m_rowStride; + int m_colStride; +}; + +template +struct evaluator_impl > + : public evaluator_impl > > +{ + typedef Map MapType; + + evaluator_impl(const MapType& map) + : evaluator_impl >(map) + { } +}; + // -------------------- Block -------------------- template @@ -419,82 +510,13 @@ protected: template struct evaluator_impl > + : evaluator_impl > > { typedef Block BlockType; - typedef typename BlockType::PointerType PointerType; - typedef typename BlockType::Index Index; - typedef typename BlockType::Scalar Scalar; - typedef typename BlockType::CoeffReturnType CoeffReturnType; - typedef typename BlockType::PacketScalar PacketScalar; - typedef typename BlockType::PacketReturnType PacketReturnType; - + evaluator_impl(const BlockType& block) - : m_argImpl(block.nestedExpression()), - m_data(const_cast(block.data())), - m_rowStride(block.rowStride()), - m_colStride(block.colStride()) + : evaluator_impl >(block) { } - - enum { - RowsAtCompileTime = BlockType::RowsAtCompileTime - }; - - CoeffReturnType coeff(Index row, Index col) const - { - return m_data[col * m_colStride + row * m_rowStride]; - } - - CoeffReturnType coeff(Index index) const - { - return coeff(RowsAtCompileTime == 1 ? 0 : index, - RowsAtCompileTime == 1 ? index : 0); - } - - Scalar& coeffRef(Index row, Index col) - { - return m_data[col * m_colStride + row * m_rowStride]; - } - - Scalar& coeffRef(Index index) - { - return coeffRef(RowsAtCompileTime == 1 ? 0 : index, - RowsAtCompileTime == 1 ? index : 0); - } - - template - PacketReturnType packet(Index row, Index col) const - { - PointerType ptr = m_data + row * m_rowStride + col * m_colStride; - return internal::ploadt(ptr); - } - - template - PacketReturnType packet(Index index) const - { - return packet(RowsAtCompileTime == 1 ? 0 : index, - RowsAtCompileTime == 1 ? index : 0); - } - - template - void writePacket(Index row, Index col, const PacketScalar& x) - { - PointerType ptr = m_data + row * m_rowStride + col * m_colStride; - return internal::pstoret(ptr, x); - } - - template - void writePacket(Index index, const PacketScalar& x) - { - return writePacket(RowsAtCompileTime == 1 ? 0 : index, - RowsAtCompileTime == 1 ? index : 0, - x); - } - -protected: - typename evaluator::type m_argImpl; - PointerType m_data; - int m_rowStride; - int m_colStride; }; diff --git a/test/evaluators.cpp b/test/evaluators.cpp index e3fe53215..b2bc42840 100644 --- a/test/evaluators.cpp +++ b/test/evaluators.cpp @@ -142,4 +142,16 @@ void test_evaluators() copy_using_evaluator(mX.block(4, 4, 9, 12), mXsrc); mXref.block(4, 4, 9, 12) = mXsrc; VERIFY_IS_APPROX(mX, mXref); + + // Testing Map + const float raw[3] = {1,2,3}; + float buffer[3] = {0,0,0}; + Vector3f v3; + Array3f a3f; + VERIFY_IS_APPROX_EVALUATOR(v3, Map(raw)); + VERIFY_IS_APPROX_EVALUATOR(a3f, Map(raw)); + Vector3f::Map(buffer) = 2*v3; + VERIFY(buffer[0] == 2); + VERIFY(buffer[1] == 4); + VERIFY(buffer[2] == 6); }