siplasplas
A library for C++ reflection and introspection
field.hpp
1 #ifndef SIPLASPLAS_TYPEERASURE_FIELD_HPP
2 #define SIPLASPLAS_TYPEERASURE_FIELD_HPP
3 
4 #include "function.hpp"
5 
6 namespace cpp
7 {
8 
9 namespace typeerasure
10 {
11 
24 template<typename Storage, typename ObjectArgStorage = Storage>
25 class Field
26 {
27 public:
28  Field() = default;
29 
35  bool empty() const
36  {
37  return _invoke.empty();
38  }
39 
52  cpp::FunctionKind kind() const
53  {
54  return _invoke.kind();
55  }
56 
60  template<typename T, typename = std::enable_if_t<
61  std::is_member_object_pointer<std::decay_t<T>>::value
62  >>
63  Field(T&& field) :
64  _invoke{std::forward<T>(field)}
65  {}
66 
78  template<typename Object>
79  decltype(auto) get(const Object& object) const
80  {
81  return _invoke(object);
82  }
83 
98  template<typename T, typename Object>
99  decltype(auto) getAs(const Object& object) const
100  {
101  return get(object).template get<T>();
102  }
103 
115  template<typename Object>
125  decltype(auto) get(Object& object) const
126  {
127  return _invoke(object);
128  }
129 
144  template<typename T, typename Object>
145  decltype(auto) getAs(Object& object) const
146  {
147  return get(object).template get<T>();
148  }
149 
161  template<typename Storage_>
162  decltype(auto) get(const cpp::SimpleAny<Storage_>& object) const
163  {
164  return _invoke(object.getReference());
165  }
166 
181  template<typename T, typename Storage_>
182  decltype(auto) getAs(const cpp::SimpleAny<Storage_>& object) const
183  {
184  return get(object).template get<T>();
185  }
186 
198  template<typename Storage_>
199  decltype(auto) get(cpp::SimpleAny<Storage_>& object) const
200  {
201  return _invoke(object.getReference());
202  }
203 
215  decltype(auto) get(cpp::ReferenceSimpleAny& object) const
216  {
217  return _invoke(object);
218  }
219 
231  decltype(auto) get(cpp::ConstReferenceSimpleAny& object) const
232  {
233  return _invoke(object);
234  }
249  template<typename T, typename Storage_>
250  decltype(auto) getAs(cpp::SimpleAny<Storage_>& object) const
251  {
252  return get(object).template get<T>();
253  }
254 
258  template<typename T>
259  std::enable_if_t<
260  std::is_member_object_pointer<std::decay_t<T>>::value,
261  Field&
262  >
263  operator=(T&& field)
264  {
265  _invoke = std::forward<T>(field);
266  return *this;
267  }
268 
278  template<typename T>
279  const T& get() const
280  {
281  return _invoke.template get<T>();
282  }
283 
293  template<typename T>
294  T& get()
295  {
296  return _invoke.template get<T>();
297  }
298 
299 private:
301 };
302 
303 
309 
315 
321 
327 
328 }
329 
330 }
331 
332 #endif // SIPLASPLAS_TYPEERASURE_FIELD_HPP
cpp::SimpleAny specialization for non-owning const references to existing objects. See cpp::ConstNonOwningStorage
Definition: simpleany.hpp:41
Definition: canary_allocator.hpp:7
Stores a type erased member object pointer.
Definition: field.hpp:25
std::enable_if_t< std::is_member_object_pointer< std::decay_t< T > >::value, Field & > operator=(T &&field)
Assigns a new member object pointer to the Field object.
Definition: field.hpp:263
const T & get() const
Returns a reference to the member object pointer stored by the Field object.
Definition: field.hpp:279
cpp::SimpleAny specialization for non-owning references to existing objects. See cpp::NonOwningStorag...
Definition: simpleany.hpp:162
decltype(auto) getAs(const Object &object) const
Returns the value of the member object of a given object.
Definition: field.hpp:99
Implements a type-erased value container with minimal value semantics requirements.
Definition: simpleany.hpp:15
Field(T &&field)
Initializes a Field with a given member object pointer.
Definition: field.hpp:63
Stores a type-erased callable of any signature and kind.
Definition: function.hpp:58
bool empty() const
Checks if the field is empty Empty is defined as having no member object pointer assigned to the Fiel...
Definition: field.hpp:35
cpp::FunctionKind kind() const
Returns a reference to the member object pointer stored by the Field object.
Definition: field.hpp:52