1// (C) Copyright 2009-2011 Frederic Bron.
2//
3// Use, modification and distribution are subject to the Boost Software License,
4// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt).
6//
7// See http://www.boost.org/libs/type_traits for most recent version including documentation.
8
9#ifndef BOOST_TT_HAS_DEREFERENCE_HPP_INCLUDED
10#define BOOST_TT_HAS_DEREFERENCE_HPP_INCLUDED
11
12#define BOOST_TT_TRAIT_NAME has_dereference
13#define BOOST_TT_TRAIT_OP *
14#define BOOST_TT_FORBIDDEN_IF\
15 /* void* or fundamental */\
16 (\
17 (\
18 ::boost::is_pointer< Rhs_noref >::value && \
19 ::boost::is_void< Rhs_noptr >::value\
20 ) || \
21 ::boost::is_fundamental< Rhs_nocv >::value\
22 )
23
24
25#include <boost/type_traits/detail/has_prefix_operator.hpp>
26
27#undef BOOST_TT_TRAIT_NAME
28#undef BOOST_TT_TRAIT_OP
29#undef BOOST_TT_FORBIDDEN_IF
30#if defined(BOOST_TT_HAS_ACCURATE_BINARY_OPERATOR_DETECTION)
31
32namespace boost {
33
34 template <class R>
35 struct has_dereference<void*, R> : public false_type {};
36 template <>
37 struct has_dereference<void*, boost::binary_op_detail::dont_care> : public false_type {};
38 template <>
39 struct has_dereference<void*, void> : public false_type {};
40
41 template <class R>
42 struct has_dereference<const void*, R> : public false_type {};
43 template <>
44 struct has_dereference<const void*, boost::binary_op_detail::dont_care> : public false_type {};
45 template <>
46 struct has_dereference<const void*, void> : public false_type {};
47
48 template <class R>
49 struct has_dereference<volatile void*, R> : public false_type {};
50 template <>
51 struct has_dereference<volatile void*, boost::binary_op_detail::dont_care> : public false_type {};
52 template <>
53 struct has_dereference<volatile void*, void> : public false_type {};
54
55 template <class R>
56 struct has_dereference<const volatile void*, R> : public false_type {};
57 template <>
58 struct has_dereference<const volatile void*, boost::binary_op_detail::dont_care> : public false_type {};
59 template <>
60 struct has_dereference<const volatile void*, void> : public false_type {};
61
62 template <class R>
63 struct has_dereference<void*const, R> : public false_type {};
64 template <>
65 struct has_dereference<void*const, boost::binary_op_detail::dont_care> : public false_type {};
66 template <>
67 struct has_dereference<void*const, void> : public false_type {};
68
69 template <class R>
70 struct has_dereference<const void*const, R> : public false_type {};
71 template <>
72 struct has_dereference<const void*const, boost::binary_op_detail::dont_care> : public false_type {};
73 template <>
74 struct has_dereference<const void*const, void> : public false_type {};
75
76 template <class R>
77 struct has_dereference<volatile void*const, R> : public false_type {};
78 template <>
79 struct has_dereference<volatile void*const, boost::binary_op_detail::dont_care> : public false_type {};
80 template <>
81 struct has_dereference<volatile void*const, void> : public false_type {};
82
83 template <class R>
84 struct has_dereference<const volatile void*const, R> : public false_type {};
85 template <>
86 struct has_dereference<const volatile void*const, boost::binary_op_detail::dont_care> : public false_type {};
87 template <>
88 struct has_dereference<const volatile void*const, void> : public false_type {};
89
90 template <class R>
91 struct has_dereference<void*volatile, R> : public false_type {};
92 template <>
93 struct has_dereference<void*volatile, boost::binary_op_detail::dont_care> : public false_type {};
94 template <>
95 struct has_dereference<void*volatile, void> : public false_type {};
96
97 template <class R>
98 struct has_dereference<const void*volatile, R> : public false_type {};
99 template <>
100 struct has_dereference<const void*volatile, boost::binary_op_detail::dont_care> : public false_type {};
101 template <>
102 struct has_dereference<const void*volatile, void> : public false_type {};
103
104 template <class R>
105 struct has_dereference<volatile void*volatile, R> : public false_type {};
106 template <>
107 struct has_dereference<volatile void*volatile, boost::binary_op_detail::dont_care> : public false_type {};
108 template <>
109 struct has_dereference<volatile void*volatile, void> : public false_type {};
110
111 template <class R>
112 struct has_dereference<const volatile void*volatile, R> : public false_type {};
113 template <>
114 struct has_dereference<const volatile void*volatile, boost::binary_op_detail::dont_care> : public false_type {};
115 template <>
116 struct has_dereference<const volatile void*volatile, void> : public false_type {};
117
118 template <class R>
119 struct has_dereference<void*const volatile, R> : public false_type {};
120 template <>
121 struct has_dereference<void*const volatile, boost::binary_op_detail::dont_care> : public false_type {};
122 template <>
123 struct has_dereference<void*const volatile, void> : public false_type {};
124
125 template <class R>
126 struct has_dereference<const void*const volatile, R> : public false_type {};
127 template <>
128 struct has_dereference<const void*const volatile, boost::binary_op_detail::dont_care> : public false_type {};
129 template <>
130 struct has_dereference<const void*const volatile, void> : public false_type {};
131
132 template <class R>
133 struct has_dereference<volatile void*const volatile, R> : public false_type {};
134 template <>
135 struct has_dereference<volatile void*const volatile, boost::binary_op_detail::dont_care> : public false_type {};
136 template <>
137 struct has_dereference<volatile void*const volatile, void> : public false_type {};
138
139 template <class R>
140 struct has_dereference<const volatile void*const volatile, R> : public false_type {};
141 template <>
142 struct has_dereference<const volatile void*const volatile, boost::binary_op_detail::dont_care> : public false_type {};
143 template <>
144 struct has_dereference<const volatile void*const volatile, void> : public false_type {};
145
146 // references:
147 template <class R>
148 struct has_dereference<void*&, R> : public false_type {};
149 template <>
150 struct has_dereference<void*&, boost::binary_op_detail::dont_care> : public false_type {};
151 template <>
152 struct has_dereference<void*&, void> : public false_type {};
153
154 template <class R>
155 struct has_dereference<const void*&, R> : public false_type {};
156 template <>
157 struct has_dereference<const void*&, boost::binary_op_detail::dont_care> : public false_type {};
158 template <>
159 struct has_dereference<const void*&, void> : public false_type {};
160
161 template <class R>
162 struct has_dereference<volatile void*&, R> : public false_type {};
163 template <>
164 struct has_dereference<volatile void*&, boost::binary_op_detail::dont_care> : public false_type {};
165 template <>
166 struct has_dereference<volatile void*&, void> : public false_type {};
167
168 template <class R>
169 struct has_dereference<const volatile void*&, R> : public false_type {};
170 template <>
171 struct has_dereference<const volatile void*&, boost::binary_op_detail::dont_care> : public false_type {};
172 template <>
173 struct has_dereference<const volatile void*&, void> : public false_type {};
174
175 template <class R>
176 struct has_dereference<void*const&, R> : public false_type {};
177 template <>
178 struct has_dereference<void*const&, boost::binary_op_detail::dont_care> : public false_type {};
179 template <>
180 struct has_dereference<void*const&, void> : public false_type {};
181
182 template <class R>
183 struct has_dereference<const void*const&, R> : public false_type {};
184 template <>
185 struct has_dereference<const void*const&, boost::binary_op_detail::dont_care> : public false_type {};
186 template <>
187 struct has_dereference<const void*const&, void> : public false_type {};
188
189 template <class R>
190 struct has_dereference<volatile void*const&, R> : public false_type {};
191 template <>
192 struct has_dereference<volatile void*const&, boost::binary_op_detail::dont_care> : public false_type {};
193 template <>
194 struct has_dereference<volatile void*const&, void> : public false_type {};
195
196 template <class R>
197 struct has_dereference<const volatile void*const&, R> : public false_type {};
198 template <>
199 struct has_dereference<const volatile void*const&, boost::binary_op_detail::dont_care> : public false_type {};
200 template <>
201 struct has_dereference<const volatile void*const&, void> : public false_type {};
202
203 template <class R>
204 struct has_dereference<void*volatile&, R> : public false_type {};
205 template <>
206 struct has_dereference<void*volatile&, boost::binary_op_detail::dont_care> : public false_type {};
207 template <>
208 struct has_dereference<void*volatile&, void> : public false_type {};
209
210 template <class R>
211 struct has_dereference<const void*volatile&, R> : public false_type {};
212 template <>
213 struct has_dereference<const void*volatile&, boost::binary_op_detail::dont_care> : public false_type {};
214 template <>
215 struct has_dereference<const void*volatile&, void> : public false_type {};
216
217 template <class R>
218 struct has_dereference<volatile void*volatile&, R> : public false_type {};
219 template <>
220 struct has_dereference<volatile void*volatile&, boost::binary_op_detail::dont_care> : public false_type {};
221 template <>
222 struct has_dereference<volatile void*volatile&, void> : public false_type {};
223
224 template <class R>
225 struct has_dereference<const volatile void*volatile&, R> : public false_type {};
226 template <>
227 struct has_dereference<const volatile void*volatile&, boost::binary_op_detail::dont_care> : public false_type {};
228 template <>
229 struct has_dereference<const volatile void*volatile&, void> : public false_type {};
230
231 template <class R>
232 struct has_dereference<void*const volatile&, R> : public false_type {};
233 template <>
234 struct has_dereference<void*const volatile&, boost::binary_op_detail::dont_care> : public false_type {};
235 template <>
236 struct has_dereference<void*const volatile&, void> : public false_type {};
237
238 template <class R>
239 struct has_dereference<const void*const volatile&, R> : public false_type {};
240 template <>
241 struct has_dereference<const void*const volatile&, boost::binary_op_detail::dont_care> : public false_type {};
242 template <>
243 struct has_dereference<const void*const volatile&, void> : public false_type {};
244
245 template <class R>
246 struct has_dereference<volatile void*const volatile&, R> : public false_type {};
247 template <>
248 struct has_dereference<volatile void*const volatile&, boost::binary_op_detail::dont_care> : public false_type {};
249 template <>
250 struct has_dereference<volatile void*const volatile&, void> : public false_type {};
251
252 template <class R>
253 struct has_dereference<const volatile void*const volatile&, R> : public false_type {};
254 template <>
255 struct has_dereference<const volatile void*const volatile&, boost::binary_op_detail::dont_care> : public false_type {};
256 template <>
257 struct has_dereference<const volatile void*const volatile&, void> : public false_type {};
258
259 // rvalue refs:
260 template <class R>
261 struct has_dereference<void*&&, R> : public false_type {};
262 template <>
263 struct has_dereference<void*&&, boost::binary_op_detail::dont_care> : public false_type {};
264 template <>
265 struct has_dereference<void*&&, void> : public false_type {};
266
267 template <class R>
268 struct has_dereference<const void*&&, R> : public false_type {};
269 template <>
270 struct has_dereference<const void*&&, boost::binary_op_detail::dont_care> : public false_type {};
271 template <>
272 struct has_dereference<const void*&&, void> : public false_type {};
273
274 template <class R>
275 struct has_dereference<volatile void*&&, R> : public false_type {};
276 template <>
277 struct has_dereference<volatile void*&&, boost::binary_op_detail::dont_care> : public false_type {};
278 template <>
279 struct has_dereference<volatile void*&&, void> : public false_type {};
280
281 template <class R>
282 struct has_dereference<const volatile void*&&, R> : public false_type {};
283 template <>
284 struct has_dereference<const volatile void*&&, boost::binary_op_detail::dont_care> : public false_type {};
285 template <>
286 struct has_dereference<const volatile void*&&, void> : public false_type {};
287
288 template <class R>
289 struct has_dereference<void*const&&, R> : public false_type {};
290 template <>
291 struct has_dereference<void*const&&, boost::binary_op_detail::dont_care> : public false_type {};
292 template <>
293 struct has_dereference<void*const&&, void> : public false_type {};
294
295 template <class R>
296 struct has_dereference<const void*const&&, R> : public false_type {};
297 template <>
298 struct has_dereference<const void*const&&, boost::binary_op_detail::dont_care> : public false_type {};
299 template <>
300 struct has_dereference<const void*const&&, void> : public false_type {};
301
302 template <class R>
303 struct has_dereference<volatile void*const&&, R> : public false_type {};
304 template <>
305 struct has_dereference<volatile void*const&&, boost::binary_op_detail::dont_care> : public false_type {};
306 template <>
307 struct has_dereference<volatile void*const&&, void> : public false_type {};
308
309 template <class R>
310 struct has_dereference<const volatile void*const&&, R> : public false_type {};
311 template <>
312 struct has_dereference<const volatile void*const&&, boost::binary_op_detail::dont_care> : public false_type {};
313 template <>
314 struct has_dereference<const volatile void*const&&, void> : public false_type {};
315
316 template <class R>
317 struct has_dereference<void*volatile&&, R> : public false_type {};
318 template <>
319 struct has_dereference<void*volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
320 template <>
321 struct has_dereference<void*volatile&&, void> : public false_type {};
322
323 template <class R>
324 struct has_dereference<const void*volatile&&, R> : public false_type {};
325 template <>
326 struct has_dereference<const void*volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
327 template <>
328 struct has_dereference<const void*volatile&&, void> : public false_type {};
329
330 template <class R>
331 struct has_dereference<volatile void*volatile&&, R> : public false_type {};
332 template <>
333 struct has_dereference<volatile void*volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
334 template <>
335 struct has_dereference<volatile void*volatile&&, void> : public false_type {};
336
337 template <class R>
338 struct has_dereference<const volatile void*volatile&&, R> : public false_type {};
339 template <>
340 struct has_dereference<const volatile void*volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
341 template <>
342 struct has_dereference<const volatile void*volatile&&, void> : public false_type {};
343
344 template <class R>
345 struct has_dereference<void*const volatile&&, R> : public false_type {};
346 template <>
347 struct has_dereference<void*const volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
348 template <>
349 struct has_dereference<void*const volatile&&, void> : public false_type {};
350
351 template <class R>
352 struct has_dereference<const void*const volatile&&, R> : public false_type {};
353 template <>
354 struct has_dereference<const void*const volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
355 template <>
356 struct has_dereference<const void*const volatile&&, void> : public false_type {};
357
358 template <class R>
359 struct has_dereference<volatile void*const volatile&&, R> : public false_type {};
360 template <>
361 struct has_dereference<volatile void*const volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
362 template <>
363 struct has_dereference<volatile void*const volatile&&, void> : public false_type {};
364
365 template <class R>
366 struct has_dereference<const volatile void*const volatile&&, R> : public false_type {};
367 template <>
368 struct has_dereference<const volatile void*const volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
369 template <>
370 struct has_dereference<const volatile void*const volatile&&, void> : public false_type {};
371
372
373}
374#endif
375#endif
376

source code of include/boost/type_traits/has_dereference.hpp