libqi-api  2.8.7.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
optionaltypeinterface.hxx
Go to the documentation of this file.
1 /*
2 ** Copyright (C) 2017 SoftBank Robotics
3 ** See COPYING for the license
4 */
5 
6 #ifndef QITYPE_DETAIL_OPTIONALTYPEINTERFACE_HXX
7 #define QITYPE_DETAIL_OPTIONALTYPEINTERFACE_HXX
8 
11 #include <boost/optional.hpp>
12 
13 #if defined(__cpp_lib_optional) && defined(__has_include)
14 # if __has_include(<optional>)
15 # include <optional>
16 # define QI_HAS_STD_OPTIONAL 1
17 # else
18 # define QI_HAS_STD_OPTIONAL 0
19 # endif
20 #else
21 # define QI_HAS_STD_OPTIONAL 0
22 #endif
23 
24 namespace qi
25 {
28  template<typename O>
30  {
31  public:
32  using ValueType = typename O::value_type;
33 
35  TypeInterface* valueType() override;
36  bool hasValue(void* storage) override;
37  AnyReference value(void* storage) override;
38  void set(void** storage, void* valueStorage) override;
39  void reset(void** storage) override;
40 
44  };
45 
46  template<typename O>
48  {
49  _valueType = typeOf<ValueType>();
50  }
51 
52  template<typename O>
54  {
55  return _valueType;
56  }
57 
58  template<typename O>
60  {
61  auto& opt = *reinterpret_cast<O*>(ptrFromStorage(&storage));
62  return static_cast<bool>(opt);
63  }
64 
65  template<typename O>
67  {
68  auto& opt = *reinterpret_cast<O*>(ptrFromStorage(&storage));
69  return opt ? AutoAnyReference(opt.value()) : AnyReference(typeOf<void>());
70  }
71 
72  template<typename O>
73  void OptionalTypeInterfaceImpl<O>::set(void** storage, void* valueStorage)
74  {
75  auto& opt = *reinterpret_cast<O*>(ptrFromStorage(storage));
76  opt = *reinterpret_cast<ValueType*>(_valueType->ptrFromStorage(&valueStorage));
77  }
78 
79  template<typename O>
81  {
82  auto& opt = *reinterpret_cast<O*>(ptrFromStorage(storage));
83  opt = O{};
84  }
85 
86  template <typename T>
87  class TypeImpl<boost::optional<T>> : public OptionalTypeInterfaceImpl<boost::optional<T>> {};
88 #if QI_HAS_STD_OPTIONAL
89  template<typename T>
90  class TypeImpl<std::optional<T>>: public OptionalTypeInterfaceImpl<std::optional<T>>{};
91 #endif
92 
93  template<> class TypeImpl<boost::none_t>: public TypeImpl<void> {};
94 #if QI_HAS_STD_OPTIONAL
95  template<> class TypeImpl<std::nullopt_t>: public TypeImpl<void> {};
96 #endif
97 }
98 
99 #endif // QITYPE_DETAIL_OPTIONALTYPEINTERFACE_HXX
virtual void * ptrFromStorage(void **)=0
AnyReference value(void *storage) override
Get the optional value or a default constructed AnyReference if no value is set.
#define _QI_BOUNCE_TYPE_METHODS(Bounce)
Implement all methods of Type as bouncers to Bouncer.
Definition: typeimpl.hxx:273
void reset(void **storage) override
Resets the optional value, making the optional empty.
TypeInterface * valueType() override
Get the type of the optional element.
void set(void **storage, void *valueStorage) override
Set the optional value.
bool hasValue(void *storage) override
Return true if the optional has a value, false if not.