williamr@2: // Boost config.hpp configuration header file ------------------------------// williamr@2: williamr@2: // (C) Copyright John Maddock 2001 - 2003. williamr@2: // (C) Copyright Darin Adler 2001. williamr@2: // (C) Copyright Peter Dimov 2001. williamr@2: // (C) Copyright Bill Kempf 2002. williamr@2: // (C) Copyright Jens Maurer 2002. williamr@2: // (C) Copyright David Abrahams 2002 - 2003. williamr@2: // (C) Copyright Gennaro Prota 2003. williamr@2: // (C) Copyright Eric Friedman 2003. williamr@2: // Use, modification and distribution are subject to the williamr@2: // Boost Software License, Version 1.0. (See accompanying file williamr@2: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) williamr@2: williamr@2: // See http://www.boost.org for most recent version. williamr@2: williamr@2: // Boost config.hpp policy and rationale documentation has been moved to williamr@2: // http://www.boost.org/libs/config williamr@2: // williamr@2: // This file is intended to be stable, and relatively unchanging. williamr@2: // It should contain boilerplate code only - no compiler specific williamr@2: // code unless it is unavoidable - no changes unless unavoidable. williamr@2: williamr@2: #ifndef BOOST_CONFIG_SUFFIX_HPP williamr@2: #define BOOST_CONFIG_SUFFIX_HPP williamr@2: williamr@2: // williamr@2: // look for long long by looking for the appropriate macros in . williamr@2: // Note that we use limits.h rather than climits for maximal portability, williamr@2: // remember that since these just declare a bunch of macros, there should be williamr@2: // no namespace issues from this. williamr@2: // williamr@2: #if !defined(BOOST_HAS_LONG_LONG) \ williamr@2: && !defined(BOOST_MSVC) && !defined(__BORLANDC__) williamr@2: # include williamr@2: # if (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX)) williamr@2: # define BOOST_HAS_LONG_LONG williamr@2: # endif williamr@2: #endif williamr@2: williamr@2: // GCC 3.x will clean up all of those nasty macro definitions that williamr@2: // BOOST_NO_CTYPE_FUNCTIONS is intended to help work around, so undefine williamr@2: // it under GCC 3.x. williamr@2: #if defined(__GNUC__) && (__GNUC__ >= 3) && defined(BOOST_NO_CTYPE_FUNCTIONS) williamr@2: # undef BOOST_NO_CTYPE_FUNCTIONS williamr@2: #endif williamr@2: williamr@2: williamr@2: // williamr@2: // Assume any extensions are in namespace std:: unless stated otherwise: williamr@2: // williamr@2: # ifndef BOOST_STD_EXTENSION_NAMESPACE williamr@2: # define BOOST_STD_EXTENSION_NAMESPACE std williamr@2: # endif williamr@2: williamr@2: // williamr@2: // If cv-qualified specializations are not allowed, then neither are cv-void ones: williamr@2: // williamr@2: # if defined(BOOST_NO_CV_SPECIALIZATIONS) \ williamr@2: && !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS) williamr@2: # define BOOST_NO_CV_VOID_SPECIALIZATIONS williamr@2: # endif williamr@2: williamr@2: // williamr@2: // If there is no numeric_limits template, then it can't have any compile time williamr@2: // constants either! williamr@2: // williamr@2: # if defined(BOOST_NO_LIMITS) \ williamr@2: && !defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) williamr@2: # define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS williamr@2: # define BOOST_NO_MS_INT64_NUMERIC_LIMITS williamr@2: # define BOOST_NO_LONG_LONG_NUMERIC_LIMITS williamr@2: # endif williamr@2: williamr@2: // williamr@2: // if there is no long long then there is no specialisation williamr@2: // for numeric_limits either: williamr@2: // williamr@2: #if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG_NUMERIC_LIMITS) williamr@2: # define BOOST_NO_LONG_LONG_NUMERIC_LIMITS williamr@2: #endif williamr@2: williamr@2: // williamr@2: // if there is no __int64 then there is no specialisation williamr@2: // for numeric_limits<__int64> either: williamr@2: // williamr@2: #if !defined(BOOST_HAS_MS_INT64) && !defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS) williamr@2: # define BOOST_NO_MS_INT64_NUMERIC_LIMITS williamr@2: #endif williamr@2: williamr@2: // williamr@2: // if member templates are supported then so is the williamr@2: // VC6 subset of member templates: williamr@2: // williamr@2: # if !defined(BOOST_NO_MEMBER_TEMPLATES) \ williamr@2: && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) williamr@2: # define BOOST_MSVC6_MEMBER_TEMPLATES williamr@2: # endif williamr@2: williamr@2: // williamr@2: // Without partial specialization, can't test for partial specialisation bugs: williamr@2: // williamr@2: # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ williamr@2: && !defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG) williamr@2: # define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG williamr@2: # endif williamr@2: williamr@2: // williamr@2: // Without partial specialization, we can't have array-type partial specialisations: williamr@2: // williamr@2: # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ williamr@2: && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS) williamr@2: # define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS williamr@2: # endif williamr@2: williamr@2: // williamr@2: // Without partial specialization, std::iterator_traits can't work: williamr@2: // williamr@2: # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ williamr@2: && !defined(BOOST_NO_STD_ITERATOR_TRAITS) williamr@2: # define BOOST_NO_STD_ITERATOR_TRAITS williamr@2: # endif williamr@2: williamr@2: // williamr@2: // Without member template support, we can't have template constructors williamr@2: // in the standard library either: williamr@2: // williamr@2: # if defined(BOOST_NO_MEMBER_TEMPLATES) \ williamr@2: && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \ williamr@2: && !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS) williamr@2: # define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS williamr@2: # endif williamr@2: williamr@2: // williamr@2: // Without member template support, we can't have a conforming williamr@2: // std::allocator template either: williamr@2: // williamr@2: # if defined(BOOST_NO_MEMBER_TEMPLATES) \ williamr@2: && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \ williamr@2: && !defined(BOOST_NO_STD_ALLOCATOR) williamr@2: # define BOOST_NO_STD_ALLOCATOR williamr@2: # endif williamr@2: williamr@2: // williamr@2: // without ADL support then using declarations will break ADL as well: williamr@2: // williamr@2: #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) williamr@2: # define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL williamr@2: #endif williamr@2: williamr@2: // williamr@2: // If we have a standard allocator, then we have a partial one as well: williamr@2: // williamr@2: #if !defined(BOOST_NO_STD_ALLOCATOR) williamr@2: # define BOOST_HAS_PARTIAL_STD_ALLOCATOR williamr@2: #endif williamr@2: williamr@2: // williamr@2: // We can't have a working std::use_facet if there is no std::locale: williamr@2: // williamr@2: # if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_USE_FACET) williamr@2: # define BOOST_NO_STD_USE_FACET williamr@2: # endif williamr@2: williamr@2: // williamr@2: // We can't have a std::messages facet if there is no std::locale: williamr@2: // williamr@2: # if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_MESSAGES) williamr@2: # define BOOST_NO_STD_MESSAGES williamr@2: # endif williamr@2: williamr@2: // williamr@2: // We can't have a working std::wstreambuf if there is no std::locale: williamr@2: // williamr@2: # if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_WSTREAMBUF) williamr@2: # define BOOST_NO_STD_WSTREAMBUF williamr@2: # endif williamr@2: williamr@2: // williamr@2: // We can't have a if there is no : williamr@2: // williamr@2: # if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_CWCTYPE) williamr@2: # define BOOST_NO_CWCTYPE williamr@2: # endif williamr@2: williamr@2: // williamr@2: // We can't have a swprintf if there is no : williamr@2: // williamr@2: # if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_SWPRINTF) williamr@2: # define BOOST_NO_SWPRINTF williamr@2: # endif williamr@2: williamr@2: // williamr@2: // If Win32 support is turned off, then we must turn off williamr@2: // threading support also, unless there is some other williamr@2: // thread API enabled: williamr@2: // williamr@2: #if defined(BOOST_DISABLE_WIN32) && defined(_WIN32) \ williamr@2: && !defined(BOOST_DISABLE_THREADS) && !defined(BOOST_HAS_PTHREADS) williamr@2: # define BOOST_DISABLE_THREADS williamr@2: #endif williamr@2: williamr@2: // williamr@2: // Turn on threading support if the compiler thinks that it's in williamr@2: // multithreaded mode. We put this here because there are only a williamr@2: // limited number of macros that identify this (if there's any missing williamr@2: // from here then add to the appropriate compiler section): williamr@2: // williamr@2: #if (defined(__MT__) || defined(_MT) || defined(_REENTRANT) \ williamr@2: || defined(_PTHREADS)) && !defined(BOOST_HAS_THREADS) williamr@2: # define BOOST_HAS_THREADS williamr@2: #endif williamr@2: williamr@2: // williamr@2: // Turn threading support off if BOOST_DISABLE_THREADS is defined: williamr@2: // williamr@2: #if defined(BOOST_DISABLE_THREADS) && defined(BOOST_HAS_THREADS) williamr@2: # undef BOOST_HAS_THREADS williamr@2: #endif williamr@2: williamr@2: // williamr@2: // Turn threading support off if we don't recognise the threading API: williamr@2: // williamr@2: #if defined(BOOST_HAS_THREADS) && !defined(BOOST_HAS_PTHREADS)\ williamr@2: && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_BETHREADS)\ williamr@2: && !defined(BOOST_HAS_MPTASKS) williamr@2: # undef BOOST_HAS_THREADS williamr@2: #endif williamr@2: williamr@2: // williamr@2: // Turn threading detail macros off if we don't (want to) use threading williamr@2: // williamr@2: #ifndef BOOST_HAS_THREADS williamr@2: # undef BOOST_HAS_PTHREADS williamr@2: # undef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE williamr@2: # undef BOOST_HAS_WINTHREADS williamr@2: # undef BOOST_HAS_BETHREADS williamr@2: # undef BOOST_HAS_MPTASKS williamr@2: #endif williamr@2: williamr@2: // williamr@2: // If the compiler claims to be C99 conformant, then it had better williamr@2: // have a : williamr@2: // williamr@2: # if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901) williamr@2: # define BOOST_HAS_STDINT_H williamr@2: # ifndef BOOST_HAS_LOG1P williamr@2: # define BOOST_HAS_LOG1P williamr@2: # endif williamr@2: # ifndef BOOST_HAS_EXPM1 williamr@2: # define BOOST_HAS_EXPM1 williamr@2: # endif williamr@2: # endif williamr@2: williamr@2: // williamr@2: // Define BOOST_NO_SLIST and BOOST_NO_HASH if required. williamr@2: // Note that this is for backwards compatibility only. williamr@2: // williamr@2: # ifndef BOOST_HAS_SLIST williamr@2: # define BOOST_NO_SLIST williamr@2: # endif williamr@2: williamr@2: # ifndef BOOST_HAS_HASH williamr@2: # define BOOST_NO_HASH williamr@2: # endif williamr@2: williamr@2: // williamr@2: // Set BOOST_SLIST_HEADER if not set already: williamr@2: // williamr@2: #if defined(BOOST_HAS_SLIST) && !defined(BOOST_SLIST_HEADER) williamr@2: # define BOOST_SLIST_HEADER williamr@2: #endif williamr@2: williamr@2: // williamr@2: // Set BOOST_HASH_SET_HEADER if not set already: williamr@2: // williamr@2: #if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_SET_HEADER) williamr@2: # define BOOST_HASH_SET_HEADER williamr@2: #endif williamr@2: williamr@2: // williamr@2: // Set BOOST_HASH_MAP_HEADER if not set already: williamr@2: // williamr@2: #if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_MAP_HEADER) williamr@2: # define BOOST_HASH_MAP_HEADER williamr@2: #endif williamr@2: williamr@2: // BOOST_HAS_ABI_HEADERS williamr@2: // This macro gets set if we have headers that fix the ABI, williamr@2: // and prevent ODR violations when linking to external libraries: williamr@2: #if defined(BOOST_ABI_PREFIX) && defined(BOOST_ABI_SUFFIX) && !defined(BOOST_HAS_ABI_HEADERS) williamr@2: # define BOOST_HAS_ABI_HEADERS williamr@2: #endif williamr@2: williamr@2: #if defined(BOOST_HAS_ABI_HEADERS) && defined(BOOST_DISABLE_ABI_HEADERS) williamr@2: # undef BOOST_HAS_ABI_HEADERS williamr@2: #endif williamr@2: williamr@2: // BOOST_NO_STDC_NAMESPACE workaround --------------------------------------// williamr@2: // Because std::size_t usage is so common, even in boost headers which do not williamr@2: // otherwise use the C library, the workaround is included here so williamr@2: // that ugly workaround code need not appear in many other boost headers. williamr@2: // NOTE WELL: This is a workaround for non-conforming compilers; williamr@2: // must still be #included in the usual places so that inclusion williamr@2: // works as expected with standard conforming compilers. The resulting williamr@2: // double inclusion of is harmless. williamr@2: williamr@2: # ifdef BOOST_NO_STDC_NAMESPACE williamr@2: # include williamr@2: namespace std { using ::ptrdiff_t; using ::size_t; } williamr@2: # endif williamr@2: williamr@2: // Workaround for the unfortunate min/max macros defined by some platform headers williamr@2: williamr@2: #define BOOST_PREVENT_MACRO_SUBSTITUTION williamr@2: williamr@2: #ifndef BOOST_USING_STD_MIN williamr@2: # define BOOST_USING_STD_MIN() using std::min williamr@2: #endif williamr@2: williamr@2: #ifndef BOOST_USING_STD_MAX williamr@2: # define BOOST_USING_STD_MAX() using std::max williamr@2: #endif williamr@2: williamr@2: // BOOST_NO_STD_MIN_MAX workaround -----------------------------------------// williamr@2: williamr@2: # ifdef BOOST_NO_STD_MIN_MAX williamr@2: williamr@2: namespace std { williamr@2: template williamr@2: inline const _Tp& min BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) { williamr@2: return __b < __a ? __b : __a; williamr@2: } williamr@2: template williamr@2: inline const _Tp& max BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) { williamr@2: return __a < __b ? __b : __a; williamr@2: } williamr@2: } williamr@2: williamr@2: # endif williamr@2: williamr@2: // BOOST_STATIC_CONSTANT workaround --------------------------------------- // williamr@2: // On compilers which don't allow in-class initialization of static integral williamr@2: // constant members, we must use enums as a workaround if we want the constants williamr@2: // to be available at compile-time. This macro gives us a convenient way to williamr@2: // declare such constants. williamr@2: williamr@2: # ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION williamr@2: # define BOOST_STATIC_CONSTANT(type, assignment) enum { assignment } williamr@2: # else williamr@2: # define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment williamr@2: # endif williamr@2: williamr@2: // BOOST_USE_FACET / HAS_FACET workaround ----------------------------------// williamr@2: // When the standard library does not have a conforming std::use_facet there williamr@2: // are various workarounds available, but they differ from library to library. williamr@2: // The same problem occurs with has_facet. williamr@2: // These macros provide a consistent way to access a locale's facets. williamr@2: // Usage: williamr@2: // replace williamr@2: // std::use_facet(loc); williamr@2: // with williamr@2: // BOOST_USE_FACET(Type, loc); williamr@2: // Note do not add a std:: prefix to the front of BOOST_USE_FACET! williamr@2: // Use for BOOST_HAS_FACET is analagous. williamr@2: williamr@2: #if defined(BOOST_NO_STD_USE_FACET) williamr@2: # ifdef BOOST_HAS_TWO_ARG_USE_FACET williamr@2: # define BOOST_USE_FACET(Type, loc) std::use_facet(loc, static_cast(0)) williamr@2: # define BOOST_HAS_FACET(Type, loc) std::has_facet(loc, static_cast(0)) williamr@2: # elif defined(BOOST_HAS_MACRO_USE_FACET) williamr@2: # define BOOST_USE_FACET(Type, loc) std::_USE(loc, Type) williamr@2: # define BOOST_HAS_FACET(Type, loc) std::_HAS(loc, Type) williamr@2: # elif defined(BOOST_HAS_STLP_USE_FACET) williamr@2: # define BOOST_USE_FACET(Type, loc) (*std::_Use_facet(loc)) williamr@2: # define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc) williamr@2: # endif williamr@2: #else williamr@2: # define BOOST_USE_FACET(Type, loc) std::use_facet< Type >(loc) williamr@2: # define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc) williamr@2: #endif williamr@2: williamr@2: // BOOST_NESTED_TEMPLATE workaround ------------------------------------------// williamr@2: // Member templates are supported by some compilers even though they can't use williamr@2: // the A::template member syntax, as a workaround replace: williamr@2: // williamr@2: // typedef typename A::template rebind binder; williamr@2: // williamr@2: // with: williamr@2: // williamr@2: // typedef typename A::BOOST_NESTED_TEMPLATE rebind binder; williamr@2: williamr@2: #ifndef BOOST_NO_MEMBER_TEMPLATE_KEYWORD williamr@2: # define BOOST_NESTED_TEMPLATE template williamr@2: #else williamr@2: # define BOOST_NESTED_TEMPLATE williamr@2: #endif williamr@2: williamr@2: // BOOST_UNREACHABLE_RETURN(x) workaround -------------------------------------// williamr@2: // Normally evaluates to nothing, unless BOOST_NO_UNREACHABLE_RETURN_DETECTION williamr@2: // is defined, in which case it evaluates to return x; Use when you have a return williamr@2: // statement that can never be reached. williamr@2: williamr@2: #ifdef BOOST_NO_UNREACHABLE_RETURN_DETECTION williamr@2: # define BOOST_UNREACHABLE_RETURN(x) return x; williamr@2: #else williamr@2: # define BOOST_UNREACHABLE_RETURN(x) williamr@2: #endif williamr@2: williamr@2: // BOOST_DEDUCED_TYPENAME workaround ------------------------------------------// williamr@2: // williamr@2: // Some compilers don't support the use of `typename' for dependent williamr@2: // types in deduced contexts, e.g. williamr@2: // williamr@2: // template void f(T, typename T::type); williamr@2: // ^^^^^^^^ williamr@2: // Replace these declarations with: williamr@2: // williamr@2: // template void f(T, BOOST_DEDUCED_TYPENAME T::type); williamr@2: williamr@2: #ifndef BOOST_NO_DEDUCED_TYPENAME williamr@2: # define BOOST_DEDUCED_TYPENAME typename williamr@2: #else williamr@2: # define BOOST_DEDUCED_TYPENAME williamr@2: #endif williamr@2: williamr@2: // long long workaround ------------------------------------------// williamr@2: // On gcc (and maybe other compilers?) long long is alway supported williamr@2: // but it's use may generate either warnings (with -ansi), or errors williamr@2: // (with -pedantic -ansi) unless it's use is prefixed by __extension__ williamr@2: // williamr@2: #if defined(BOOST_HAS_LONG_LONG) williamr@2: namespace boost{ williamr@2: # ifdef __GNUC__ williamr@2: __extension__ typedef long long long_long_type; williamr@2: __extension__ typedef unsigned long long ulong_long_type; williamr@2: # else williamr@2: typedef long long long_long_type; williamr@2: typedef unsigned long long ulong_long_type; williamr@2: # endif williamr@2: } williamr@2: #endif williamr@2: williamr@2: // BOOST_[APPEND_]EXPLICIT_TEMPLATE_[NON_]TYPE macros --------------------------// williamr@2: // williamr@2: // Some compilers have problems with function templates whose williamr@2: // template parameters don't appear in the function parameter williamr@2: // list (basically they just link one instantiation of the williamr@2: // template in the final executable). These macros provide a williamr@2: // uniform way to cope with the problem with no effects on the williamr@2: // calling syntax. williamr@2: williamr@2: // Example: williamr@2: // williamr@2: // #include williamr@2: // #include williamr@2: // #include williamr@2: // williamr@2: // template williamr@2: // void f() { std::cout << n << ' '; } williamr@2: // williamr@2: // template williamr@2: // void g() { std::cout << typeid(T).name() << ' '; } williamr@2: // williamr@2: // int main() { williamr@2: // f<1>(); williamr@2: // f<2>(); williamr@2: // williamr@2: // g(); williamr@2: // g(); williamr@2: // } williamr@2: // williamr@2: // With VC++ 6.0 the output is: williamr@2: // williamr@2: // 2 2 double double williamr@2: // williamr@2: // To fix it, write williamr@2: // williamr@2: // template williamr@2: // void f(BOOST_EXPLICIT_TEMPLATE_NON_TYPE(int, n)) { ... } williamr@2: // williamr@2: // template williamr@2: // void g(BOOST_EXPLICIT_TEMPLATE_TYPE(T)) { ... } williamr@2: // williamr@2: williamr@2: williamr@2: #if defined BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS williamr@2: williamr@2: # include "boost/type.hpp" williamr@2: # include "boost/non_type.hpp" williamr@2: williamr@2: # define BOOST_EXPLICIT_TEMPLATE_TYPE(t) boost::type* = 0 williamr@2: # define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t) boost::type* williamr@2: # define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v) boost::non_type* = 0 williamr@2: # define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) boost::non_type* williamr@2: williamr@2: # define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t) \ williamr@2: , BOOST_EXPLICIT_TEMPLATE_TYPE(t) williamr@2: # define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t) \ williamr@2: , BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t) williamr@2: # define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v) \ williamr@2: , BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v) williamr@2: # define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) \ williamr@2: , BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) williamr@2: williamr@2: #else williamr@2: williamr@2: // no workaround needed: expand to nothing williamr@2: williamr@2: # define BOOST_EXPLICIT_TEMPLATE_TYPE(t) williamr@2: # define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t) williamr@2: # define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v) williamr@2: # define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) williamr@2: williamr@2: # define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t) williamr@2: # define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t) williamr@2: # define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v) williamr@2: # define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v) williamr@2: williamr@2: williamr@2: #endif // defined BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS williamr@2: williamr@2: williamr@2: // ---------------------------------------------------------------------------// williamr@2: williamr@2: // williamr@2: // Helper macro BOOST_STRINGIZE: williamr@2: // Converts the parameter X to a string after macro replacement williamr@2: // on X has been performed. williamr@2: // williamr@2: #define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X) williamr@2: #define BOOST_DO_STRINGIZE(X) #X williamr@2: williamr@2: // williamr@2: // Helper macro BOOST_JOIN: williamr@2: // The following piece of macro magic joins the two williamr@2: // arguments together, even when one of the arguments is williamr@2: // itself a macro (see 16.3.1 in C++ standard). The key williamr@2: // is that macro expansion of macro arguments does not williamr@2: // occur in BOOST_DO_JOIN2 but does in BOOST_DO_JOIN. williamr@2: // williamr@2: #define BOOST_JOIN( X, Y ) BOOST_DO_JOIN( X, Y ) williamr@2: #define BOOST_DO_JOIN( X, Y ) BOOST_DO_JOIN2(X,Y) williamr@2: #define BOOST_DO_JOIN2( X, Y ) X##Y williamr@2: williamr@2: // williamr@2: // Set some default values for compiler/library/platform names. williamr@2: // These are for debugging config setup only: williamr@2: // williamr@2: # ifndef BOOST_COMPILER williamr@2: # define BOOST_COMPILER "Unknown ISO C++ Compiler" williamr@2: # endif williamr@2: # ifndef BOOST_STDLIB williamr@2: # define BOOST_STDLIB "Unknown ISO standard library" williamr@2: # endif williamr@2: # ifndef BOOST_PLATFORM williamr@2: # if defined(unix) || defined(__unix) || defined(_XOPEN_SOURCE) \ williamr@2: || defined(_POSIX_SOURCE) williamr@2: # define BOOST_PLATFORM "Generic Unix" williamr@2: # else williamr@2: # define BOOST_PLATFORM "Unknown" williamr@2: # endif williamr@2: # endif williamr@2: williamr@2: #endif williamr@2: williamr@2: williamr@2: williamr@2: