aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Core/StlIterators.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2019-12-03 14:40:15 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2019-12-03 14:40:15 +0100
commit7745f69013b5e4c93c1ffe6ba3173456d45c7222 (patch)
tree3ae182293e854943c393c36406676853df3de1d4 /Eigen/src/Core/StlIterators.h
parent66f07efeaed39d6a67005343d7e0caf7d9eeacdb (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.h25
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