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