dune-common  2.7.0
future.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_COMMON_PARALLEL_FUTURE_HH
4 #define DUNE_COMMON_PARALLEL_FUTURE_HH
5 
6 #include <memory>
8 
9 namespace Dune{
10 
16  {};
17 
18  // forward declaration
19  template<class T>
20  class PseudoFuture;
21 
25  template<class T>
26  class Future{
27  // Future interface:
28  class FutureBase{
29  public:
30  virtual ~FutureBase() = default;
31  virtual void wait() = 0;
32  virtual bool ready() const = 0;
33  virtual bool valid() const = 0;
34  virtual T get() = 0;
35  };
36 
37  // model class
38  template<class F>
39  class FutureModel
40  : public FutureBase
41  {
42  F _future;
43  public:
44  FutureModel(F&& f)
45  : _future(std::forward<F>(f))
46  {}
47 
48  virtual void wait() override
49  {
50  _future.wait();
51  }
52 
53  virtual bool ready() const override
54  {
55  return _future.ready();
56  }
57 
58  virtual bool valid() const override
59  {
60  return _future.valid();
61  }
62 
63  virtual T get() override{
64  return (T)_future.get();
65  }
66  };
67 
68  std::unique_ptr<FutureBase> _future;
69  public:
70  template<class F>
71  Future(F&& f)
72  : _future(std::make_unique<FutureModel<F>>(std::forward<F>(f)))
73  {}
74 
75  template<class U, std::enable_if_t<std::is_same<U,T>::value && !std::is_same<T,void>::value>>
76  Future(U&& data)
77  : _future(std::make_unique<FutureModel<PseudoFuture<T>>>(PseudoFuture<T>(std::forward<U>(data))))
78  {}
79 
80  Future() = default;
81 
85  void wait(){
86  _future->wait();
87  }
88 
93  T get() {
94  return _future->get();
95  }
96 
101  bool ready() const {
102  return _future->ready();
103  }
104 
110  bool valid() const {
111  if(_future)
112  return _future->valid();
113  return false;
114  }
115  };
116 
119  template<class T>
120  class PseudoFuture{
121  bool valid_;
122  T data_;
123  public:
125  valid_(false)
126  {}
127 
128  template<class U>
129  PseudoFuture(U&& u) :
130  valid_(true),
131  data_(std::forward<U>(u))
132  {}
133 
134  void wait() {
135  if(!valid_)
136  DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
137  }
138 
139  bool ready() const {
140  if(!valid_)
141  DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
142  return true;
143  }
144 
145  T get() {
146  if(!valid_)
147  DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
148  valid_ = false;
149  return std::forward<T>(data_);
150  }
151 
152  bool valid() const {
153  return valid_;
154  }
155  };
156 
157  template<>
158  class PseudoFuture<void>{
159  bool valid_;
160  public:
161  PseudoFuture(bool valid = false) :
162  valid_(valid)
163  {}
164 
165  void wait(){
166  if(!valid_)
167  DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
168  }
169  bool ready() const{
170  if(!valid_)
171  DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
172  return true;
173  }
174 
175  void get(){
176  if(!valid_)
177  DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
178  valid_ = false;
179  }
180 
181  bool valid() const{
182  return valid_;
183  }
184  };
185 }
186 
187 #endif
exceptions.hh
A few common exception classes.
Dune::PseudoFuture::PseudoFuture
PseudoFuture()
Definition: future.hh:124
Dune::PseudoFuture
A wrapper-class for a object which is ready immediately.
Definition: future.hh:20
Dune::Future::get
T get()
Waits until the future is ready and returns the resulting value.
Definition: future.hh:93
Dune::Future::Future
Future()=default
Dune::InvalidFutureException
This exception is thrown when ready(), wait() or get() is called on an invalid future....
Definition: future.hh:15
Dune::PseudoFuture::valid
bool valid() const
Definition: future.hh:152
Dune::PseudoFuture::PseudoFuture
PseudoFuture(U &&u)
Definition: future.hh:129
Dune::PseudoFuture::wait
void wait()
Definition: future.hh:134
Dune::PseudoFuture::get
T get()
Definition: future.hh:145
Dune::PseudoFuture< void >::ready
bool ready() const
Definition: future.hh:169
Dune::PseudoFuture< void >::get
void get()
Definition: future.hh:175
Dune::Future::Future
Future(F &&f)
Definition: future.hh:71
Dune::PseudoFuture< void >::PseudoFuture
PseudoFuture(bool valid=false)
Definition: future.hh:161
Dune::PseudoFuture< void >::wait
void wait()
Definition: future.hh:165
Dune::PseudoFuture< void >::valid
bool valid() const
Definition: future.hh:181
Dune::PseudoFuture::ready
bool ready() const
Definition: future.hh:139
Dune::InvalidStateException
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:279
Dune::Future::Future
Future(U &&data)
Definition: future.hh:76
Dune::Future::ready
bool ready() const
Definition: future.hh:101
Dune::Future
Type-erasure for future-like objects. A future-like object is a object satisfying the interface of Fu...
Definition: future.hh:26
Dune::Future::valid
bool valid() const
Checks whether the future is valid. I.e. ‘get()’ was not called on that future and when it was no...
Definition: future.hh:110
DUNE_THROW
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216
Dune::Future::wait
void wait()
wait until the future is ready
Definition: future.hh:85
Dune
Dune namespace.
Definition: alignedallocator.hh:13