[PPL-devel] [GIT] ppl/ppl(sparse_matrices): Dense_Row: implement operator->() for iterators and const iterators.

Marco Poletti poletti.marco at gmail.com
Fri Apr 16 15:08:04 CEST 2010


Module: ppl/ppl
Branch: sparse_matrices
Commit: 23192afd0a9f4d4ae5064c908e334be2dc1b7b49
URL:    http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=23192afd0a9f4d4ae5064c908e334be2dc1b7b49

Author: Marco Poletti <poletti.marco at 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
 
 




More information about the PPL-devel mailing list