14 #include <type_traits>
28 template <
typename T,
bool C>
struct extract_type_helper;
29 template <
typename T>
struct extract_type_helper<T, true>
31 typedef typename T::type type;
34 template <
typename T>
struct extract_type_helper<T, false>
40 class remove_reference_wrapper
48 static yes& test(
typename C::type*);
53 static const bool has_type_field =
sizeof(test<T>(
nullptr)) ==
sizeof(yes);
54 typedef typename extract_type_helper<T, has_type_field>::type extracted_type;
55 typedef std::is_same<std::reference_wrapper<extracted_type>, T> is_reference_wrapper;
58 typedef typename std::conditional<is_reference_wrapper::value, extracted_type, T>::type type;
66 ObjectContainer(
void);
68 virtual ~ObjectContainer(
void);
70 void *
operator new(
const size_t size);
72 void operator delete(
void *memory,
const size_t size);
74 virtual const std::type_info &type(
void)
const = 0;
75 virtual const std::type_info &rawType(
void)
const = 0;
77 std::atomic<int> counter;
79 static void throwExtract(
const Object &obj,
const std::type_info &type);
81 template <
typename ValueType>
82 static ValueType &extract(
const Object &obj);
84 virtual void *
get(void)
const = 0;
90 template <
typename ValueType>
91 struct ObjectContainerType
93 typedef typename std::conditional<
97 std::is_base_of<std::ios_base, ValueType>::value,
98 std::reference_wrapper<ValueType>, ValueType
102 template <
typename ValueType>
103 struct ObjectContainerT : ObjectContainer
106 ObjectContainerT(
void)
111 template <
typename T>
112 ObjectContainerT(T &&value):
113 value(std::forward<T>(value))
118 ~ObjectContainerT(
void)
127 const std::type_info &type(
void)
const
129 return typeid(
typename remove_reference_wrapper<ValueType>::type);
136 const std::type_info &rawType(
void)
const
138 return typeid(ValueType);
141 typename ObjectContainerType<ValueType>::type value;
143 void *
get(void)
const
145 return (
void *)std::addressof(this->value);
152 template <
typename ValueType>
153 ValueType &ObjectContainer::extract(
const Object &obj)
155 typedef typename std::decay<ValueType>::type DecayValueType;
158 if (obj._impl ==
nullptr and obj.type() ==
typeid(ValueType))
160 return *(
reinterpret_cast<typename ObjectContainerType<DecayValueType>::type *
>(0));
165 typedef std::reference_wrapper<DecayValueType> refWrapperType;
166 if (obj._impl !=
nullptr and obj._impl->rawType() ==
typeid(refWrapperType))
168 return *(
reinterpret_cast<typename ObjectContainerType<refWrapperType>::type *
>(obj._impl->get()));
172 if (obj._impl !=
nullptr and obj.type() ==
typeid(ValueType))
174 return *(
reinterpret_cast<typename ObjectContainerType<DecayValueType>::type *
>(obj._impl->get()));
177 Detail::ObjectContainer::throwExtract(obj,
typeid(ValueType));
throw;
183 template <
typename ValueType>
184 ObjectContainer *makeObjectContainer(ValueType &&value)
186 return new ObjectContainerT<typename std::decay<ValueType>::type>(std::forward<ValueType>(value));
194 inline ObjectContainer *makeObjectContainer(NullObject &&)
205 POTHOS_API ObjectContainer *makeObjectContainer(
const char *s);
209 template <
typename ValueType>
213 o.
_impl = Detail::makeObjectContainer(std::forward<ValueType>(value));
217 template <
typename ValueType>
221 _impl = Detail::makeObjectContainer(std::forward<ValueType>(value));
224 template <
typename ValueType>
227 return Detail::ObjectContainer::extract<ValueType>(*this);
230 template <
typename ValueType>
234 return newObj.
extract<ValueType>();
#define POTHOS_API
Definition: Config.hpp:41
static Object make(ValueType &&value)
Definition: ObjectImpl.hpp:210
const ValueType & extract(void) const
Definition: ObjectImpl.hpp:225
Detail::ObjectContainer * _impl
Private implementation details.
Definition: Object.hpp:258
Definition: Object.hpp:55
ValueType convert(void) const
Definition: ObjectImpl.hpp:231