AnySet Documentation
ValueHolder.h
1 #ifndef VALUE_HOLDER_H
2 #define VALUE_HOLDER_H
3 
4 #ifdef _MSC_VER
5 # include <iso646.h>
6 #endif
7 
8 #include <type_traits>
9 
10 namespace te {
11 
12 template <class Value, std::size_t Tag = 0, bool = std::is_class_v<Value> and not std::is_final_v<Value>>
14 
15 template <class, class>
16 struct AnyValue;
17 
18 template <class Value, std::size_t Tag>
19 struct ConstValueHolder<Value, Tag, true>:
20  public Value
21 {
23 
24  using Value::Value;
25 
26  ConstValueHolder(const Value& v):
27  Value(v)
28  {
29 
30  }
31 
32  ConstValueHolder(Value&& v):
33  Value(std::move(v))
34  {
35 
36  }
37 
38  ConstValueHolder(const ConstValueHolder& v) = default;
39  ConstValueHolder(ConstValueHolder&& v) = delete;
40  ConstValueHolder& operator=(const ConstValueHolder& v) = delete;
41  ConstValueHolder& operator=(ConstValueHolder&& v) = delete;
42 
43  friend const Value& get_value(const self_type& self)
44  { return static_cast<const Value&>(self); }
45 
46  friend const Value&& get_value(const self_type&& self)
47  { return static_cast<const Value&&>(self); }
48 
49 };
50 
51 
52 template <class Value, std::size_t Tag>
53 struct ConstValueHolder<Value, Tag, false>
54 {
56 
57  template <class ... T>
58  ConstValueHolder(T&& ... args):
59  value_(std::forward<T>(args)...)
60  {
61 
62  }
63 
64  friend const Value& get_value(const self_type& self)
65  { return self.value_; }
66 
67  friend const Value&& get_value(const self_type&& self)
68  { return std::move(self.value_); }
69 
70 private:
71  const Value value_;
72 };
73 
74 
75 template <class Value, std::size_t Tag = 0, bool = std::is_class_v<Value> and not std::is_final_v<Value>>
76 struct ValueHolder;
77 
78 template <class Value, std::size_t Tag>
79 struct ValueHolder<Value, Tag, true>:
80  public Value
81 {
83  using base_type = Value;
84 
85  using Value::Value;
86 
87  ValueHolder(const Value& v):
88  Value(v)
89  {
90 
91  }
92 
93  ValueHolder(Value&& v):
94  Value(std::move(v))
95  {
96 
97  }
98 
99  ValueHolder(const ValueHolder& v) = default;
100  ValueHolder(ValueHolder&& v) = default;
101 
102  ValueHolder& operator=(const ValueHolder& v) = default;
103  ValueHolder& operator=(ValueHolder&& v) = default;
104 
105  friend const Value& get_value(const self_type& self)
106  { return static_cast<const Value&>(self); }
107 
108  friend const Value&& get_value(const self_type&& self)
109  { return static_cast<const Value&&>(self); }
110 
111  friend Value& get_value(self_type& self)
112  { return static_cast<Value&>(self); }
113 
114  friend Value&& get_value(self_type&& self)
115  { return static_cast<Value&&>(self); }
116 
117 };
118 
119 
120 template <class Value, std::size_t Tag>
121 struct ValueHolder<Value, Tag, false>
122 {
124  template <class ... T>
125  ValueHolder(T&& ... args):
126  value_(std::forward<T>(args)...)
127  {
128 
129  }
130 
131  friend const Value& get_value(const self_type& self)
132  { return self.value_; }
133 
134  friend const Value&& get_value(const self_type&& self)
135  { return std::move(self.value_); }
136 
137  friend Value& get_value(self_type& self)
138  { return self.value_; }
139 
140  friend Value&& get_value(self_type&& self)
141  { return std::move(self.value_); }
142 
143 private:
144  Value value_;
145 };
146 
147 
148 } /* namespace te */
149 
150 #endif /* VALUE_HOLDER_H */
Definition: ValueHolder.h:13
Primary classes and utility functions for AnySet.
Definition: SetOperations.h:21
Definition: ValueHolder.h:121
T move(T... args)
Definition: ValueHolder.h:19
Definition: ValueHolder.h:53
Definition: AnyNode.h:93
Definition: ValueHolder.h:76
Definition: ValueHolder.h:79