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