Skip to content

Commit 74fe13f

Browse files
committed
made Controller::LevelIter a real iterator
at least almost. have to check a few STD internals to make it conform with STD
1 parent a14ae85 commit 74fe13f

File tree

3 files changed

+48
-17
lines changed

3 files changed

+48
-17
lines changed

examples/advection_diffusion/serial_mlsdc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ int main(int argc, char** argv)
6363
/*
6464
* set initial conditions on each level
6565
*/
66-
auto sweeper = mlsdc.get_level<AdvectionDiffusionSweeper<>>(mlsdc.nlevels() - 1);
66+
auto sweeper = mlsdc.finest().operator-><AdvectionDiffusionSweeper<>>();
6767
auto q0 = sweeper->get_state(0);
6868
sweeper->exact(q0, 0.0);
6969

include/pfasst/controller.hpp

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
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

include/pfasst/mlsdc.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace pfasst
2424
vector<size_t> nsweeps;
2525
bool predict, initial;
2626

27-
using LevelIter = typename pfasst::Controller<time>::LevelIter;
27+
typedef typename pfasst::Controller<time>::LevelIter LevelIter;
2828

2929
void perform_sweeps(LevelIter leviter, time t, time dt)
3030
{

0 commit comments

Comments
 (0)