88#include < deque>
99#include < memory>
1010#include < cassert>
11+ #include < iterator>
1112
1213#include " interfaces.hpp"
1314
@@ -29,6 +30,7 @@ namespace pfasst
2930 time dt;
3031
3132 public:
33+ // ! @{
3234 void setup ()
3335 {
3436 for (auto l = coarsest (); l <= finest (); ++l) {
@@ -55,7 +57,9 @@ namespace pfasst
5557 transfer.push_back (trnsfr);
5658 }
5759 }
60+ // ! @}
5861
62+ // ! @{
5963 template <typename R = ISweeper<time>>
6064 shared_ptr<R> get_level (size_t level)
6165 {
@@ -76,6 +80,7 @@ namespace pfasst
7680 {
7781 return levels.size ();
7882 }
83+ // ! @}
7984
8085 /* *
8186 * level (MLSDC/PFASST) iterator.
@@ -84,16 +89,32 @@ namespace pfasst
8489 * It keeps track of the _current_ level, and has convenience routines to return the
8590 * LevelIter::current(), LevelIter::fine() (i.e. `current+1`), and LevelIter::coarse()
8691 * (`current-1`) sweepers.
92+ *
93+ * Under the hood it satisfies the requirements of std::random_access_iterator_tag, thus
94+ * implementing a `RandomAccessIterator`.
8795 */
8896 class LevelIter
97+ : iterator<random_access_iterator_tag, shared_ptr<ISweeper<time>>, size_t ,
98+ ISweeper<time>*, ISweeper<time>>
8999 {
90100 Controller* ts;
91101
92102 public:
103+ typedef size_t difference_type;
104+ typedef shared_ptr<ISweeper<time>> value_type;
105+ typedef ISweeper<time>* pointer;
106+ typedef ISweeper<time> reference;
107+ typedef random_access_iterator_tag iterator_category;
108+
93109 size_t level;
94110
95- LevelIter (size_t level, Controller* ts) : ts(ts), level(level) {}
111+ // ! @{
112+ LevelIter (size_t level, Controller* ts)
113+ : ts(ts), level(level)
114+ {}
115+ // ! @}
96116
117+ // ! @{
97118 template <typename R = ISweeper<time>>
98119 shared_ptr<R> current ()
99120 {
@@ -114,25 +135,35 @@ namespace pfasst
114135 {
115136 return ts->template get_transfer <R>(level);
116137 }
117-
118- shared_ptr<ISweeper<time>> operator *() { return current (); }
119- bool operator ==(LevelIter i) { return level == i.level ; }
120- bool operator !=(LevelIter i) { return level != i.level ; }
121- bool operator <=(LevelIter i) { return level <= i.level ; }
122- bool operator >=(LevelIter i) { return level >= i.level ; }
123- bool operator < (LevelIter i) { return level < i.level ; }
124- bool operator > (LevelIter i) { return level > i.level ; }
125- LevelIter operator - (size_t i) { return LevelIter (level - i, ts); }
126- LevelIter operator + (size_t i) { return LevelIter (level + i, ts); }
127- void operator ++() { level++; }
128- void operator --() { level--; }
138+ // ! @}
139+
140+ // ! @{
141+ // required by std::iterator
142+ template <typename R = reference>
143+ shared_ptr<R> operator *() { return current<R>(); }
144+ LevelIter operator ++() { level++; return *this ; }
145+ // required by std::input_iterator_tag
146+ template <typename R = reference>
147+ shared_ptr<R> operator ->() { return current<R>(); }
148+ bool operator ==(LevelIter i) { return level == i.level ; }
149+ bool operator !=(LevelIter i) { return level != i.level ; }
150+ // required by std::bidirectional_iterator_tag
151+ LevelIter operator --() { level--; return *this ; }
152+ // required by std::random_access_iterator_tag
153+ LevelIter operator - (difference_type i) { return LevelIter (level - i, ts); }
154+ LevelIter operator + (difference_type i) { return LevelIter (level + i, ts); }
155+ bool operator <=(LevelIter i) { return level <= i.level ; }
156+ bool operator >=(LevelIter i) { return level >= i.level ; }
157+ bool operator < (LevelIter i) { return level < i.level ; }
158+ bool operator > (LevelIter i) { return level > i.level ; }
159+ // ! @}
129160 };
130161
162+ // ! @{
131163 LevelIter finest () { return LevelIter (nlevels () - 1 , this ); }
132164 LevelIter coarsest () { return LevelIter (0 , this ); }
133-
165+ // ! @}
134166 };
135-
136167}
137168
138169#endif
0 commit comments