
Module: ppl/ppl Branch: sparse_matrices Commit: 23192afd0a9f4d4ae5064c908e334be2dc1b7b49 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=23192afd0a9f4...
Author: Marco Poletti poletti.marco@gmail.com Date: Fri Apr 16 15:05:10 2010 +0200
Dense_Row: implement operator->() for iterators and const iterators.
---
src/Dense_Row.defs.hh | 48 +++++++++++++++++++++++++++++++++++++++- src/Dense_Row.inlines.hh | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletions(-)
diff --git a/src/Dense_Row.defs.hh b/src/Dense_Row.defs.hh index 68b228a..673304a 100644 --- a/src/Dense_Row.defs.hh +++ b/src/Dense_Row.defs.hh @@ -359,14 +359,44 @@ private:
class Parma_Polyhedra_Library::Dense_Row::iterator { public: + typedef std::pair<const dimension_type,Coefficient&> value_type; typedef std::pair<const dimension_type,const Coefficient&> const_type;
+private: + + class Member_Access_Helper { + public: + + Member_Access_Helper(dimension_type index, Coefficient& data); + + value_type* operator->(); + + private: + value_type value; + }; + + class Const_Member_Access_Helper { + public: + + Const_Member_Access_Helper(dimension_type index, + const Coefficient& data); + + const const_type* operator->() const; + + private: + const_type value; + }; + +public: iterator(Dense_Row& row1, dimension_type i1);
value_type operator*(); const_type operator*() const;
+ Member_Access_Helper operator->(); + Const_Member_Access_Helper operator->() const; + iterator& operator++(); iterator operator++(int);
@@ -387,12 +417,28 @@ private:
class Parma_Polyhedra_Library::Dense_Row::const_iterator { public: - typedef std::pair<const dimension_type, const Coefficient&> const_type;
+private: + + class Const_Member_Access_Helper { + public: + + Const_Member_Access_Helper(dimension_type index, + const Coefficient& data); + + const const_type* operator->() const; + + private: + const_type value; + }; + +public: + const_iterator(const Dense_Row& row1, dimension_type i1);
const_type operator*() const; + Const_Member_Access_Helper operator->() const;
const_iterator& operator++(); const_iterator operator++(int); diff --git a/src/Dense_Row.inlines.hh b/src/Dense_Row.inlines.hh index 2c2982f..b7b85d9 100644 --- a/src/Dense_Row.inlines.hh +++ b/src/Dense_Row.inlines.hh @@ -383,6 +383,18 @@ Dense_Row::iterator::operator*() const { return const_type(i, (*row)[i]); }
+inline Dense_Row::iterator::Member_Access_Helper +Dense_Row::iterator::operator->() { + PPL_ASSERT(i < row->size()); + return Member_Access_Helper(i, (*row)[i]); +} + +inline Dense_Row::iterator::Const_Member_Access_Helper +Dense_Row::iterator::operator->() const { + PPL_ASSERT(i < row->size()); + return Const_Member_Access_Helper(i, (*row)[i]); +} + inline Dense_Row::iterator& Dense_Row::iterator::operator++() { PPL_ASSERT(i < row->size()); @@ -436,6 +448,30 @@ Dense_Row::iterator::OK() const {
inline +Dense_Row::iterator::Member_Access_Helper +::Member_Access_Helper(dimension_type index, Coefficient& data) + : value(index, data) { +} + +inline Dense_Row::iterator::value_type* +Dense_Row::iterator::Member_Access_Helper::operator->() { + return &value; +} + + +inline +Dense_Row::iterator::Const_Member_Access_Helper +::Const_Member_Access_Helper(dimension_type index, const Coefficient& data) + : value(index, data) { +} + +inline const Dense_Row::iterator::const_type* +Dense_Row::iterator::Const_Member_Access_Helper::operator->() const { + return &value; +} + + +inline Dense_Row::const_iterator::const_iterator(const Dense_Row& row1, dimension_type i1) : row(&row1), i(i1) { @@ -448,6 +484,12 @@ Dense_Row::const_iterator::operator*() const { return const_type(i, (*row)[i]); }
+inline Dense_Row::const_iterator::Const_Member_Access_Helper +Dense_Row::const_iterator::operator->() const { + PPL_ASSERT(i < row->size()); + return Const_Member_Access_Helper(i, (*row)[i]); +} + inline Dense_Row::const_iterator& Dense_Row::const_iterator::operator++() { PPL_ASSERT(i < row->size()); @@ -494,6 +536,19 @@ Dense_Row::const_iterator::OK() const { return (i <= row->size()); }
+ + +inline +Dense_Row::const_iterator::Const_Member_Access_Helper +::Const_Member_Access_Helper(dimension_type index, const Coefficient& data) + : value(index, data) { +} + +inline const Dense_Row::const_iterator::const_type* +Dense_Row::const_iterator::Const_Member_Access_Helper::operator->() const { + return &value; +} + } // namespace Parma_Polyhedra_Library