1 // (C) Copyright 2009-2011 Frederic Bron.
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).
7 // See http://www.boost.org/libs/type_traits for most recent version including documentation.
9 #ifndef BOOST_TT_HAS_DEREFERENCE_HPP_INCLUDED
10 #define BOOST_TT_HAS_DEREFERENCE_HPP_INCLUDED
12 #define BOOST_TT_TRAIT_NAME has_dereference
13 #define BOOST_TT_TRAIT_OP *
14 #define BOOST_TT_FORBIDDEN_IF\
15 /* void* or fundamental */\
18 ::boost::is_pointer< Rhs_noref >::value && \
19 ::boost::is_void< Rhs_noptr >::value\
21 ::boost::is_fundamental< Rhs_nocv >::value\
25 #include <boost/type_traits/detail/has_prefix_operator.hpp>
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)
35 struct has_dereference<void*, R> : public false_type {};
37 struct has_dereference<void*, boost::binary_op_detail::dont_care> : public false_type {};
39 struct has_dereference<void*, void> : public false_type {};
42 struct has_dereference<const void*, R> : public false_type {};
44 struct has_dereference<const void*, boost::binary_op_detail::dont_care> : public false_type {};
46 struct has_dereference<const void*, void> : public false_type {};
49 struct has_dereference<volatile void*, R> : public false_type {};
51 struct has_dereference<volatile void*, boost::binary_op_detail::dont_care> : public false_type {};
53 struct has_dereference<volatile void*, void> : public false_type {};
56 struct has_dereference<const volatile void*, R> : public false_type {};
58 struct has_dereference<const volatile void*, boost::binary_op_detail::dont_care> : public false_type {};
60 struct has_dereference<const volatile void*, void> : public false_type {};
63 struct has_dereference<void*const, R> : public false_type {};
65 struct has_dereference<void*const, boost::binary_op_detail::dont_care> : public false_type {};
67 struct has_dereference<void*const, void> : public false_type {};
70 struct has_dereference<const void*const, R> : public false_type {};
72 struct has_dereference<const void*const, boost::binary_op_detail::dont_care> : public false_type {};
74 struct has_dereference<const void*const, void> : public false_type {};
77 struct has_dereference<volatile void*const, R> : public false_type {};
79 struct has_dereference<volatile void*const, boost::binary_op_detail::dont_care> : public false_type {};
81 struct has_dereference<volatile void*const, void> : public false_type {};
84 struct has_dereference<const volatile void*const, R> : public false_type {};
86 struct has_dereference<const volatile void*const, boost::binary_op_detail::dont_care> : public false_type {};
88 struct has_dereference<const volatile void*const, void> : public false_type {};
91 struct has_dereference<void*volatile, R> : public false_type {};
93 struct has_dereference<void*volatile, boost::binary_op_detail::dont_care> : public false_type {};
95 struct has_dereference<void*volatile, void> : public false_type {};
98 struct has_dereference<const void*volatile, R> : public false_type {};
100 struct has_dereference<const void*volatile, boost::binary_op_detail::dont_care> : public false_type {};
102 struct has_dereference<const void*volatile, void> : public false_type {};
105 struct has_dereference<volatile void*volatile, R> : public false_type {};
107 struct has_dereference<volatile void*volatile, boost::binary_op_detail::dont_care> : public false_type {};
109 struct has_dereference<volatile void*volatile, void> : public false_type {};
112 struct has_dereference<const volatile void*volatile, R> : public false_type {};
114 struct has_dereference<const volatile void*volatile, boost::binary_op_detail::dont_care> : public false_type {};
116 struct has_dereference<const volatile void*volatile, void> : public false_type {};
119 struct has_dereference<void*const volatile, R> : public false_type {};
121 struct has_dereference<void*const volatile, boost::binary_op_detail::dont_care> : public false_type {};
123 struct has_dereference<void*const volatile, void> : public false_type {};
126 struct has_dereference<const void*const volatile, R> : public false_type {};
128 struct has_dereference<const void*const volatile, boost::binary_op_detail::dont_care> : public false_type {};
130 struct has_dereference<const void*const volatile, void> : public false_type {};
133 struct has_dereference<volatile void*const volatile, R> : public false_type {};
135 struct has_dereference<volatile void*const volatile, boost::binary_op_detail::dont_care> : public false_type {};
137 struct has_dereference<volatile void*const volatile, void> : public false_type {};
140 struct has_dereference<const volatile void*const volatile, R> : public false_type {};
142 struct has_dereference<const volatile void*const volatile, boost::binary_op_detail::dont_care> : public false_type {};
144 struct has_dereference<const volatile void*const volatile, void> : public false_type {};
148 struct has_dereference<void*&, R> : public false_type {};
150 struct has_dereference<void*&, boost::binary_op_detail::dont_care> : public false_type {};
152 struct has_dereference<void*&, void> : public false_type {};
155 struct has_dereference<const void*&, R> : public false_type {};
157 struct has_dereference<const void*&, boost::binary_op_detail::dont_care> : public false_type {};
159 struct has_dereference<const void*&, void> : public false_type {};
162 struct has_dereference<volatile void*&, R> : public false_type {};
164 struct has_dereference<volatile void*&, boost::binary_op_detail::dont_care> : public false_type {};
166 struct has_dereference<volatile void*&, void> : public false_type {};
169 struct has_dereference<const volatile void*&, R> : public false_type {};
171 struct has_dereference<const volatile void*&, boost::binary_op_detail::dont_care> : public false_type {};
173 struct has_dereference<const volatile void*&, void> : public false_type {};
176 struct has_dereference<void*const&, R> : public false_type {};
178 struct has_dereference<void*const&, boost::binary_op_detail::dont_care> : public false_type {};
180 struct has_dereference<void*const&, void> : public false_type {};
183 struct has_dereference<const void*const&, R> : public false_type {};
185 struct has_dereference<const void*const&, boost::binary_op_detail::dont_care> : public false_type {};
187 struct has_dereference<const void*const&, void> : public false_type {};
190 struct has_dereference<volatile void*const&, R> : public false_type {};
192 struct has_dereference<volatile void*const&, boost::binary_op_detail::dont_care> : public false_type {};
194 struct has_dereference<volatile void*const&, void> : public false_type {};
197 struct has_dereference<const volatile void*const&, R> : public false_type {};
199 struct has_dereference<const volatile void*const&, boost::binary_op_detail::dont_care> : public false_type {};
201 struct has_dereference<const volatile void*const&, void> : public false_type {};
204 struct has_dereference<void*volatile&, R> : public false_type {};
206 struct has_dereference<void*volatile&, boost::binary_op_detail::dont_care> : public false_type {};
208 struct has_dereference<void*volatile&, void> : public false_type {};
211 struct has_dereference<const void*volatile&, R> : public false_type {};
213 struct has_dereference<const void*volatile&, boost::binary_op_detail::dont_care> : public false_type {};
215 struct has_dereference<const void*volatile&, void> : public false_type {};
218 struct has_dereference<volatile void*volatile&, R> : public false_type {};
220 struct has_dereference<volatile void*volatile&, boost::binary_op_detail::dont_care> : public false_type {};
222 struct has_dereference<volatile void*volatile&, void> : public false_type {};
225 struct has_dereference<const volatile void*volatile&, R> : public false_type {};
227 struct has_dereference<const volatile void*volatile&, boost::binary_op_detail::dont_care> : public false_type {};
229 struct has_dereference<const volatile void*volatile&, void> : public false_type {};
232 struct has_dereference<void*const volatile&, R> : public false_type {};
234 struct has_dereference<void*const volatile&, boost::binary_op_detail::dont_care> : public false_type {};
236 struct has_dereference<void*const volatile&, void> : public false_type {};
239 struct has_dereference<const void*const volatile&, R> : public false_type {};
241 struct has_dereference<const void*const volatile&, boost::binary_op_detail::dont_care> : public false_type {};
243 struct has_dereference<const void*const volatile&, void> : public false_type {};
246 struct has_dereference<volatile void*const volatile&, R> : public false_type {};
248 struct has_dereference<volatile void*const volatile&, boost::binary_op_detail::dont_care> : public false_type {};
250 struct has_dereference<volatile void*const volatile&, void> : public false_type {};
253 struct has_dereference<const volatile void*const volatile&, R> : public false_type {};
255 struct has_dereference<const volatile void*const volatile&, boost::binary_op_detail::dont_care> : public false_type {};
257 struct has_dereference<const volatile void*const volatile&, void> : public false_type {};
261 struct has_dereference<void*&&, R> : public false_type {};
263 struct has_dereference<void*&&, boost::binary_op_detail::dont_care> : public false_type {};
265 struct has_dereference<void*&&, void> : public false_type {};
268 struct has_dereference<const void*&&, R> : public false_type {};
270 struct has_dereference<const void*&&, boost::binary_op_detail::dont_care> : public false_type {};
272 struct has_dereference<const void*&&, void> : public false_type {};
275 struct has_dereference<volatile void*&&, R> : public false_type {};
277 struct has_dereference<volatile void*&&, boost::binary_op_detail::dont_care> : public false_type {};
279 struct has_dereference<volatile void*&&, void> : public false_type {};
282 struct has_dereference<const volatile void*&&, R> : public false_type {};
284 struct has_dereference<const volatile void*&&, boost::binary_op_detail::dont_care> : public false_type {};
286 struct has_dereference<const volatile void*&&, void> : public false_type {};
289 struct has_dereference<void*const&&, R> : public false_type {};
291 struct has_dereference<void*const&&, boost::binary_op_detail::dont_care> : public false_type {};
293 struct has_dereference<void*const&&, void> : public false_type {};
296 struct has_dereference<const void*const&&, R> : public false_type {};
298 struct has_dereference<const void*const&&, boost::binary_op_detail::dont_care> : public false_type {};
300 struct has_dereference<const void*const&&, void> : public false_type {};
303 struct has_dereference<volatile void*const&&, R> : public false_type {};
305 struct has_dereference<volatile void*const&&, boost::binary_op_detail::dont_care> : public false_type {};
307 struct has_dereference<volatile void*const&&, void> : public false_type {};
310 struct has_dereference<const volatile void*const&&, R> : public false_type {};
312 struct has_dereference<const volatile void*const&&, boost::binary_op_detail::dont_care> : public false_type {};
314 struct has_dereference<const volatile void*const&&, void> : public false_type {};
317 struct has_dereference<void*volatile&&, R> : public false_type {};
319 struct has_dereference<void*volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
321 struct has_dereference<void*volatile&&, void> : public false_type {};
324 struct has_dereference<const void*volatile&&, R> : public false_type {};
326 struct has_dereference<const void*volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
328 struct has_dereference<const void*volatile&&, void> : public false_type {};
331 struct has_dereference<volatile void*volatile&&, R> : public false_type {};
333 struct has_dereference<volatile void*volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
335 struct has_dereference<volatile void*volatile&&, void> : public false_type {};
338 struct has_dereference<const volatile void*volatile&&, R> : public false_type {};
340 struct has_dereference<const volatile void*volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
342 struct has_dereference<const volatile void*volatile&&, void> : public false_type {};
345 struct has_dereference<void*const volatile&&, R> : public false_type {};
347 struct has_dereference<void*const volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
349 struct has_dereference<void*const volatile&&, void> : public false_type {};
352 struct has_dereference<const void*const volatile&&, R> : public false_type {};
354 struct has_dereference<const void*const volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
356 struct has_dereference<const void*const volatile&&, void> : public false_type {};
359 struct has_dereference<volatile void*const volatile&&, R> : public false_type {};
361 struct has_dereference<volatile void*const volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
363 struct has_dereference<volatile void*const volatile&&, void> : public false_type {};
366 struct has_dereference<const volatile void*const volatile&&, R> : public false_type {};
368 struct has_dereference<const volatile void*const volatile&&, boost::binary_op_detail::dont_care> : public false_type {};
370 struct has_dereference<const volatile void*const volatile&&, void> : public false_type {};