[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