1 | // Copyright (C) 2004 Arkadiy Vertleyb |
2 | // Distributed under the Boost Software License, Version 1.0. (See accompanying |
3 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
4 | |
5 | #ifndef BOOST_TYPEOF_TYPEOF_HPP_INCLUDED |
6 | #define BOOST_TYPEOF_TYPEOF_HPP_INCLUDED |
7 | |
8 | #if defined(BOOST_TYPEOF_COMPLIANT) |
9 | # define BOOST_TYPEOF_EMULATION |
10 | #endif |
11 | |
12 | #if defined(BOOST_TYPEOF_EMULATION) && defined(BOOST_TYPEOF_NATIVE) |
13 | # error both typeof emulation and native mode requested |
14 | #endif |
15 | |
16 | #include <boost/config.hpp> |
17 | #include <boost/config/workaround.hpp> |
18 | |
19 | #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1900) && !defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) && !defined(BOOST_TYPEOF_EMULATION) |
20 | # define BOOST_TYPEOF_DECLTYPE |
21 | # ifndef BOOST_TYPEOF_NATIVE |
22 | # define BOOST_TYPEOF_NATIVE |
23 | # endif |
24 | |
25 | #elif defined(__COMO__) |
26 | # ifdef __GNUG__ |
27 | # ifndef BOOST_TYPEOF_EMULATION |
28 | # ifndef BOOST_TYPEOF_NATIVE |
29 | # define BOOST_TYPEOF_NATIVE |
30 | # endif |
31 | # define BOOST_TYPEOF_KEYWORD typeof |
32 | # endif |
33 | # else |
34 | # ifndef BOOST_TYPEOF_NATIVE |
35 | # ifndef BOOST_TYPEOF_EMULATION |
36 | # define BOOST_TYPEOF_EMULATION |
37 | # endif |
38 | # else |
39 | # error native typeof is not supported |
40 | # endif |
41 | # endif |
42 | |
43 | #elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC) |
44 | # ifdef __GNUC__ |
45 | # ifndef BOOST_TYPEOF_EMULATION |
46 | # ifndef BOOST_TYPEOF_NATIVE |
47 | # define BOOST_TYPEOF_NATIVE |
48 | # endif |
49 | # define BOOST_TYPEOF_KEYWORD __typeof__ |
50 | # endif |
51 | # else |
52 | # ifndef BOOST_TYPEOF_NATIVE |
53 | # ifndef BOOST_TYPEOF_EMULATION |
54 | # define BOOST_TYPEOF_EMULATION |
55 | # endif |
56 | # else |
57 | # error native typeof is not supported |
58 | # endif |
59 | # endif |
60 | |
61 | #elif defined(__GNUC__) || defined(__clang__) |
62 | # ifndef BOOST_TYPEOF_EMULATION |
63 | # ifndef BOOST_TYPEOF_NATIVE |
64 | # define BOOST_TYPEOF_NATIVE |
65 | # endif |
66 | # define BOOST_TYPEOF_KEYWORD __typeof__ |
67 | # endif |
68 | |
69 | #elif defined(__MWERKS__) |
70 | # if(__MWERKS__ <= 0x3003) // 8.x |
71 | # ifndef BOOST_TYPEOF_EMULATION |
72 | # ifndef BOOST_TYPEOF_NATIVE |
73 | # define BOOST_TYPEOF_NATIVE |
74 | # endif |
75 | # define BOOST_TYPEOF_KEYWORD __typeof__ |
76 | # else |
77 | # define BOOST_TYPEOF_EMULATION_UNSUPPORTED |
78 | # endif |
79 | # else // 9.x |
80 | # ifndef BOOST_TYPEOF_EMULATION |
81 | # ifndef BOOST_TYPEOF_NATIVE |
82 | # define BOOST_TYPEOF_NATIVE |
83 | # endif |
84 | # define BOOST_TYPEOF_KEYWORD __typeof__ |
85 | # endif |
86 | # endif |
87 | #elif defined __CODEGEARC__ |
88 | # ifndef BOOST_TYPEOF_EMULATION |
89 | # ifndef BOOST_TYPEOF_NATIVE |
90 | # define BOOST_TYPEOF_EMULATION_UNSUPPORTED |
91 | # endif |
92 | # else |
93 | # define BOOST_TYPEOF_EMULATION_UNSUPPORTED |
94 | # endif |
95 | #elif defined __BORLANDC__ |
96 | # ifndef BOOST_TYPEOF_EMULATION |
97 | # ifndef BOOST_TYPEOF_NATIVE |
98 | # define BOOST_TYPEOF_EMULATION_UNSUPPORTED |
99 | # endif |
100 | # else |
101 | # define BOOST_TYPEOF_EMULATION_UNSUPPORTED |
102 | # endif |
103 | #elif defined __DMC__ |
104 | # ifndef BOOST_TYPEOF_EMULATION |
105 | # ifndef BOOST_TYPEOF_NATIVE |
106 | # define BOOST_TYPEOF_NATIVE |
107 | # endif |
108 | # include <boost/typeof/dmc/typeof_impl.hpp> |
109 | # define MSVC_TYPEOF_HACK |
110 | # endif |
111 | #elif defined(_MSC_VER) |
112 | # if (_MSC_VER >= 1310) // 7.1 -> |
113 | # ifndef BOOST_TYPEOF_EMULATION |
114 | # ifndef BOOST_TYPEOF_NATIVE |
115 | # ifndef _MSC_EXTENSIONS |
116 | # define BOOST_TYPEOF_EMULATION |
117 | # else |
118 | # define BOOST_TYPEOF_NATIVE |
119 | # endif |
120 | # endif |
121 | # endif |
122 | # ifdef BOOST_TYPEOF_NATIVE |
123 | # include <boost/typeof/msvc/typeof_impl.hpp> |
124 | # define MSVC_TYPEOF_HACK |
125 | # endif |
126 | # endif |
127 | #elif defined(__HP_aCC) |
128 | # ifndef BOOST_TYPEOF_NATIVE |
129 | # ifndef BOOST_TYPEOF_EMULATION |
130 | # define BOOST_TYPEOF_EMULATION |
131 | # endif |
132 | # else |
133 | # error native typeof is not supported |
134 | # endif |
135 | |
136 | #elif defined(__DECCXX) |
137 | # ifndef BOOST_TYPEOF_NATIVE |
138 | # ifndef BOOST_TYPEOF_EMULATION |
139 | # define BOOST_TYPEOF_EMULATION |
140 | # endif |
141 | # else |
142 | # error native typeof is not supported |
143 | # endif |
144 | |
145 | #elif defined(__BORLANDC__) |
146 | # if (__BORLANDC__ < 0x590) |
147 | # define BOOST_TYPEOF_NO_FUNCTION_TYPES |
148 | # define BOOST_TYPEOF_NO_MEMBER_FUNCTION_TYPES |
149 | # endif |
150 | # ifndef BOOST_TYPEOF_NATIVE |
151 | # ifndef BOOST_TYPEOF_EMULATION |
152 | # define BOOST_TYPEOF_EMULATION |
153 | # endif |
154 | # else |
155 | # error native typeof is not supported |
156 | # endif |
157 | #elif defined(__SUNPRO_CC) |
158 | # if (__SUNPRO_CC < 0x590 ) |
159 | # ifdef BOOST_TYPEOF_NATIVE |
160 | # error native typeof is not supported |
161 | # endif |
162 | # ifndef BOOST_TYPEOF_EMULATION |
163 | # define BOOST_TYPEOF_EMULATION |
164 | # endif |
165 | # else |
166 | # ifndef BOOST_TYPEOF_EMULATION |
167 | # ifndef BOOST_TYPEOF_NATIVE |
168 | # define BOOST_TYPEOF_NATIVE |
169 | # endif |
170 | # define BOOST_TYPEOF_KEYWORD __typeof__ |
171 | # endif |
172 | # endif |
173 | #elif defined(__IBM__TYPEOF__) |
174 | # ifndef BOOST_TYPEOF_EMULATION |
175 | # ifndef BOOST_TYPEOF_NATIVE |
176 | # define BOOST_TYPEOF_NATIVE |
177 | # endif |
178 | # define BOOST_TYPEOF_KEYWORD __typeof__ |
179 | # endif |
180 | #else //unknown compiler |
181 | # ifndef BOOST_TYPEOF_NATIVE |
182 | # ifndef BOOST_TYPEOF_EMULATION |
183 | # define BOOST_TYPEOF_EMULATION |
184 | # endif |
185 | # else |
186 | # ifndef BOOST_TYPEOF_KEYWORD |
187 | # define BOOST_TYPEOF_KEYWORD typeof |
188 | # endif |
189 | # endif |
190 | |
191 | #endif |
192 | |
193 | #define BOOST_TYPEOF_UNIQUE_ID()\ |
194 | BOOST_TYPEOF_REGISTRATION_GROUP * 0x10000 + __LINE__ |
195 | |
196 | #define BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()\ |
197 | <boost/typeof/incr_registration_group.hpp> |
198 | |
199 | #ifdef BOOST_TYPEOF_EMULATION_UNSUPPORTED |
200 | # include <boost/typeof/unsupported.hpp> |
201 | #elif defined BOOST_TYPEOF_EMULATION |
202 | # define BOOST_TYPEOF_TEXT "using typeof emulation" |
203 | # include <boost/typeof/message.hpp> |
204 | # include <boost/typeof/typeof_impl.hpp> |
205 | # include <boost/typeof/type_encoding.hpp> |
206 | # include <boost/typeof/template_encoding.hpp> |
207 | # include <boost/typeof/modifiers.hpp> |
208 | # include <boost/typeof/pointers_data_members.hpp> |
209 | # include <boost/typeof/register_functions.hpp> |
210 | # include <boost/typeof/register_fundamental.hpp> |
211 | |
212 | #elif defined(BOOST_TYPEOF_NATIVE) |
213 | # define BOOST_TYPEOF_TEXT "using native typeof" |
214 | # include <boost/typeof/message.hpp> |
215 | # ifdef BOOST_TYPEOF_DECLTYPE |
216 | # include <boost/typeof/decltype.hpp> |
217 | # else |
218 | # include <boost/typeof/native.hpp> |
219 | # endif |
220 | #else |
221 | # error typeof configuration error |
222 | #endif |
223 | |
224 | // auto |
225 | #define BOOST_AUTO(Var, Expr) BOOST_TYPEOF(Expr) Var = Expr |
226 | #define BOOST_AUTO_TPL(Var, Expr) BOOST_TYPEOF_TPL(Expr) Var = Expr |
227 | |
228 | #endif//BOOST_TYPEOF_TYPEOF_HPP_INCLUDED |
229 | |