1 // Boost config.hpp configuration header file ------------------------------// 2 3 // Copyright (c) 2001-2003 John Maddock 4 // Copyright (c) 2001 Darin Adler 5 // Copyright (c) 2001 Peter Dimov 6 // Copyright (c) 2002 Bill Kempf 7 // Copyright (c) 2002 Jens Maurer 8 // Copyright (c) 2002-2003 David Abrahams 9 // Copyright (c) 2003 Gennaro Prota 10 // Copyright (c) 2003 Eric Friedman 11 // Copyright (c) 2010 Eric Jourdanneau, Joel Falcou 12 // Distributed under the Boost Software License, Version 1.0. (See 13 // accompanying file LICENSE_1_0.txt or copy at 14 // http://www.boost.org/LICENSE_1_0.txt) 15 16 // See http://www.boost.org/ for most recent version. 17 18 // Boost config.hpp policy and rationale documentation has been moved to 19 // http://www.boost.org/libs/config/ 20 // 21 // This file is intended to be stable, and relatively unchanging. 22 // It should contain boilerplate code only - no compiler specific 23 // code unless it is unavoidable - no changes unless unavoidable. 24 25 #ifndef BOOST_CONFIG_SUFFIX_HPP 26 #define BOOST_CONFIG_SUFFIX_HPP 27 28 #if defined(__GNUC__) && (__GNUC__ >= 4) 29 // 30 // Some GCC-4.x versions issue warnings even when __extension__ is used, 31 // so use this as a workaround: 32 // 33 #pragma GCC system_header 34 #endif 35 36 // 37 // ensure that visibility macros are always defined, thus symplifying use 38 // 39 #ifndef BOOST_SYMBOL_EXPORT 40 # define BOOST_SYMBOL_EXPORT 41 #endif 42 #ifndef BOOST_SYMBOL_IMPORT 43 # define BOOST_SYMBOL_IMPORT 44 #endif 45 #ifndef BOOST_SYMBOL_VISIBLE 46 # define BOOST_SYMBOL_VISIBLE 47 #endif 48 49 // 50 // look for long long by looking for the appropriate macros in <limits.h>. 51 // Note that we use limits.h rather than climits for maximal portability, 52 // remember that since these just declare a bunch of macros, there should be 53 // no namespace issues from this. 54 // 55 #if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG) \ 56 && !defined(BOOST_MSVC) && !defined(__BORLANDC__) 57 # include <limits.h> 58 # if (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX)) 59 # define BOOST_HAS_LONG_LONG 60 # else 61 # define BOOST_NO_LONG_LONG 62 # endif 63 #endif 64 65 // GCC 3.x will clean up all of those nasty macro definitions that 66 // BOOST_NO_CTYPE_FUNCTIONS is intended to help work around, so undefine 67 // it under GCC 3.x. 68 #if defined(__GNUC__) && (__GNUC__ >= 3) && defined(BOOST_NO_CTYPE_FUNCTIONS) 69 # undef BOOST_NO_CTYPE_FUNCTIONS 70 #endif 71 72 // 73 // Assume any extensions are in namespace std:: unless stated otherwise: 74 // 75 # ifndef BOOST_STD_EXTENSION_NAMESPACE 76 # define BOOST_STD_EXTENSION_NAMESPACE std 77 # endif 78 79 // 80 // If cv-qualified specializations are not allowed, then neither are cv-void ones: 81 // 82 # if defined(BOOST_NO_CV_SPECIALIZATIONS) \ 83 && !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS) 84 # define BOOST_NO_CV_VOID_SPECIALIZATIONS 85 # endif 86 87 // 88 // If there is no numeric_limits template, then it can't have any compile time 89 // constants either! 90 // 91 # if defined(BOOST_NO_LIMITS) \ 92 && !defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) 93 # define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS 94 # define BOOST_NO_MS_INT64_NUMERIC_LIMITS 95 # define BOOST_NO_LONG_LONG_NUMERIC_LIMITS 96 # endif 97 98 // 99 // if there is no long long then there is no specialisation 100 // for numeric_limits<long long> either: 101 // 102 #if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG_NUMERIC_LIMITS) 103 # define BOOST_NO_LONG_LONG_NUMERIC_LIMITS 104 #endif 105 106 // 107 // if there is no __int64 then there is no specialisation 108 // for numeric_limits<__int64> either: 109 // 110 #if !defined(BOOST_HAS_MS_INT64) && !defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS) 111 # define BOOST_NO_MS_INT64_NUMERIC_LIMITS 112 #endif 113 114 // 115 // if member templates are supported then so is the 116 // VC6 subset of member templates: 117 // 118 # if !defined(BOOST_NO_MEMBER_TEMPLATES) \ 119 && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) 120 # define BOOST_MSVC6_MEMBER_TEMPLATES 121 # endif 122 123 // 124 // Without partial specialization, can't test for partial specialisation bugs: 125 // 126 # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ 127 && !defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG) 128 # define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG 129 # endif 130 131 // 132 // Without partial specialization, we can't have array-type partial specialisations: 133 // 134 # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ 135 && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) 136 # define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS 137 # endif 138 139 // 140 // Without partial specialization, std::iterator_traits can't work: 141 // 142 # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ 143 && !defined(BOOST_NO_STD_ITERATOR_TRAITS) 144 # define BOOST_NO_STD_ITERATOR_TRAITS 145 # endif 146 147 // 148 // Without partial specialization, partial 149 // specialization with default args won't work either: 150 // 151 # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ 152 && !defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS) 153 # define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS 154 # endif 155 156 // 157 // Without member template support, we can't have template constructors 158 // in the standard library either: 159 // 160 # if defined(BOOST_NO_MEMBER_TEMPLATES) \ 161 && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \ 162 && !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS) 163 # define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS 164 # endif 165 166 // 167 // Without member template support, we can't have a conforming 168 // std::allocator template either: 169 // 170 # if defined(BOOST_NO_MEMBER_TEMPLATES) \ 171 && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \ 172 && !defined(BOOST_NO_STD_ALLOCATOR) 173 # define BOOST_NO_STD_ALLOCATOR 174 # endif 175 176 // 177 // without ADL support then using declarations will break ADL as well: 178 // 179 #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) 180 # define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL 181 #endif 182 183 // 184 // Without typeid support we have no dynamic RTTI either: 185 // 186 #if defined(BOOST_NO_TYPEID) && !defined(BOOST_NO_RTTI) 187 # define BOOST_NO_RTTI 188 #endif 189 190 // 191 // If we have a standard allocator, then we have a partial one as well: 192 // 193 #if !defined(BOOST_NO_STD_ALLOCATOR) 194 # define BOOST_HAS_PARTIAL_STD_ALLOCATOR 195 #endif 196 197 // 198 // We can't have a working std::use_facet if there is no std::locale: 199 // 200 # if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_USE_FACET) 201 # define BOOST_NO_STD_USE_FACET 202 # endif 203 204 // 205 // We can't have a std::messages facet if there is no std::locale: 206 // 207 # if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_MESSAGES) 208 # define BOOST_NO_STD_MESSAGES 209 # endif 210 211 // 212 // We can't have a working std::wstreambuf if there is no std::locale: 213 // 214 # if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_WSTREAMBUF) 215 # define BOOST_NO_STD_WSTREAMBUF 216 # endif 217 218 // 219 // We can't have a <cwctype> if there is no <cwchar>: 220 // 221 # if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_CWCTYPE) 222 # define BOOST_NO_CWCTYPE 223 # endif 224 225 // 226 // We can't have a swprintf if there is no <cwchar>: 227 // 228 # if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_SWPRINTF) 229 # define BOOST_NO_SWPRINTF 230 # endif 231 232 // 233 // If Win32 support is turned off, then we must turn off 234 // threading support also, unless there is some other 235 // thread API enabled: 236 // 237 #if defined(BOOST_DISABLE_WIN32) && defined(_WIN32) \ 238 && !defined(BOOST_DISABLE_THREADS) && !defined(BOOST_HAS_PTHREADS) 239 # define BOOST_DISABLE_THREADS 240 #endif 241 242 // 243 // Turn on threading support if the compiler thinks that it's in 244 // multithreaded mode. We put this here because there are only a 245 // limited number of macros that identify this (if there's any missing 246 // from here then add to the appropriate compiler section): 247 // 248 #if (defined(__MT__) || defined(_MT) || defined(_REENTRANT) \ 249 || defined(_PTHREADS) || defined(__APPLE__) || defined(__DragonFly__)) \ 250 && !defined(BOOST_HAS_THREADS) 251 # define BOOST_HAS_THREADS 252 #endif 253 254 // 255 // Turn threading support off if BOOST_DISABLE_THREADS is defined: 256 // 257 #if defined(BOOST_DISABLE_THREADS) && defined(BOOST_HAS_THREADS) 258 # undef BOOST_HAS_THREADS 259 #endif 260 261 // 262 // Turn threading support off if we don't recognise the threading API: 263 // 264 #if defined(BOOST_HAS_THREADS) && !defined(BOOST_HAS_PTHREADS)\ 265 && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_BETHREADS)\ 266 && !defined(BOOST_HAS_MPTASKS) 267 # undef BOOST_HAS_THREADS 268 #endif 269 270 // 271 // Turn threading detail macros off if we don't (want to) use threading 272 // 273 #ifndef BOOST_HAS_THREADS 274 # undef BOOST_HAS_PTHREADS 275 # undef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE 276 # undef BOOST_HAS_PTHREAD_YIELD 277 # undef BOOST_HAS_PTHREAD_DELAY_NP 278 # undef BOOST_HAS_WINTHREADS 279 # undef BOOST_HAS_BETHREADS 280 # undef BOOST_HAS_MPTASKS 281 #endif 282 283 // 284 // If the compiler claims to be C99 conformant, then it had better 285 // have a <stdint.h>: 286 // 287 # if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901) 288 # define BOOST_HAS_STDINT_H 289 # ifndef BOOST_HAS_LOG1P 290 # define BOOST_HAS_LOG1P 291 # endif 292 # ifndef BOOST_HAS_EXPM1 293 # define BOOST_HAS_EXPM1 294 # endif 295 # endif 296 297 // 298 // Define BOOST_NO_SLIST and BOOST_NO_HASH if required. 299 // Note that this is for backwards compatibility only. 300 // 301 # if !defined(BOOST_HAS_SLIST) && !defined(BOOST_NO_SLIST) 302 # define BOOST_NO_SLIST 303 # endif 304 305 # if !defined(BOOST_HAS_HASH) && !defined(BOOST_NO_HASH) 306 # define BOOST_NO_HASH 307 # endif 308 309 // 310 // Set BOOST_SLIST_HEADER if not set already: 311 // 312 #if defined(BOOST_HAS_SLIST) && !defined(BOOST_SLIST_HEADER) 313 # define BOOST_SLIST_HEADER <slist> 314 #endif 315 316 // 317 // Set BOOST_HASH_SET_HEADER if not set already: 318 // 319 #if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_SET_HEADER) 320 # define BOOST_HASH_SET_HEADER <hash_set> 321 #endif 322 323 // 324 // Set BOOST_HASH_MAP_HEADER if not set already: 325 // 326 #if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_MAP_HEADER) 327 # define BOOST_HASH_MAP_HEADER <hash_map> 328 #endif 329 330 // BOOST_HAS_ABI_HEADERS 331 // This macro gets set if we have headers that fix the ABI, 332 // and prevent ODR violations when linking to external libraries: 333 #if defined(BOOST_ABI_PREFIX) && defined(BOOST_ABI_SUFFIX) && !defined(BOOST_HAS_ABI_HEADERS) 334 # define BOOST_HAS_ABI_HEADERS 335 #endif 336 337 #if defined(BOOST_HAS_ABI_HEADERS) && defined(BOOST_DISABLE_ABI_HEADERS) 338 # undef BOOST_HAS_ABI_HEADERS 339 #endif 340 341 // BOOST_NO_STDC_NAMESPACE workaround --------------------------------------// 342 // Because std::size_t usage is so common, even in boost headers which do not 343 // otherwise use the C library, the <cstddef> workaround is included here so 344 // that ugly workaround code need not appear in many other boost headers. 345 // NOTE WELL: This is a workaround for non-conforming compilers; <cstddef> 346 // must still be #included in the usual places so that <cstddef> inclusion 347 // works as expected with standard conforming compilers. The resulting 348 // double inclusion of <cstddef> is harmless. 349 350 # if defined(BOOST_NO_STDC_NAMESPACE) && defined(__cplusplus) 351 # include <cstddef> 352 namespace std { using ::ptrdiff_t; using ::size_t; } 353 # endif 354 355 // Workaround for the unfortunate min/max macros defined by some platform headers 356 357 #define BOOST_PREVENT_MACRO_SUBSTITUTION 358 359 #ifndef BOOST_USING_STD_MIN 360 # define BOOST_USING_STD_MIN() using std::min 361 #endif 362 363 #ifndef BOOST_USING_STD_MAX 364 # define BOOST_USING_STD_MAX() using std::max 365 #endif 366 367 // BOOST_NO_STD_MIN_MAX workaround -----------------------------------------// 368 369 # if defined(BOOST_NO_STD_MIN_MAX) && defined(__cplusplus) 370 371 namespace std { 372 template <class _Tp> 373 inline const _Tp& min BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) { 374 return __b < __a ? __b : __a; 375 } 376 template <class _Tp> 377 inline const _Tp& max BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) { 378 return __a < __b ? __b : __a; 379 } 380 } 381 382 # endif 383 384 // BOOST_STATIC_CONSTANT workaround --------------------------------------- // 385 // On compilers which don't allow in-class initialization of static integral 386 // constant members, we must use enums as a workaround if we want the constants 387 // to be available at compile-time. This macro gives us a convenient way to 388 // declare such constants. 389 390 # ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION 391 # define BOOST_STATIC_CONSTANT(type, assignment) enum { assignment } 392 # else 393 # define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment 394 # endif 395 396 // BOOST_USE_FACET / HAS_FACET workaround ----------------------------------// 397 // When the standard library does not have a conforming std::use_facet there 398 // are various workarounds available, but they differ from library to library. 399 // The same problem occurs with has_facet. 400 // These macros provide a consistent way to access a locale's facets. 401 // Usage: 402 // replace 403 // std::use_facet<Type>(loc); 404 // with 405 // BOOST_USE_FACET(Type, loc); 406 // Note do not add a std:: prefix to the front of BOOST_USE_FACET! 407 // Use for BOOST_HAS_FACET is analogous. 408 409 #if defined(BOOST_NO_STD_USE_FACET) 410 # ifdef BOOST_HAS_TWO_ARG_USE_FACET 411 # define BOOST_USE_FACET(Type, loc) std::use_facet(loc, static_cast<Type*>(0)) 412 # define BOOST_HAS_FACET(Type, loc) std::has_facet(loc, static_cast<Type*>(0)) 413 # elif defined(BOOST_HAS_MACRO_USE_FACET) 414 # define BOOST_USE_FACET(Type, loc) std::_USE(loc, Type) 415 # define BOOST_HAS_FACET(Type, loc) std::_HAS(loc, Type) 416 # elif defined(BOOST_HAS_STLP_USE_FACET) 417 # define BOOST_USE_FACET(Type, loc) (*std::_Use_facet<Type >(loc)) 418 # define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc) 419 # endif 420 #else 421 # define BOOST_USE_FACET(Type, loc) std::use_facet< Type >(loc) 422 # define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc) 423 #endif 424 425 // BOOST_NESTED_TEMPLATE workaround ------------------------------------------// 426 // Member templates are supported by some compilers even though they can't use 427 // the A::template member<U> syntax, as a workaround replace: 428 // 429 // typedef typename A::template rebind<U> binder; 430 // 431 // with: 432 // 433 // typedef typename A::BOOST_NESTED_TEMPLATE rebind<U> binder; 434 435 #ifndef BOOST_NO_MEMBER_TEMPLATE_KEYWORD 436 # define BOOST_NESTED_TEMPLATE template 437 #else 438 # define BOOST_NESTED_TEMPLATE 439 #endif 440 441 // BOOST_UNREACHABLE_RETURN(x) workaround -------------------------------------// 442 // Normally evaluates to nothing, unless BOOST_NO_UNREACHABLE_RETURN_DETECTION 443 // is defined, in which case it evaluates to return x; Use when you have a return 444 // statement that can never be reached. 445 446 #ifdef BOOST_NO_UNREACHABLE_RETURN_DETECTION 447 # define BOOST_UNREACHABLE_RETURN(x) return x; 448 #else 449 # define BOOST_UNREACHABLE_RETURN(x) 450 #endif 451 452 // BOOST_DEDUCED_TYPENAME workaround ------------------------------------------// 453 // 454 // Some compilers don't support the use of `typename' for dependent 455 // types in deduced contexts, e.g. 456 // 457 // template <class T> void f(T, typename T::type); 458 // ^^^^^^^^ 459 // Replace these declarations with: 460 // 461 // template <class T> void f(T, BOOST_DEDUCED_TYPENAME T::type); 462 463 #ifndef BOOST_NO_DEDUCED_TYPENAME 464 # define BOOST_DEDUCED_TYPENAME typename 465 #else 466 # define BOOST_DEDUCED_TYPENAME 467 #endif 468 469 #ifndef BOOST_NO_TYPENAME_WITH_CTOR 470 # define BOOST_CTOR_TYPENAME typename 471 #else 472 # define BOOST_CTOR_TYPENAME 473 #endif 474 475 // long long workaround ------------------------------------------// 476 // On gcc (and maybe other compilers?) long long is alway supported 477 // but it's use may generate either warnings (with -ansi), or errors 478 // (with -pedantic -ansi) unless it's use is prefixed by __extension__ 479 // 480 #if defined(BOOST_HAS_LONG_LONG) && defined(__cplusplus) 481 namespace boost{ 482 # ifdef __GNUC__ 483 __extension__ typedef long long long_long_type; 484 __extension__ typedef unsigned long long ulong_long_type; 485 # else 486 typedef long long long_long_type; 487 typedef unsigned long long ulong_long_type; 488 # endif 489 } 490 #endif 491 492 // BOOST_[APPEND_]EXPLICIT_TEMPLATE_[NON_]TYPE macros --------------------------// 493 // 494 // Some compilers have problems with function templates whose template 495 // parameters don't appear in the function parameter list (basically 496 // they just link one instantiation of the template in the final 497 // executable). These macros provide a uniform way to cope with the 498 // problem with no effects on the calling syntax. 499 500 // Example: 501 // 502 // #include <iostream> 503 // #include <ostream> 504 // #include <typeinfo> 505 // 506 // template <int n> 507 // void f() { std::cout << n << ' '; } 508 // 509 // template <typename T> 510 // void g() { std::cout << typeid(T).name() << ' '; } 511 // 512 // int main() { 513 // f<1>(); 514 // f<2>(); 515 // 516 // g<int>(); 517 // g<double>(); 518 // } 519 // 520 // With VC++ 6.0 the output is: 521 // 522 // 2 2 double double 523 // 524 // To fix it, write 525 // 526 // template <int n> 527 // void f(BOOST_EXPLICIT_TEMPLATE_NON_TYPE(int, n)) { ... } 528 // 529 // template <typename T> 530 // void g(BOOST_EXPLICIT_TEMPLATE_TYPE(T)) { ... } 531 // 532 533 534 #if defined(BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS) && defined(__cplusplus) 535 536 # include "boost/type.hpp" 537 # include "boost/non_type.hpp" 538 539 # define BOOST_EXPLICIT_TEMPLATE_TYPE(t) boost::type<t>* = 0 540 # define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t) boost::type<t>* 541 # define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v) boost::non_type<t, v>* = 0 542 # define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) boost::non_type<t, v>* 543 544 # define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t) \ 545 , BOOST_EXPLICIT_TEMPLATE_TYPE(t) 546 # define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t) \ 547 , BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t) 548 # define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v) \ 549 , BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v) 550 # define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) \ 551 , BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) 552 553 #else 554 555 // no workaround needed: expand to nothing 556 557 # define BOOST_EXPLICIT_TEMPLATE_TYPE(t) 558 # define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t) 559 # define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v) 560 # define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) 561 562 # define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t) 563 # define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t) 564 # define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v) 565 # define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) 566 567 568 #endif // defined BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS 569 570 // When BOOST_NO_STD_TYPEINFO is defined, we can just import 571 // the global definition into std namespace: 572 #if defined(BOOST_NO_STD_TYPEINFO) && defined(__cplusplus) 573 #include <typeinfo> 574 namespace std{ using ::type_info; } 575 #endif 576 577 // ---------------------------------------------------------------------------// 578 579 // 580 // Helper macro BOOST_STRINGIZE: 581 // Converts the parameter X to a string after macro replacement 582 // on X has been performed. 583 // 584 #define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X) 585 #define BOOST_DO_STRINGIZE(X) #X 586 587 // 588 // Helper macro BOOST_JOIN: 589 // The following piece of macro magic joins the two 590 // arguments together, even when one of the arguments is 591 // itself a macro (see 16.3.1 in C++ standard). The key 592 // is that macro expansion of macro arguments does not 593 // occur in BOOST_DO_JOIN2 but does in BOOST_DO_JOIN. 594 // 595 #define BOOST_JOIN( X, Y ) BOOST_DO_JOIN( X, Y ) 596 #define BOOST_DO_JOIN( X, Y ) BOOST_DO_JOIN2(X,Y) 597 #define BOOST_DO_JOIN2( X, Y ) X##Y 598 599 // 600 // Set some default values for compiler/library/platform names. 601 // These are for debugging config setup only: 602 // 603 # ifndef BOOST_COMPILER 604 # define BOOST_COMPILER "Unknown ISO C++ Compiler" 605 # endif 606 # ifndef BOOST_STDLIB 607 # define BOOST_STDLIB "Unknown ISO standard library" 608 # endif 609 # ifndef BOOST_PLATFORM 610 # if defined(unix) || defined(__unix) || defined(_XOPEN_SOURCE) \ 611 || defined(_POSIX_SOURCE) 612 # define BOOST_PLATFORM "Generic Unix" 613 # else 614 # define BOOST_PLATFORM "Unknown" 615 # endif 616 # endif 617 618 // 619 // Set some default values GPU support 620 // 621 # ifndef BOOST_GPU_ENABLED 622 # define BOOST_GPU_ENABLED 623 # endif 624 625 // BOOST_FORCEINLINE ---------------------------------------------// 626 // Macro to use in place of 'inline' to force a function to be inline 627 #if !defined(BOOST_FORCEINLINE) 628 # if defined(_MSC_VER) 629 # define BOOST_FORCEINLINE __forceinline 630 # elif defined(__GNUC__) && __GNUC__ > 3 631 # define BOOST_FORCEINLINE inline __attribute__ ((always_inline)) 632 # else 633 # define BOOST_FORCEINLINE inline 634 # endif 635 #endif 636 637 // 638 // Set BOOST_NO_DECLTYPE_N3276 when BOOST_NO_DECLTYPE is defined 639 // 640 #if defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276) 641 #define BOOST_NO_CXX11_DECLTYPE_N3276 BOOST_NO_CXX11_DECLTYPE 642 #endif 643 644 // -------------------- Deprecated macros for 1.50 --------------------------- 645 // These will go away in a future release 646 647 // Use BOOST_NO_CXX11_HDR_UNORDERED_SET or BOOST_NO_CXX11_HDR_UNORDERED_MAP 648 // instead of BOOST_NO_STD_UNORDERED 649 #if defined(BOOST_NO_CXX11_HDR_UNORDERED_MAP) || defined (BOOST_NO_CXX11_HDR_UNORDERED_SET) 650 # ifndef BOOST_NO_STD_UNORDERED 651 # define BOOST_NO_STD_UNORDERED 652 # endif 653 #endif 654 655 // Use BOOST_NO_CXX11_HDR_INITIALIZER_LIST instead of BOOST_NO_INITIALIZER_LISTS 656 #if defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_INITIALIZER_LISTS) 657 # define BOOST_NO_INITIALIZER_LISTS 658 #endif 659 660 // Use BOOST_NO_CXX11_HDR_ARRAY instead of BOOST_NO_0X_HDR_ARRAY 661 #if defined(BOOST_NO_CXX11_HDR_ARRAY) && !defined(BOOST_NO_BOOST_NO_0X_HDR_ARRAY) 662 # define BOOST_NO_0X_HDR_ARRAY 663 #endif 664 // Use BOOST_NO_CXX11_HDR_CHRONO instead of BOOST_NO_0X_HDR_CHRONO 665 #if defined(BOOST_NO_CXX11_HDR_CHRONO) && !defined(BOOST_NO_0X_HDR_CHRONO) 666 # define BOOST_NO_0X_HDR_CHRONO 667 #endif 668 // Use BOOST_NO_CXX11_HDR_CODECVT instead of BOOST_NO_0X_HDR_CODECVT 669 #if defined(BOOST_NO_CXX11_HDR_CODECVT) && !defined(BOOST_NO_0X_HDR_CODECVT) 670 # define BOOST_NO_0X_HDR_CODECVT 671 #endif 672 // Use BOOST_NO_CXX11_HDR_CONDITION_VARIABLE instead of BOOST_NO_0X_HDR_CONDITION_VARIABLE 673 #if defined(BOOST_NO_CXX11_HDR_CONDITION_VARIABLE) && !defined(BOOST_NO_0X_HDR_CONDITION_VARIABLE) 674 # define BOOST_NO_0X_HDR_CONDITION_VARIABLE 675 #endif 676 // Use BOOST_NO_CXX11_HDR_FORWARD_LIST instead of BOOST_NO_0X_HDR_FORWARD_LIST 677 #if defined(BOOST_NO_CXX11_HDR_FORWARD_LIST) && !defined(BOOST_NO_0X_HDR_FORWARD_LIST) 678 # define BOOST_NO_0X_HDR_FORWARD_LIST 679 #endif 680 // Use BOOST_NO_CXX11_HDR_FUTURE instead of BOOST_NO_0X_HDR_FUTURE 681 #if defined(BOOST_NO_CXX11_HDR_FUTURE) && !defined(BOOST_NO_0X_HDR_FUTURE) 682 # define BOOST_NO_0X_HDR_FUTURE 683 #endif 684 685 // Use BOOST_NO_CXX11_HDR_INITIALIZER_LIST 686 // instead of BOOST_NO_0X_HDR_INITIALIZER_LIST or BOOST_NO_INITIALIZER_LISTS 687 #ifdef BOOST_NO_CXX11_HDR_INITIALIZER_LIST 688 # ifndef BOOST_NO_0X_HDR_INITIALIZER_LIST 689 # define BOOST_NO_0X_HDR_INITIALIZER_LIST 690 # endif 691 # ifndef BOOST_NO_INITIALIZER_LISTS 692 # define BOOST_NO_INITIALIZER_LISTS 693 # endif 694 #endif 695 696 // Use BOOST_NO_CXX11_HDR_MUTEX instead of BOOST_NO_0X_HDR_MUTEX 697 #if defined(BOOST_NO_CXX11_HDR_MUTEX) && !defined(BOOST_NO_0X_HDR_MUTEX) 698 # define BOOST_NO_0X_HDR_MUTEX 699 #endif 700 // Use BOOST_NO_CXX11_HDR_RANDOM instead of BOOST_NO_0X_HDR_RANDOM 701 #if defined(BOOST_NO_CXX11_HDR_RANDOM) && !defined(BOOST_NO_0X_HDR_RANDOM) 702 # define BOOST_NO_0X_HDR_RANDOM 703 #endif 704 // Use BOOST_NO_CXX11_HDR_RATIO instead of BOOST_NO_0X_HDR_RATIO 705 #if defined(BOOST_NO_CXX11_HDR_RATIO) && !defined(BOOST_NO_0X_HDR_RATIO) 706 # define BOOST_NO_0X_HDR_RATIO 707 #endif 708 // Use BOOST_NO_CXX11_HDR_REGEX instead of BOOST_NO_0X_HDR_REGEX 709 #if defined(BOOST_NO_CXX11_HDR_REGEX) && !defined(BOOST_NO_0X_HDR_REGEX) 710 # define BOOST_NO_0X_HDR_REGEX 711 #endif 712 // Use BOOST_NO_CXX11_HDR_SYSTEM_ERROR instead of BOOST_NO_0X_HDR_SYSTEM_ERROR 713 #if defined(BOOST_NO_CXX11_HDR_SYSTEM_ERROR) && !defined(BOOST_NO_0X_HDR_SYSTEM_ERROR) 714 # define BOOST_NO_0X_HDR_SYSTEM_ERROR 715 #endif 716 // Use BOOST_NO_CXX11_HDR_THREAD instead of BOOST_NO_0X_HDR_THREAD 717 #if defined(BOOST_NO_CXX11_HDR_THREAD) && !defined(BOOST_NO_0X_HDR_THREAD) 718 # define BOOST_NO_0X_HDR_THREAD 719 #endif 720 // Use BOOST_NO_CXX11_HDR_TUPLE instead of BOOST_NO_0X_HDR_TUPLE 721 #if defined(BOOST_NO_CXX11_HDR_TUPLE) && !defined(BOOST_NO_0X_HDR_TUPLE) 722 # define BOOST_NO_0X_HDR_TUPLE 723 #endif 724 // Use BOOST_NO_CXX11_HDR_TYPE_TRAITS instead of BOOST_NO_0X_HDR_TYPE_TRAITS 725 #if defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) && !defined(BOOST_NO_0X_HDR_TYPE_TRAITS) 726 # define BOOST_NO_0X_HDR_TYPE_TRAITS 727 #endif 728 // Use BOOST_NO_CXX11_HDR_TYPEINDEX instead of BOOST_NO_0X_HDR_TYPEINDEX 729 #if defined(BOOST_NO_CXX11_HDR_TYPEINDEX) && !defined(BOOST_NO_0X_HDR_TYPEINDEX) 730 # define BOOST_NO_0X_HDR_TYPEINDEX 731 #endif 732 // Use BOOST_NO_CXX11_HDR_UNORDERED_MAP instead of BOOST_NO_0X_HDR_UNORDERED_MAP 733 #if defined(BOOST_NO_CXX11_HDR_UNORDERED_MAP) && !defined(BOOST_NO_0X_HDR_UNORDERED_MAP) 734 # define BOOST_NO_0X_HDR_UNORDERED_MAP 735 #endif 736 // Use BOOST_NO_CXX11_HDR_UNORDERED_SET instead of BOOST_NO_0X_HDR_UNORDERED_SET 737 #if defined(BOOST_NO_CXX11_HDR_UNORDERED_SET) && !defined(BOOST_NO_0X_HDR_UNORDERED_SET) 738 # define BOOST_NO_0X_HDR_UNORDERED_SET 739 #endif 740 741 // ------------------ End of deprecated macros for 1.50 --------------------------- 742 743 // -------------------- Deprecated macros for 1.51 --------------------------- 744 // These will go away in a future release 745 746 // Use BOOST_NO_CXX11_AUTO_DECLARATIONS instead of BOOST_NO_AUTO_DECLARATIONS 747 #if defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && !defined(BOOST_NO_AUTO_DECLARATIONS) 748 # define BOOST_NO_AUTO_DECLARATIONS 749 #endif 750 // Use BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS instead of BOOST_NO_AUTO_MULTIDECLARATIONS 751 #if defined(BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS) && !defined(BOOST_NO_AUTO_MULTIDECLARATIONS) 752 # define BOOST_NO_AUTO_MULTIDECLARATIONS 753 #endif 754 // Use BOOST_NO_CXX11_CHAR16_T instead of BOOST_NO_CHAR16_T 755 #if defined(BOOST_NO_CXX11_CHAR16_T) && !defined(BOOST_NO_CHAR16_T) 756 # define BOOST_NO_CHAR16_T 757 #endif 758 // Use BOOST_NO_CXX11_CHAR32_T instead of BOOST_NO_CHAR32_T 759 #if defined(BOOST_NO_CXX11_CHAR32_T) && !defined(BOOST_NO_CHAR32_T) 760 # define BOOST_NO_CHAR32_T 761 #endif 762 // Use BOOST_NO_CXX11_TEMPLATE_ALIASES instead of BOOST_NO_TEMPLATE_ALIASES 763 #if defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) && !defined(BOOST_NO_TEMPLATE_ALIASES) 764 # define BOOST_NO_TEMPLATE_ALIASES 765 #endif 766 // Use BOOST_NO_CXX11_CONSTEXPR instead of BOOST_NO_CONSTEXPR 767 #if defined(BOOST_NO_CXX11_CONSTEXPR) && !defined(BOOST_NO_CONSTEXPR) 768 # define BOOST_NO_CONSTEXPR 769 #endif 770 // Use BOOST_NO_CXX11_DECLTYPE_N3276 instead of BOOST_NO_DECLTYPE_N3276 771 #if defined(BOOST_NO_CXX11_DECLTYPE_N3276) && !defined(BOOST_NO_DECLTYPE_N3276) 772 # define BOOST_NO_DECLTYPE_N3276 773 #endif 774 // Use BOOST_NO_CXX11_DECLTYPE instead of BOOST_NO_DECLTYPE 775 #if defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_DECLTYPE) 776 # define BOOST_NO_DECLTYPE 777 #endif 778 // Use BOOST_NO_CXX11_DEFAULTED_FUNCTIONS instead of BOOST_NO_DEFAULTED_FUNCTIONS 779 #if defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_DEFAULTED_FUNCTIONS) 780 # define BOOST_NO_DEFAULTED_FUNCTIONS 781 #endif 782 // Use BOOST_NO_CXX11_DELETED_FUNCTIONS instead of BOOST_NO_DELETED_FUNCTIONS 783 #if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(BOOST_NO_DELETED_FUNCTIONS) 784 # define BOOST_NO_DELETED_FUNCTIONS 785 #endif 786 // Use BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS instead of BOOST_NO_EXPLICIT_CONVERSION_OPERATORS 787 #if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS) && !defined(BOOST_NO_EXPLICIT_CONVERSION_OPERATORS) 788 # define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS 789 #endif 790 // Use BOOST_NO_CXX11_EXTERN_TEMPLATE instead of BOOST_NO_EXTERN_TEMPLATE 791 #if defined(BOOST_NO_CXX11_EXTERN_TEMPLATE) && !defined(BOOST_NO_EXTERN_TEMPLATE) 792 # define BOOST_NO_EXTERN_TEMPLATE 793 #endif 794 // Use BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS instead of BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS 795 #if defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) && !defined(BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS) 796 # define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS 797 #endif 798 // Use BOOST_NO_CXX11_LAMBDAS instead of BOOST_NO_LAMBDAS 799 #if defined(BOOST_NO_CXX11_LAMBDAS) && !defined(BOOST_NO_LAMBDAS) 800 # define BOOST_NO_LAMBDAS 801 #endif 802 // Use BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS instead of BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS 803 #if defined(BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS) && !defined(BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS) 804 # define BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS 805 #endif 806 // Use BOOST_NO_CXX11_NOEXCEPT instead of BOOST_NO_NOEXCEPT 807 #if defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_NOEXCEPT) 808 # define BOOST_NO_NOEXCEPT 809 #endif 810 // Use BOOST_NO_CXX11_NULLPTR instead of BOOST_NO_NULLPTR 811 #if defined(BOOST_NO_CXX11_NULLPTR) && !defined(BOOST_NO_NULLPTR) 812 # define BOOST_NO_NULLPTR 813 #endif 814 // Use BOOST_NO_CXX11_RAW_LITERALS instead of BOOST_NO_RAW_LITERALS 815 #if defined(BOOST_NO_CXX11_RAW_LITERALS) && !defined(BOOST_NO_RAW_LITERALS) 816 # define BOOST_NO_RAW_LITERALS 817 #endif 818 // Use BOOST_NO_CXX11_RVALUE_REFERENCES instead of BOOST_NO_RVALUE_REFERENCES 819 #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_RVALUE_REFERENCES) 820 # define BOOST_NO_RVALUE_REFERENCES 821 #endif 822 // Use BOOST_NO_CXX11_SCOPED_ENUMS instead of BOOST_NO_SCOPED_ENUMS 823 #if defined(BOOST_NO_CXX11_SCOPED_ENUMS) && !defined(BOOST_NO_SCOPED_ENUMS) 824 # define BOOST_NO_SCOPED_ENUMS 825 #endif 826 // Use BOOST_NO_CXX11_STATIC_ASSERT instead of BOOST_NO_STATIC_ASSERT 827 #if defined(BOOST_NO_CXX11_STATIC_ASSERT) && !defined(BOOST_NO_STATIC_ASSERT) 828 # define BOOST_NO_STATIC_ASSERT 829 #endif 830 // Use BOOST_NO_CXX11_STD_UNORDERD instead of BOOST_NO_STD_UNORDERD 831 #if defined(BOOST_NO_CXX11_STD_UNORDERD) && !defined(BOOST_NO_STD_UNORDERD) 832 # define BOOST_NO_STD_UNORDERD 833 #endif 834 // Use BOOST_NO_CXX11_UNICODE_LITERALS instead of BOOST_NO_UNICODE_LITERALS 835 #if defined(BOOST_NO_CXX11_UNICODE_LITERALS) && !defined(BOOST_NO_UNICODE_LITERALS) 836 # define BOOST_NO_UNICODE_LITERALS 837 #endif 838 // Use BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX instead of BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX 839 #if defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) && !defined(BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX) 840 # define BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX 841 #endif 842 // Use BOOST_NO_CXX11_VARIADIC_TEMPLATES instead of BOOST_NO_VARIADIC_TEMPLATES 843 #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_VARIADIC_TEMPLATES) 844 # define BOOST_NO_VARIADIC_TEMPLATES 845 #endif 846 // Use BOOST_NO_CXX11_VARIADIC_MACROS instead of BOOST_NO_VARIADIC_MACROS 847 #if defined(BOOST_NO_CXX11_VARIADIC_MACROS) && !defined(BOOST_NO_VARIADIC_MACROS) 848 # define BOOST_NO_VARIADIC_MACROS 849 #endif 850 // Use BOOST_NO_CXX11_NUMERIC_LIMITS instead of BOOST_NO_NUMERIC_LIMITS_LOWEST 851 #if defined(BOOST_NO_CXX11_NUMERIC_LIMITS) && !defined(BOOST_NO_NUMERIC_LIMITS_LOWEST) 852 # define BOOST_NO_NUMERIC_LIMITS_LOWEST 853 #endif 854 // ------------------ End of deprecated macros for 1.51 --------------------------- 855 856 857 858 // 859 // Helper macros BOOST_NOEXCEPT, BOOST_NOEXCEPT_IF, BOOST_NOEXCEPT_EXPR 860 // These aid the transition to C++11 while still supporting C++03 compilers 861 // 862 #ifdef BOOST_NO_NOEXCEPT 863 # define BOOST_NOEXCEPT 864 # define BOOST_NOEXCEPT_IF(Predicate) 865 # define BOOST_NOEXCEPT_EXPR(Expression) false 866 #else 867 # define BOOST_NOEXCEPT noexcept 868 # define BOOST_NOEXCEPT_IF(Predicate) noexcept((Predicate)) 869 # define BOOST_NOEXCEPT_EXPR(Expression) noexcept((Expression)) 870 #endif 871 872 // 873 // Normalize BOOST_NO_STATIC_ASSERT and (depricated) BOOST_HAS_STATIC_ASSERT: 874 // 875 #if !defined(BOOST_NO_STATIC_ASSERT) && !defined(BOOST_HAS_STATIC_ASSERT) 876 # define BOOST_HAS_STATIC_ASSERT 877 #endif 878 879 // 880 // constexpr workarounds 881 // 882 #if defined(BOOST_NO_CONSTEXPR) 883 #define BOOST_CONSTEXPR 884 #define BOOST_CONSTEXPR_OR_CONST const 885 #else 886 #define BOOST_CONSTEXPR constexpr 887 #define BOOST_CONSTEXPR_OR_CONST constexpr 888 #endif 889 890 #define BOOST_STATIC_CONSTEXPR static BOOST_CONSTEXPR_OR_CONST 891 892 // 893 // Set BOOST_HAS_RVALUE_REFS when BOOST_NO_RVALUE_REFERENCES is not defined 894 // 895 #if !defined(BOOST_NO_RVALUE_REFERENCES) && !defined(BOOST_HAS_RVALUE_REFS) 896 #define BOOST_HAS_RVALUE_REFS 897 #endif 898 899 // 900 // Set BOOST_HAS_VARIADIC_TMPL when BOOST_NO_VARIADIC_TEMPLATES is not defined 901 // 902 #if !defined(BOOST_NO_VARIADIC_TEMPLATES) && !defined(BOOST_HAS_VARIADIC_TMPL) 903 #define BOOST_HAS_VARIADIC_TMPL 904 #endif 905 906 907 #endif 908