55#ifndef _PFASST_CONTROLLER_HPP_
66#define _PFASST_CONTROLLER_HPP_
77
8+ #include < deque>
9+ #include < memory>
10+ #include < cassert>
11+
812#include " interfaces.hpp"
913
1014namespace pfasst
@@ -51,14 +55,20 @@ namespace pfasst
5155 }
5256 }
5357
54- template <typename R = ISweeper<time>> R* get_level (size_t level)
58+ template <typename R = ISweeper<time>>
59+ R* get_level (size_t level)
5560 {
56- return dynamic_cast <R*>(levels[level].get ());
61+ R* r = dynamic_cast <R*>(levels[level].get ());
62+ assert (r != nullptr );
63+ return r;
5764 }
5865
59- template <typename R = ITransfer<time>> R* get_transfer (size_t level)
66+ template <typename R = ITransfer<time>>
67+ R* get_transfer (size_t level)
6068 {
61- return dynamic_cast <R*>(transfer[level].get ());
69+ R* r = dynamic_cast <R*>(transfer[level].get ());
70+ assert (r != nullptr );
71+ return r;
6272 }
6373
6474 size_t nlevels ()
@@ -83,21 +93,25 @@ namespace pfasst
8393
8494 LevelIter (size_t level, Controller* ts) : ts(ts), level(level) {}
8595
86- template <typename R = ISweeper<time>> R* current ()
96+ template <typename R = ISweeper<time>>
97+ R* current ()
8798 {
88- return ts->get_level <R>(level);
99+ return ts->template get_level <R>(level);
89100 }
90- template <typename R = ISweeper<time>> R* fine ()
101+ template <typename R = ISweeper<time>>
102+ R* fine ()
91103 {
92- return ts->get_level <R>(level + 1 );
104+ return ts->template get_level <R>(level + 1 );
93105 }
94- template <typename R = ISweeper<time>> R* coarse ()
106+ template <typename R = ISweeper<time>>
107+ R* coarse ()
95108 {
96- return ts->get_level <R>(level - 1 );
109+ return ts->template get_level <R>(level - 1 );
97110 }
98- template <typename R = ITransfer<time>> R* transfer ()
111+ template <typename R = ITransfer<time>>
112+ R* transfer ()
99113 {
100- return ts->get_transfer <R>(level);
114+ return ts->template get_transfer <R>(level);
101115 }
102116
103117 ISweeper<time>* operator *() { return current (); }
0 commit comments