Home | History | Annotate | Download | only in config
      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