diff options
author | Gael Guennebaud <g.gael@free.fr> | 2019-12-03 14:40:15 +0100 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2019-12-03 14:40:15 +0100 |
commit | 7745f69013b5e4c93c1ffe6ba3173456d45c7222 (patch) | |
tree | 3ae182293e854943c393c36406676853df3de1d4 /Eigen/src/Core/StlIterators.h | |
parent | 66f07efeaed39d6a67005343d7e0caf7d9eeacdb (diff) |
bug #1776: fix vector-wise STL iterator's operator-> using a proxy as pointer type.
This changeset fixes also the value_type definition.
Diffstat (limited to 'Eigen/src/Core/StlIterators.h')
-rw-r--r-- | Eigen/src/Core/StlIterators.h | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/Eigen/src/Core/StlIterators.h b/Eigen/src/Core/StlIterators.h index 4f25a60c4..0d8bd1aa3 100644 --- a/Eigen/src/Core/StlIterators.h +++ b/Eigen/src/Core/StlIterators.h @@ -241,17 +241,30 @@ protected: typedef typename internal::conditional<Direction==Vertical,typename XprType::ColXpr,typename XprType::RowXpr>::type SubVectorType; typedef typename internal::conditional<Direction==Vertical,typename XprType::ConstColXpr,typename XprType::ConstRowXpr>::type ConstSubVectorType; + +public: + typedef typename internal::conditional<bool(is_lvalue), SubVectorType, ConstSubVectorType>::type reference; + typedef typename reference::PlainObject value_type; + +private: + class subvector_stl_iterator_ptr + { + public: + subvector_stl_iterator_ptr(const reference &subvector) : m_subvector(subvector) {} + reference* operator->() { return &m_subvector; } + private: + reference m_subvector; + }; public: - typedef typename internal::conditional<bool(is_lvalue), SubVectorType, ConstSubVectorType>::type value_type; - typedef value_type* pointer; - typedef value_type reference; + + typedef subvector_stl_iterator_ptr pointer; subvector_stl_iterator() : Base() {} subvector_stl_iterator(XprType& xpr, Index index) : Base(xpr,index) {} - reference operator*() const { return (*mp_xpr).template subVector<Direction>(m_index); } - reference operator[](Index i) const { return (*mp_xpr).template subVector<Direction>(m_index+i); } - pointer operator->() const { return &((*mp_xpr).template subVector<Direction>(m_index)); } + reference operator*() const { return (*mp_xpr).template subVector<Direction>(m_index); } + reference operator[](Index i) const { return (*mp_xpr).template subVector<Direction>(m_index+i); } + pointer operator->() const { return (*mp_xpr).template subVector<Direction>(m_index); } }; } // namespace internal |