DASH  0.3.0
Deferred.h
1 #ifndef DASH__DEFERRED_H__INCLUDED
2 #define DASH__DEFERRED_H__INCLUDED
3 
4 #include <functional>
5 
6 
7 namespace dash {
8 
9 /* TODO:
10  * Should be
11  *
12  * template <typename T, bool evaluated>
13  * class Deferred;
14  *
15  * with:
16  *
17  * constexpr Deferred<T, true>
18  * Deferred<T, false>::operator T() const {
19  * return Deferred<T, true>(gen_fun());
20  * }
21  *
22  * and:
23  *
24  * constexpr Deferred<T, true>
25  * Deferred<T, true>::operator T() const {
26  * return _value;
27  * }
28  *
29  *
30  */
31 
32 template <typename T>
33 class Deferred {
34 
35  static T default_gen() {
36  return T();
37  }
38 
39  std::function<T()> _gen;
40  T _value;
41  bool _initialized;
42 
43 public:
44  Deferred()
45  : _gen(default_gen)
46  , _initialized(false)
47  { }
48 
49  Deferred(std::function<T()> gen)
50  : _gen(gen)
51  , _initialized(false)
52  { }
53 
54  T & get() {
55  if (!_initialized) {
56  _value = _gen();
57  _initialized = true;
58  }
59  return _value;
60  }
61 
62  operator T() {
63  return get();
64  }
65 
66  T & operator*() {
67  return get();
68  }
69 
70  Deferred<T> & operator=(const Deferred<T>& other) {
71  _gen = other._gen;
72  _initialized = false;
73  return *this;
74  }
75 };
76 
77 } // namespace dash
78 
79 #endif // DASH__DEFERRED_H__INCLUDED
This class is a simple memory pool which holds allocates elements of size ValueType.
Definition: AllOf.h:8