DASH  0.3.0
UniversalMember.h
1 #ifndef DASH__UTIL__UNIVERSAL_MEMBER_H__INCLUDED
2 #define DASH__UTIL__UNIVERSAL_MEMBER_H__INCLUDED
3 
4 #include <utility>
5 #include <memory>
6 
7 
8 namespace dash {
9 
49 template <class ValueType>
52 
53  // References related to reference / temporary binding:
54  //
55  // - `shared_view` in range-v3, seems similar top the `std::shared_ptr`
56  // variant:
57  // https://github.com/ericniebler/range-v3/pull/557/files
58  //
59  // - `common_reference` proposal:
60  // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0022r2.html
61  //
62  // - ref-qualified member functions:
63  // http://kukuruku.co/hub/cpp/ref-qualified-member-functions
64  std::shared_ptr<ValueType> _value;
65 public:
66  UniversalMember() = default;
67 
68 // constexpr UniversalMember(self_t && other) = default;
69 // constexpr UniversalMember(const self_t & other) = delete;
70 //
71 // self_t & operator=(const self_t & other) = delete;
72 // self_t & operator=(self_t && other) = default;
73 
74  constexpr explicit UniversalMember(ValueType && value)
75  : _value(std::make_shared<ValueType>(std::move(value)))
76  { }
77  constexpr explicit UniversalMember(const ValueType & value)
78  : _value(&const_cast<ValueType &>(value),
79  [](ValueType *) { /* no deleter */ })
80  { }
81  constexpr explicit UniversalMember(const ValueType * value)
82  : _value(const_cast<ValueType *>(value),
83  [](ValueType *) { /* no deleter */ })
84  { }
85 
86  operator ValueType & () { return *(_value.get()); }
87  constexpr operator const ValueType & () const { return *(_value.get()); }
88 
89  self_t & operator=(ValueType && value) {
90  *(_value.get()) = std::forward<ValueType>(value);
91  return *this;
92  }
93 
94  constexpr const std::shared_ptr<ValueType> & shared() const {
95  return _value;
96  }
97 };
98 
99 } // namespace dash
100 
101 #endif // DASH__UTIL__UNIVERSAL_MEMBER_H__INCLUDED
This class is a simple memory pool which holds allocates elements of size ValueType.
Definition: AllOf.h:8
struct dash::dart_operation ValueType
Reduce operands to their minimum value.
Utility class template to capture values from both moved temporaries (rvalues) and named references t...