Zserio C++ runtime library  1.3.0
Built for Zserio 2.18.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 
6 #include "zserio/NoInit.h"
7 #include "zserio/RebindAlloc.h"
8 #include "zserio/Types.h"
9 
10 namespace zserio
11 {
12 
13 // forward declaration
14 class BitStreamReader;
15 struct PropagateAllocatorT;
16 template <typename>
18 template <typename, size_t>
19 class Span;
20 
21 namespace detail
22 {
23 
24 template <typename>
25 class inplace_optional_holder;
26 
27 template <typename, typename>
28 class heap_optional_holder;
29 
30 // These decltype's wrappers are needed because of old MSVC compiler 2015.
31 template <typename T, typename U = decltype(&T::initialize)>
32 struct decltype_initialize
33 {
34  using type = U;
35 };
36 
37 template <typename T, typename U = decltype(&T::initializeChildren)>
38 struct decltype_initialize_children
39 {
40  using type = U;
41 };
42 
43 template <typename T, typename U = decltype(std::declval<T>().reflectable())>
44 struct decltype_reflectable
45 {
46  using type = U;
47 };
48 
49 // declval is needed because otherwise MSVC 2015 states that std::allocator<int> does NOT have allocate method!
50 template <typename T, typename U = decltype(std::declval<T>().allocate(0))>
51 struct decltype_allocate
52 {
53  using type = U;
54 };
55 
56 template <typename T, typename U = decltype(std::declval<T>().deallocate(nullptr, 0))>
57 struct decltype_deallocate
58 {
59  using type = U;
60 };
61 
62 template <typename T, typename U = decltype(std::declval<T>().getValue())>
63 struct decltype_get_value
64 {
65  using type = U;
66 };
67 
68 template <typename T, typename U = decltype(&T::initializeOffset)>
69 struct decltype_initialize_offset
70 {
71  using type = U;
72 };
73 
74 template <typename T, typename U = decltype(&T::checkOffset)>
75 struct decltype_check_offset
76 {
77  using type = U;
78 };
79 
80 template <typename T, typename U = decltype(&T::initializeElement)>
81 struct decltype_initialize_element
82 {
83  using type = U;
84 };
85 
86 template <typename... T>
87 struct make_void
88 {
89  using type = void;
90 };
91 
92 template <typename... T>
93 using void_t = typename make_void<T...>::type;
94 
95 } // namespace detail
96 
101 template <typename T, typename = void>
102 struct is_allocator : std::false_type
103 {};
104 
105 template <typename T>
106 struct is_allocator<T,
107  detail::void_t<typename detail::decltype_allocate<T>::type,
108  typename detail::decltype_deallocate<T>::type>> : std::true_type
109 {};
116 template <typename... ARGS>
117 struct is_first_allocator : std::false_type
118 {};
119 
120 template <typename T, typename... ARGS>
121 struct is_first_allocator<T, ARGS...> : is_allocator<T>
122 {};
129 template <typename T, typename = void>
130 struct has_owner_type : std::false_type
131 {};
132 
133 template <typename T>
134 struct has_owner_type<T, detail::void_t<typename T::OwnerType>> : std::true_type
135 {};
142 template <typename T, typename = void>
143 struct has_zserio_packing_context : std::false_type
144 {};
145 
146 template <typename T>
147 struct has_zserio_packing_context<T, detail::void_t<typename T::ZserioPackingContext>> : std::true_type
148 {};
155 template <typename T, typename = void>
156 struct has_allocator : std::false_type
157 {};
158 
159 template <typename T>
160 struct has_allocator<T, detail::void_t<typename T::allocator_type>> : std::true_type
161 {};
168 template <typename T, typename = void>
169 struct has_initialize : std::false_type
170 {};
171 
172 template <typename T>
173 struct has_initialize<T, detail::void_t<typename detail::decltype_initialize<T>::type>> : std::true_type
174 {};
181 template <typename T, typename = void>
182 struct has_initialize_children : std::false_type
183 {};
184 
185 template <typename T>
186 struct has_initialize_children<T, detail::void_t<typename detail::decltype_initialize_children<T>::type>>
187  : std::true_type
188 {};
195 template <typename T, typename = void>
196 struct has_reflectable : std::false_type
197 {};
198 
199 template <typename T>
200 struct has_reflectable<T, detail::void_t<typename detail::decltype_reflectable<T>::type>> : std::true_type
201 {};
208 template <typename T, typename = void>
209 struct has_initialize_offset : std::false_type
210 {};
211 
212 template <typename T>
213 struct has_initialize_offset<T, detail::void_t<typename detail::decltype_initialize_offset<T>::type>>
214  : std::true_type
215 {};
224 template <typename T, typename = void>
225 struct has_check_offset : std::false_type
226 {};
227 
228 template <typename T>
229 struct has_check_offset<T, detail::void_t<typename detail::decltype_check_offset<T>::type>> : std::true_type
230 {};
239 template <typename T, typename = void>
240 struct has_initialize_element : std::false_type
241 {};
242 
243 template <typename T>
244 struct has_initialize_element<T, detail::void_t<typename detail::decltype_initialize_element<T>::type>>
245  : std::true_type
246 {};
255 template <typename T, typename = void>
256 struct is_bitmask : std::false_type
257 {};
258 
259 template <typename T>
260 struct is_bitmask<T, detail::void_t<typename detail::decltype_get_value<T>::type, typename T::underlying_type>>
261  : std::true_type
262 {};
271 template <typename>
272 struct is_span : std::false_type
273 {};
274 
275 template <typename T, size_t Extent>
276 struct is_span<Span<T, Extent>> : std::true_type
277 {};
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,
293  int>
294 {};
295 
296 template <typename FIELD_TYPE, typename COMPOUND_TYPE, typename ALLOCATOR_TYPE>
297 struct is_field_constructor_enabled<FIELD_TYPE, COMPOUND_TYPE, 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,
306  int>
307 {};
313 template <typename FIELD_TYPE, typename COMPOUND_TYPE, typename ALLOCATOR_TYPE>
316 
317 } // namespace zserio
318 
319 #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:315