1 #ifndef ZSERIO_TRAITS_H_INC
2 #define ZSERIO_TRAITS_H_INC
14 class BitStreamReader;
16 struct PropagateAllocatorT;
21 template <
typename,
size_t>
30 class inplace_optional_holder;
32 template <
typename,
typename>
33 class heap_optional_holder;
36 template <
typename T,
typename U = decltype(&T::initialize)>
37 struct decltype_initialize
42 template <
typename T,
typename U = decltype(&T::initializeChildren)>
43 struct decltype_initialize_children
48 template <typename T, typename U = decltype(std::declval<T>().reflectable())>
49 struct decltype_reflectable
55 template <typename T, typename U = decltype(std::declval<T>().allocate(0))>
56 struct decltype_allocate
61 template <typename T, typename U = decltype(std::declval<T>().deallocate(
nullptr, 0))>
62 struct decltype_deallocate
67 template <typename T, typename U = decltype(std::declval<T>().getValue())>
68 struct decltype_get_value
73 template <
typename T,
typename U = decltype(&T::initializeOffset)>
74 struct decltype_initialize_offset
79 template <
typename T,
typename U = decltype(&T::checkOffset)>
80 struct decltype_check_offset
85 template <
typename T,
typename U = decltype(&T::initializeElement)>
86 struct decltype_initialize_element
91 template <
typename... T>
97 template <
typename... T>
98 using void_t =
typename make_void<T...>::type;
106 template <
typename T,
typename =
void>
110 template <
typename T>
112 detail::void_t<typename detail::decltype_allocate<T>::type,
113 typename detail::decltype_deallocate<T>::type>> : std::true_type
121 template <
typename... ARGS>
125 template <
typename T,
typename... ARGS>
134 template <
typename... ARGS>
138 template <
typename T,
typename... ARGS>
147 template <
typename T,
typename =
void>
151 template <
typename T>
152 struct has_owner_type<T, detail::void_t<typename T::OwnerType>> : std::true_type
160 template <
typename T,
typename =
void>
164 template <
typename T>
173 template <
typename T,
typename =
void>
177 template <
typename T>
178 struct has_allocator<T, detail::void_t<typename T::allocator_type>> : std::true_type
186 template <
typename T,
typename =
void>
190 template <
typename T>
191 struct has_initialize<T, detail::void_t<typename detail::decltype_initialize<T>::type>> : std::true_type
199 template <
typename T,
typename =
void>
203 template <
typename T>
213 template <
typename T,
typename =
void>
217 template <
typename T>
218 struct has_reflectable<T, detail::void_t<typename detail::decltype_reflectable<T>::type>> : std::true_type
226 template <
typename T,
typename =
void>
230 template <
typename T>
231 struct has_initialize_offset<T, detail::void_t<typename detail::decltype_initialize_offset<T>::type>>
242 template <
typename T,
typename =
void>
246 template <
typename T>
247 struct has_check_offset<T, detail::void_t<typename detail::decltype_check_offset<T>::type>> : std::true_type
257 template <
typename T,
typename =
void>
261 template <
typename T>
273 template <
typename T,
typename =
void>
277 template <
typename T>
278 struct is_bitmask<T, detail::void_t<typename detail::decltype_get_value<T>::type, typename T::underlying_type>>
293 template <
typename T,
size_t Extent>
304 template <
typename FIELD_TYPE,
typename COMPOUND_TYPE,
typename ALLOCATOR_TYPE,
typename =
void>
306 : std::enable_if<!std::is_same<typename std::decay<FIELD_TYPE>::type, ALLOCATOR_TYPE>::value &&
307 !std::is_same<typename std::decay<FIELD_TYPE>::type, BitStreamReader>::value &&
308 !std::is_same<typename std::decay<FIELD_TYPE>::type, COMPOUND_TYPE>::value &&
309 !std::is_same<typename std::decay<FIELD_TYPE>::type, PropagateAllocatorT>::value &&
310 !std::is_same<typename std::decay<FIELD_TYPE>::type, NoInitT>::value,
314 template <
typename FIELD_TYPE,
typename COMPOUND_TYPE,
typename ALLOCATOR_TYPE>
316 detail::void_t<typename COMPOUND_TYPE::ZserioPackingContext>>
317 : std::enable_if<!std::is_same<typename std::decay<FIELD_TYPE>::type, ALLOCATOR_TYPE>::value &&
318 !std::is_same<typename std::decay<FIELD_TYPE>::type, BitStreamReader>::value &&
319 !std::is_same<typename std::decay<FIELD_TYPE>::type, COMPOUND_TYPE>::value &&
320 !std::is_same<typename std::decay<FIELD_TYPE>::type, PropagateAllocatorT>::value &&
321 !std::is_same<typename std::decay<FIELD_TYPE>::type, NoInitT>::value &&
322 !std::is_same<typename std::decay<FIELD_TYPE>::type,
323 typename COMPOUND_TYPE::ZserioPackingContext>::value,
331 template <
typename FIELD_TYPE,
typename COMPOUND_TYPE,
typename ALLOCATOR_TYPE>
typename is_field_constructor_enabled< FIELD_TYPE, COMPOUND_TYPE, ALLOCATOR_TYPE >::type is_field_constructor_enabled_t