4 #ifndef __SIMPLE_THREADING_DATA__
5 #define __SIMPLE_THREADING_DATA__
11 #include "utility.hpp"
30 m_type_info(&typeid(
unset)),
31 m_data_ptr(data_pointer_t(nullptr,
data::no_delete))
36 m_type_info(rhs.m_type_info),
37 m_data_ptr(std::move(rhs.m_data_ptr))
48 template <
typename T,
typename... As>
50 return data(detail::hint<
typename std::remove_reference<T>::type>(), std::forward<As>(as)...);
55 m_type_info = rhs.m_type_info;
56 m_data_ptr = std::move(rhs.m_data_ptr);
67 inline operator bool()
const {
68 return m_data_ptr.data_pointer_t::operator bool();
86 return m_data_ptr && *m_type_info ==
typeid(T);
93 return m_data_ptr.get();
106 template <
typename T>
108 return *((detail::base<T>*)(
get()));
117 template <
typename T>
133 template <
typename T>
136 std::swap(t, cast_to<T>());
144 typedef void(*deleter_t)(
void*);
145 typedef std::unique_ptr<void,deleter_t> data_pointer_t;
146 typedef void*(*allocator_t)(
void*);
148 template <
typename T,
typename... As>
149 data(detail::hint<T> h, As&&... as) :
150 m_type_info(&typeid(T)),
151 m_data_ptr(allocate<T>(std::forward<As>(as)...),
data::deleter<T>)
154 template <
typename T,
typename... As>
155 static void* allocate(As&&... as) {
156 return (
void*)(
new detail::base<T>(std::forward<As>(as)...));
159 template <
typename T>
160 static void deleter(
void* p) {
161 delete (detail::base<T>*)p;
164 static inline void no_delete(
void* p) { }
166 const std::type_info* m_type_info;
167 data_pointer_t m_data_ptr;
type erased data container
Definition: data.hpp:24
data(const data &rhs)=delete
no lvalue constructor or copy
data()
default constructor
Definition: data.hpp:29
data(data &&rhs)
rvalue constructor
Definition: data.hpp:35
bool copy_to(T &t)
copy the data payload to argument t
Definition: data.hpp:118
bool is() const
determine at runtime whether the type erased data type code matches the templated type code.
Definition: data.hpp:85
const std::type_info & type_info() const
Definition: data.hpp:76
bool move_to(T &t)
rvalue swap the data payload to argument t
Definition: data.hpp:134
T & cast_to()
cast message data payload to templated type reference
Definition: data.hpp:107
data & operator=(data &&rhs)
rvalue copy
Definition: data.hpp:54
void * get()
Definition: data.hpp:92
static data make(As &&... as)
construct a data payload using explicit template typing instead of by deduction
Definition: data.hpp:49