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

source code of include/boost/typeof/typeof.hpp