1 #ifndef ZSERIO_TRAITS_H_INC
2 #define ZSERIO_TRAITS_H_INC
14 class BitStreamReader;
15 struct PropagateAllocatorT;
18 template <
typename,
size_t>
25 class inplace_optional_holder;
27 template <
typename,
typename>
28 class heap_optional_holder;
31 template <
typename T,
typename U = decltype(&T::initialize)>
32 struct decltype_initialize
37 template <
typename T,
typename U = decltype(&T::initializeChildren)>
38 struct decltype_initialize_children
43 template <typename T, typename U = decltype(std::declval<T>().reflectable())>
44 struct decltype_reflectable
50 template <typename T, typename U = decltype(std::declval<T>().allocate(0))>
51 struct decltype_allocate
56 template <typename T, typename U = decltype(std::declval<T>().deallocate(
nullptr, 0))>
57 struct decltype_deallocate
62 template <typename T, typename U = decltype(std::declval<T>().getValue())>
63 struct decltype_get_value
68 template <
typename T,
typename U = decltype(&T::initializeOffset)>
69 struct decltype_initialize_offset
74 template <
typename T,
typename U = decltype(&T::checkOffset)>
75 struct decltype_check_offset
80 template <
typename T,
typename U = decltype(&T::initializeElement)>
81 struct decltype_initialize_element
86 template <
typename... T>
92 template <
typename... T>
93 using void_t =
typename make_void<T...>::type;
101 template <
typename T,
typename =
void>
105 template <
typename T>
107 detail::void_t<typename detail::decltype_allocate<T>::type,
108 typename detail::decltype_deallocate<T>::type>> : std::true_type
116 template <
typename... ARGS>
120 template <
typename T,
typename... ARGS>
129 template <
typename T,
typename =
void>
133 template <
typename T>
134 struct has_owner_type<T, detail::void_t<typename T::OwnerType>> : std::true_type
142 template <
typename T,
typename =
void>
146 template <
typename T>
155 template <
typename T,
typename =
void>
159 template <
typename T>
160 struct has_allocator<T, detail::void_t<typename T::allocator_type>> : std::true_type
168 template <
typename T,
typename =
void>
172 template <
typename T>
173 struct has_initialize<T, detail::void_t<typename detail::decltype_initialize<T>::type>> : std::true_type
181 template <
typename T,
typename =
void>
185 template <
typename T>
195 template <
typename T,
typename =
void>
199 template <
typename T>
200 struct has_reflectable<T, detail::void_t<typename detail::decltype_reflectable<T>::type>> : std::true_type
208 template <
typename T,
typename =
void>
212 template <
typename T>
213 struct has_initialize_offset<T, detail::void_t<typename detail::decltype_initialize_offset<T>::type>>
224 template <
typename T,
typename =
void>
228 template <
typename T>
229 struct has_check_offset<T, detail::void_t<typename detail::decltype_check_offset<T>::type>> : std::true_type
239 template <
typename T,
typename =
void>
243 template <
typename T>
255 template <
typename T,
typename =
void>
259 template <
typename T>
260 struct is_bitmask<T, detail::void_t<typename detail::decltype_get_value<T>::type, typename T::underlying_type>>
275 template <
typename T,
size_t Extent>
286 template <
typename FIELD_TYPE,
typename COMPOUND_TYPE,
typename ALLOCATOR_TYPE,
typename =
void>
288 : std::enable_if<!std::is_same<typename std::decay<FIELD_TYPE>::type, ALLOCATOR_TYPE>::value &&
289 !std::is_same<typename std::decay<FIELD_TYPE>::type, BitStreamReader>::value &&
290 !std::is_same<typename std::decay<FIELD_TYPE>::type, COMPOUND_TYPE>::value &&
291 !std::is_same<typename std::decay<FIELD_TYPE>::type, PropagateAllocatorT>::value &&
292 !std::is_same<typename std::decay<FIELD_TYPE>::type, NoInitT>::value,
296 template <
typename FIELD_TYPE,
typename COMPOUND_TYPE,
typename ALLOCATOR_TYPE>
298 detail::void_t<typename COMPOUND_TYPE::ZserioPackingContext>>
299 : std::enable_if<!std::is_same<typename std::decay<FIELD_TYPE>::type, ALLOCATOR_TYPE>::value &&
300 !std::is_same<typename std::decay<FIELD_TYPE>::type, BitStreamReader>::value &&
301 !std::is_same<typename std::decay<FIELD_TYPE>::type, COMPOUND_TYPE>::value &&
302 !std::is_same<typename std::decay<FIELD_TYPE>::type, PropagateAllocatorT>::value &&
303 !std::is_same<typename std::decay<FIELD_TYPE>::type, NoInitT>::value &&
304 !std::is_same<typename std::decay<FIELD_TYPE>::type,
305 typename COMPOUND_TYPE::ZserioPackingContext>::value,
313 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