Zserio C++ runtime library  1.4.0
Built for Zserio 2.18.1
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 
6 #include "zserio/NoInit.h"
7 #include "zserio/RebindAlloc.h"
8 #include "zserio/Types.h"
9 
10 namespace zserio
11 {
12 
13 // forward declarations
14 class BitStreamReader;
15 
16 struct PropagateAllocatorT;
17 
18 template <typename>
20 
21 template <typename, size_t>
22 class Span;
23 
24 class ArrayPreallocation;
25 
26 namespace detail
27 {
28 
29 template <typename>
30 class inplace_optional_holder;
31 
32 template <typename, typename>
33 class heap_optional_holder;
34 
35 // These decltype's wrappers are needed because of old MSVC compiler 2015.
36 template <typename T, typename U = decltype(&T::initialize)>
37 struct decltype_initialize
38 {
39  using type = U;
40 };
41 
42 template <typename T, typename U = decltype(&T::initializeChildren)>
43 struct decltype_initialize_children
44 {
45  using type = U;
46 };
47 
48 template <typename T, typename U = decltype(std::declval<T>().reflectable())>
49 struct decltype_reflectable
50 {
51  using type = U;
52 };
53 
54 // declval is needed because otherwise MSVC 2015 states that std::allocator<int> does NOT have allocate method!
55 template <typename T, typename U = decltype(std::declval<T>().allocate(0))>
56 struct decltype_allocate
57 {
58  using type = U;
59 };
60 
61 template <typename T, typename U = decltype(std::declval<T>().deallocate(nullptr, 0))>
62 struct decltype_deallocate
63 {
64  using type = U;
65 };
66 
67 template <typename T, typename U = decltype(std::declval<T>().getValue())>
68 struct decltype_get_value
69 {
70  using type = U;
71 };
72 
73 template <typename T, typename U = decltype(&T::initializeOffset)>
74 struct decltype_initialize_offset
75 {
76  using type = U;
77 };
78 
79 template <typename T, typename U = decltype(&T::checkOffset)>
80 struct decltype_check_offset
81 {
82  using type = U;
83 };
84 
85 template <typename T, typename U = decltype(&T::initializeElement)>
86 struct decltype_initialize_element
87 {
88  using type = U;
89 };
90 
91 template <typename... T>
92 struct make_void
93 {
94  using type = void;
95 };
96 
97 template <typename... T>
98 using void_t = typename make_void<T...>::type;
99 
100 } // namespace detail
101 
106 template <typename T, typename = void>
107 struct is_allocator : std::false_type
108 {};
109 
110 template <typename T>
111 struct is_allocator<T,
112  detail::void_t<typename detail::decltype_allocate<T>::type,
113  typename detail::decltype_deallocate<T>::type>> : std::true_type
114 {};
121 template <typename... ARGS>
122 struct is_first_allocator : std::false_type
123 {};
124 
125 template <typename T, typename... ARGS>
126 struct is_first_allocator<T, ARGS...> : is_allocator<T>
127 {};
134 template <typename... ARGS>
135 struct is_first_array_preallocation : std::false_type
136 {};
137 
138 template <typename T, typename... ARGS>
139 struct is_first_array_preallocation<T, ARGS...> : std::is_same<typename std::decay<T>::type, ArrayPreallocation>
140 {};
147 template <typename T, typename = void>
148 struct has_owner_type : std::false_type
149 {};
150 
151 template <typename T>
152 struct has_owner_type<T, detail::void_t<typename T::OwnerType>> : std::true_type
153 {};
160 template <typename T, typename = void>
161 struct has_zserio_packing_context : std::false_type
162 {};
163 
164 template <typename T>
165 struct has_zserio_packing_context<T, detail::void_t<typename T::ZserioPackingContext>> : std::true_type
166 {};
173 template <typename T, typename = void>
174 struct has_allocator : std::false_type
175 {};
176 
177 template <typename T>
178 struct has_allocator<T, detail::void_t<typename T::allocator_type>> : std::true_type
179 {};
186 template <typename T, typename = void>
187 struct has_initialize : std::false_type
188 {};
189 
190 template <typename T>
191 struct has_initialize<T, detail::void_t<typename detail::decltype_initialize<T>::type>> : std::true_type
192 {};
199 template <typename T, typename = void>
200 struct has_initialize_children : std::false_type
201 {};
202 
203 template <typename T>
204 struct has_initialize_children<T, detail::void_t<typename detail::decltype_initialize_children<T>::type>>
205  : std::true_type
206 {};
213 template <typename T, typename = void>
214 struct has_reflectable : std::false_type
215 {};
216 
217 template <typename T>
218 struct has_reflectable<T, detail::void_t<typename detail::decltype_reflectable<T>::type>> : std::true_type
219 {};
226 template <typename T, typename = void>
227 struct has_initialize_offset : std::false_type
228 {};
229 
230 template <typename T>
231 struct has_initialize_offset<T, detail::void_t<typename detail::decltype_initialize_offset<T>::type>>
232  : std::true_type
233 {};
242 template <typename T, typename = void>
243 struct has_check_offset : std::false_type
244 {};
245 
246 template <typename T>
247 struct has_check_offset<T, detail::void_t<typename detail::decltype_check_offset<T>::type>> : std::true_type
248 {};
257 template <typename T, typename = void>
258 struct has_initialize_element : std::false_type
259 {};
260 
261 template <typename T>
262 struct has_initialize_element<T, detail::void_t<typename detail::decltype_initialize_element<T>::type>>
263  : std::true_type
264 {};
273 template <typename T, typename = void>
274 struct is_bitmask : std::false_type
275 {};
276 
277 template <typename T>
278 struct is_bitmask<T, detail::void_t<typename detail::decltype_get_value<T>::type, typename T::underlying_type>>
279  : std::true_type
280 {};
289 template <typename>
290 struct is_span : std::false_type
291 {};
292 
293 template <typename T, size_t Extent>
294 struct is_span<Span<T, Extent>> : std::true_type
295 {};
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,
311  int>
312 {};
313 
314 template <typename FIELD_TYPE, typename COMPOUND_TYPE, typename ALLOCATOR_TYPE>
315 struct is_field_constructor_enabled<FIELD_TYPE, COMPOUND_TYPE, 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,
324  int>
325 {};
331 template <typename FIELD_TYPE, typename COMPOUND_TYPE, typename ALLOCATOR_TYPE>
334 
335 } // namespace zserio
336 
337 #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:333