Zserio C++ runtime library  1.0.0
Built for Zserio 2.13.0
Traits.h
Go to the documentation of this file.
1 #ifndef ZSERIO_TRAITS_H_INC
2 #define ZSERIO_TRAITS_H_INC
3 
4 #include <type_traits>
5 #include "zserio/NoInit.h"
6 #include "zserio/RebindAlloc.h"
7 
8 namespace zserio
9 {
10 
11 // forward declaration
12 class BitStreamReader;
13 struct PropagateAllocatorT;
14 template <typename>
16 template <typename, std::size_t>
17 class Span;
18 
19 namespace detail
20 {
21 
22 template <typename>
23 class inplace_optional_holder;
24 
25 template <typename, typename>
26 class heap_optional_holder;
27 
28 // These decltype's wrappers are needed because of old MSVC compiler 2015.
29 template <typename T, typename U = decltype(&T::initialize)>
30 struct decltype_initialize
31 {
32  using type = U;
33 };
34 
35 template <typename T, typename U = decltype(&T::initializeChildren)>
36 struct decltype_initialize_children
37 {
38  using type = U;
39 };
40 
41 template <typename T, typename U = decltype(std::declval<T>().reflectable())>
42 struct decltype_reflectable
43 {
44  using type = U;
45 };
46 
47 // declval is needed because otherwise MSVC 2015 states that std::allocator<int> does NOT have allocate method!
48 template <typename T, typename U = decltype(std::declval<T>().allocate(0))>
49 struct decltype_allocate
50 {
51  using type = U;
52 };
53 
54 template <typename T, typename U = decltype(std::declval<T>().deallocate(nullptr, 0))>
55 struct decltype_deallocate
56 {
57  using type = U;
58 };
59 
60 template <typename T, typename U = decltype(std::declval<T>().getValue())>
61 struct decltype_get_value
62 {
63  using type = U;
64 };
65 
66 template <typename T, typename U = decltype(&T::initializeOffset)>
67 struct decltype_initialize_offset
68 {
69  using type = U;
70 };
71 
72 template <typename T, typename U = decltype(&T::checkOffset)>
73 struct decltype_check_offset
74 {
75  using type = U;
76 };
77 
78 template <typename T, typename U = decltype(&T::initializeElement)>
79 struct decltype_initialize_element
80 {
81  using type = U;
82 };
83 
84 template <typename ...T>
85 struct make_void { using type = void; };
86 
87 template <typename ...T>
88 using void_t = typename make_void<T...>::type;
89 
90 } // namespace detail
91 
96 template <typename T, typename = void>
97 struct is_allocator : std::false_type
98 {};
99 
100 template <typename T>
101 struct is_allocator<T, detail::void_t<typename detail::decltype_allocate<T>::type,
102  typename detail::decltype_deallocate<T>::type>> : std::true_type
103 {};
110 template <typename ...ARGS>
111 struct is_first_allocator : std::false_type
112 {};
113 
114 template <typename T, typename ...ARGS>
115 struct is_first_allocator<T, ARGS...> : is_allocator<T>
116 {};
123 template <typename T, typename = void>
124 struct has_owner_type : std::false_type
125 {};
126 
127 template <typename T>
128 struct has_owner_type<T, detail::void_t<typename T::OwnerType>> : std::true_type
129 {};
136 template <typename T, typename = void>
137 struct has_zserio_packing_context : std::false_type
138 {};
139 
140 template <typename T>
141 struct has_zserio_packing_context<T, detail::void_t<typename T::ZserioPackingContext>> : std::true_type
142 {};
149 template <typename T, typename = void>
150 struct has_allocator : std::false_type
151 {};
152 
153 template <typename T>
154 struct has_allocator<T, detail::void_t<typename T::allocator_type>> : std::true_type
155 {};
162 template <typename T, typename = void>
163 struct has_initialize : std::false_type
164 {};
165 
166 template <typename T>
167 struct has_initialize<T, detail::void_t<typename detail::decltype_initialize<T>::type>> : std::true_type
168 {};
175 template <typename T, typename = void>
176 struct has_initialize_children : std::false_type
177 {};
178 
179 template <typename T>
180 struct has_initialize_children<T,
181  detail::void_t<typename detail::decltype_initialize_children<T>::type>> : std::true_type
182 {};
189 template <typename T, typename = void>
190 struct has_reflectable : std::false_type
191 {};
192 
193 template <typename T>
194 struct has_reflectable<T, detail::void_t<typename detail::decltype_reflectable<T>::type>> : std::true_type
195 {};
202 template <typename T, typename = void>
203 struct has_initialize_offset : std::false_type
204 {};
205 
206 template <typename T>
207 struct has_initialize_offset<T,
208  detail::void_t<typename detail::decltype_initialize_offset<T>::type>> : std::true_type
209 {};
218 template <typename T, typename = void>
219 struct has_check_offset : std::false_type
220 {};
221 
222 template <typename T>
223 struct has_check_offset<T,
224  detail::void_t<typename detail::decltype_check_offset<T>::type>> : std::true_type
225 {};
234 template <typename T, typename = void>
235 struct has_initialize_element : std::false_type
236 {};
237 
238 template <typename T>
239 struct has_initialize_element<T,
240  detail::void_t<typename detail::decltype_initialize_element<T>::type>> : std::true_type
241 {};
250 template <typename T, typename = void>
251 struct is_bitmask : std::false_type
252 {};
253 
254 template <typename T>
255 struct is_bitmask<T, detail::void_t<typename detail::decltype_get_value<T>::type,
256  typename T::underlying_type>> : std::true_type
257 {};
266 template <typename>
267 struct is_span : std::false_type
268 {};
269 
270 template <typename T, size_t Extent>
271 struct is_span<Span<T, Extent>> : std::true_type
272 {};
281 template <typename FIELD_TYPE, typename COMPOUND_TYPE, typename ALLOCATOR_TYPE, typename = void>
282 struct is_field_constructor_enabled : std::enable_if<
283  !std::is_same<typename std::decay<FIELD_TYPE>::type, ALLOCATOR_TYPE>::value &&
284  !std::is_same<typename std::decay<FIELD_TYPE>::type, BitStreamReader>::value &&
285  !std::is_same<typename std::decay<FIELD_TYPE>::type, COMPOUND_TYPE>::value &&
286  !std::is_same<typename std::decay<FIELD_TYPE>::type, PropagateAllocatorT>::value &&
287  !std::is_same<typename std::decay<FIELD_TYPE>::type, NoInitT>::value,
288  int>
289 {};
290 
291 template <typename FIELD_TYPE, typename COMPOUND_TYPE, typename ALLOCATOR_TYPE>
292 struct is_field_constructor_enabled<FIELD_TYPE, COMPOUND_TYPE, ALLOCATOR_TYPE,
293  detail::void_t<typename COMPOUND_TYPE::ZserioPackingContext>> : std::enable_if<
294  !std::is_same<typename std::decay<FIELD_TYPE>::type, ALLOCATOR_TYPE>::value &&
295  !std::is_same<typename std::decay<FIELD_TYPE>::type, BitStreamReader>::value &&
296  !std::is_same<typename std::decay<FIELD_TYPE>::type, COMPOUND_TYPE>::value &&
297  !std::is_same<typename std::decay<FIELD_TYPE>::type, PropagateAllocatorT>::value &&
298  !std::is_same<typename std::decay<FIELD_TYPE>::type, NoInitT>::value &&
299  !std::is_same<typename std::decay<FIELD_TYPE>::type,
300  typename COMPOUND_TYPE::ZserioPackingContext>::value,
301  int>
302 {};
308 template <typename FIELD_TYPE, typename COMPOUND_TYPE, typename ALLOCATOR_TYPE>
311 
312 } // namespace zserio
313 
314 #endif // ifndef ZSERIO_TRAITS_H_INC
typename is_field_constructor_enabled< FIELD_TYPE, COMPOUND_TYPE, ALLOCATOR_TYPE >::type is_field_constructor_enabled_t
Definition: Traits.h:310