blob: 9f89029a8ef3364cba87a5c5749c7f2e5f51ff1f [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
Jeff Thompsona28eed82013-08-22 16:21:10 -0700644 // Clang also defines __GNUC__ (as 4)
645# define BOOST_FORCEINLINE inline __attribute__ ((__always_inline__))
Jeff Thompsonf7d49942013-08-01 16:47:40 -0700646# else
647# define BOOST_FORCEINLINE inline
648# endif
649#endif
650
651//
652// Set BOOST_NO_DECLTYPE_N3276 when BOOST_NO_DECLTYPE is defined
653//
654#if defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)
655#define BOOST_NO_CXX11_DECLTYPE_N3276 BOOST_NO_CXX11_DECLTYPE
656#endif
657
658// -------------------- Deprecated macros for 1.50 ---------------------------
659// These will go away in a future release
660
661// Use BOOST_NO_CXX11_HDR_UNORDERED_SET or BOOST_NO_CXX11_HDR_UNORDERED_MAP
662// instead of BOOST_NO_STD_UNORDERED
663#if defined(BOOST_NO_CXX11_HDR_UNORDERED_MAP) || defined (BOOST_NO_CXX11_HDR_UNORDERED_SET)
664# ifndef BOOST_NO_CXX11_STD_UNORDERED
665# define BOOST_NO_CXX11_STD_UNORDERED
666# endif
667#endif
668
669// Use BOOST_NO_CXX11_HDR_INITIALIZER_LIST instead of BOOST_NO_INITIALIZER_LISTS
670#if defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_INITIALIZER_LISTS)
671# define BOOST_NO_INITIALIZER_LISTS
672#endif
673
674// Use BOOST_NO_CXX11_HDR_ARRAY instead of BOOST_NO_0X_HDR_ARRAY
Jeff Thompsona28eed82013-08-22 16:21:10 -0700675#if defined(BOOST_NO_CXX11_HDR_ARRAY) && !defined(BOOST_NO_0X_HDR_ARRAY)
Jeff Thompsonf7d49942013-08-01 16:47:40 -0700676# define BOOST_NO_0X_HDR_ARRAY
677#endif
678// Use BOOST_NO_CXX11_HDR_CHRONO instead of BOOST_NO_0X_HDR_CHRONO
679#if defined(BOOST_NO_CXX11_HDR_CHRONO) && !defined(BOOST_NO_0X_HDR_CHRONO)
680# define BOOST_NO_0X_HDR_CHRONO
681#endif
682// Use BOOST_NO_CXX11_HDR_CODECVT instead of BOOST_NO_0X_HDR_CODECVT
683#if defined(BOOST_NO_CXX11_HDR_CODECVT) && !defined(BOOST_NO_0X_HDR_CODECVT)
684# define BOOST_NO_0X_HDR_CODECVT
685#endif
686// Use BOOST_NO_CXX11_HDR_CONDITION_VARIABLE instead of BOOST_NO_0X_HDR_CONDITION_VARIABLE
687#if defined(BOOST_NO_CXX11_HDR_CONDITION_VARIABLE) && !defined(BOOST_NO_0X_HDR_CONDITION_VARIABLE)
688# define BOOST_NO_0X_HDR_CONDITION_VARIABLE
689#endif
690// Use BOOST_NO_CXX11_HDR_FORWARD_LIST instead of BOOST_NO_0X_HDR_FORWARD_LIST
691#if defined(BOOST_NO_CXX11_HDR_FORWARD_LIST) && !defined(BOOST_NO_0X_HDR_FORWARD_LIST)
692# define BOOST_NO_0X_HDR_FORWARD_LIST
693#endif
694// Use BOOST_NO_CXX11_HDR_FUTURE instead of BOOST_NO_0X_HDR_FUTURE
695#if defined(BOOST_NO_CXX11_HDR_FUTURE) && !defined(BOOST_NO_0X_HDR_FUTURE)
696# define BOOST_NO_0X_HDR_FUTURE
697#endif
698
699// Use BOOST_NO_CXX11_HDR_INITIALIZER_LIST
700// instead of BOOST_NO_0X_HDR_INITIALIZER_LIST or BOOST_NO_INITIALIZER_LISTS
701#ifdef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
702# ifndef BOOST_NO_0X_HDR_INITIALIZER_LIST
703# define BOOST_NO_0X_HDR_INITIALIZER_LIST
704# endif
705# ifndef BOOST_NO_INITIALIZER_LISTS
706# define BOOST_NO_INITIALIZER_LISTS
707# endif
708#endif
709
710// Use BOOST_NO_CXX11_HDR_MUTEX instead of BOOST_NO_0X_HDR_MUTEX
711#if defined(BOOST_NO_CXX11_HDR_MUTEX) && !defined(BOOST_NO_0X_HDR_MUTEX)
712# define BOOST_NO_0X_HDR_MUTEX
713#endif
714// Use BOOST_NO_CXX11_HDR_RANDOM instead of BOOST_NO_0X_HDR_RANDOM
715#if defined(BOOST_NO_CXX11_HDR_RANDOM) && !defined(BOOST_NO_0X_HDR_RANDOM)
716# define BOOST_NO_0X_HDR_RANDOM
717#endif
718// Use BOOST_NO_CXX11_HDR_RATIO instead of BOOST_NO_0X_HDR_RATIO
719#if defined(BOOST_NO_CXX11_HDR_RATIO) && !defined(BOOST_NO_0X_HDR_RATIO)
720# define BOOST_NO_0X_HDR_RATIO
721#endif
722// Use BOOST_NO_CXX11_HDR_REGEX instead of BOOST_NO_0X_HDR_REGEX
723#if defined(BOOST_NO_CXX11_HDR_REGEX) && !defined(BOOST_NO_0X_HDR_REGEX)
724# define BOOST_NO_0X_HDR_REGEX
725#endif
726// Use BOOST_NO_CXX11_HDR_SYSTEM_ERROR instead of BOOST_NO_0X_HDR_SYSTEM_ERROR
727#if defined(BOOST_NO_CXX11_HDR_SYSTEM_ERROR) && !defined(BOOST_NO_0X_HDR_SYSTEM_ERROR)
728# define BOOST_NO_0X_HDR_SYSTEM_ERROR
729#endif
730// Use BOOST_NO_CXX11_HDR_THREAD instead of BOOST_NO_0X_HDR_THREAD
731#if defined(BOOST_NO_CXX11_HDR_THREAD) && !defined(BOOST_NO_0X_HDR_THREAD)
732# define BOOST_NO_0X_HDR_THREAD
733#endif
734// Use BOOST_NO_CXX11_HDR_TUPLE instead of BOOST_NO_0X_HDR_TUPLE
735#if defined(BOOST_NO_CXX11_HDR_TUPLE) && !defined(BOOST_NO_0X_HDR_TUPLE)
736# define BOOST_NO_0X_HDR_TUPLE
737#endif
738// Use BOOST_NO_CXX11_HDR_TYPE_TRAITS instead of BOOST_NO_0X_HDR_TYPE_TRAITS
739#if defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) && !defined(BOOST_NO_0X_HDR_TYPE_TRAITS)
740# define BOOST_NO_0X_HDR_TYPE_TRAITS
741#endif
742// Use BOOST_NO_CXX11_HDR_TYPEINDEX instead of BOOST_NO_0X_HDR_TYPEINDEX
743#if defined(BOOST_NO_CXX11_HDR_TYPEINDEX) && !defined(BOOST_NO_0X_HDR_TYPEINDEX)
744# define BOOST_NO_0X_HDR_TYPEINDEX
745#endif
746// Use BOOST_NO_CXX11_HDR_UNORDERED_MAP instead of BOOST_NO_0X_HDR_UNORDERED_MAP
747#if defined(BOOST_NO_CXX11_HDR_UNORDERED_MAP) && !defined(BOOST_NO_0X_HDR_UNORDERED_MAP)
748# define BOOST_NO_0X_HDR_UNORDERED_MAP
749#endif
750// Use BOOST_NO_CXX11_HDR_UNORDERED_SET instead of BOOST_NO_0X_HDR_UNORDERED_SET
751#if defined(BOOST_NO_CXX11_HDR_UNORDERED_SET) && !defined(BOOST_NO_0X_HDR_UNORDERED_SET)
752# define BOOST_NO_0X_HDR_UNORDERED_SET
753#endif
754
755// ------------------ End of deprecated macros for 1.50 ---------------------------
756
757// -------------------- Deprecated macros for 1.51 ---------------------------
758// These will go away in a future release
759
760// Use BOOST_NO_CXX11_AUTO_DECLARATIONS instead of BOOST_NO_AUTO_DECLARATIONS
761#if defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && !defined(BOOST_NO_AUTO_DECLARATIONS)
762# define BOOST_NO_AUTO_DECLARATIONS
763#endif
764// Use BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS instead of BOOST_NO_AUTO_MULTIDECLARATIONS
765#if defined(BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS) && !defined(BOOST_NO_AUTO_MULTIDECLARATIONS)
766# define BOOST_NO_AUTO_MULTIDECLARATIONS
767#endif
768// Use BOOST_NO_CXX11_CHAR16_T instead of BOOST_NO_CHAR16_T
769#if defined(BOOST_NO_CXX11_CHAR16_T) && !defined(BOOST_NO_CHAR16_T)
770# define BOOST_NO_CHAR16_T
771#endif
772// Use BOOST_NO_CXX11_CHAR32_T instead of BOOST_NO_CHAR32_T
773#if defined(BOOST_NO_CXX11_CHAR32_T) && !defined(BOOST_NO_CHAR32_T)
774# define BOOST_NO_CHAR32_T
775#endif
776// Use BOOST_NO_CXX11_TEMPLATE_ALIASES instead of BOOST_NO_TEMPLATE_ALIASES
777#if defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) && !defined(BOOST_NO_TEMPLATE_ALIASES)
778# define BOOST_NO_TEMPLATE_ALIASES
779#endif
780// Use BOOST_NO_CXX11_CONSTEXPR instead of BOOST_NO_CONSTEXPR
781#if defined(BOOST_NO_CXX11_CONSTEXPR) && !defined(BOOST_NO_CONSTEXPR)
782# define BOOST_NO_CONSTEXPR
783#endif
784// Use BOOST_NO_CXX11_DECLTYPE_N3276 instead of BOOST_NO_DECLTYPE_N3276
785#if defined(BOOST_NO_CXX11_DECLTYPE_N3276) && !defined(BOOST_NO_DECLTYPE_N3276)
786# define BOOST_NO_DECLTYPE_N3276
787#endif
788// Use BOOST_NO_CXX11_DECLTYPE instead of BOOST_NO_DECLTYPE
789#if defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_DECLTYPE)
790# define BOOST_NO_DECLTYPE
791#endif
792// Use BOOST_NO_CXX11_DEFAULTED_FUNCTIONS instead of BOOST_NO_DEFAULTED_FUNCTIONS
793#if defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_DEFAULTED_FUNCTIONS)
794# define BOOST_NO_DEFAULTED_FUNCTIONS
795#endif
796// Use BOOST_NO_CXX11_DELETED_FUNCTIONS instead of BOOST_NO_DELETED_FUNCTIONS
797#if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(BOOST_NO_DELETED_FUNCTIONS)
798# define BOOST_NO_DELETED_FUNCTIONS
799#endif
800// Use BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS instead of BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
801#if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS) && !defined(BOOST_NO_EXPLICIT_CONVERSION_OPERATORS)
802# define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
803#endif
804// Use BOOST_NO_CXX11_EXTERN_TEMPLATE instead of BOOST_NO_EXTERN_TEMPLATE
805#if defined(BOOST_NO_CXX11_EXTERN_TEMPLATE) && !defined(BOOST_NO_EXTERN_TEMPLATE)
806# define BOOST_NO_EXTERN_TEMPLATE
807#endif
808// Use BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS instead of BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
809#if defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) && !defined(BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS)
810# define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
811#endif
812// Use BOOST_NO_CXX11_LAMBDAS instead of BOOST_NO_LAMBDAS
813#if defined(BOOST_NO_CXX11_LAMBDAS) && !defined(BOOST_NO_LAMBDAS)
814# define BOOST_NO_LAMBDAS
815#endif
816// Use BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS instead of BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS
817#if defined(BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS) && !defined(BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS)
818# define BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS
819#endif
820// Use BOOST_NO_CXX11_NOEXCEPT instead of BOOST_NO_NOEXCEPT
821#if defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_NOEXCEPT)
822# define BOOST_NO_NOEXCEPT
823#endif
824// Use BOOST_NO_CXX11_NULLPTR instead of BOOST_NO_NULLPTR
825#if defined(BOOST_NO_CXX11_NULLPTR) && !defined(BOOST_NO_NULLPTR)
826# define BOOST_NO_NULLPTR
827#endif
828// Use BOOST_NO_CXX11_RAW_LITERALS instead of BOOST_NO_RAW_LITERALS
829#if defined(BOOST_NO_CXX11_RAW_LITERALS) && !defined(BOOST_NO_RAW_LITERALS)
830# define BOOST_NO_RAW_LITERALS
831#endif
832// Use BOOST_NO_CXX11_RVALUE_REFERENCES instead of BOOST_NO_RVALUE_REFERENCES
833#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_RVALUE_REFERENCES)
834# define BOOST_NO_RVALUE_REFERENCES
835#endif
836// Use BOOST_NO_CXX11_SCOPED_ENUMS instead of BOOST_NO_SCOPED_ENUMS
837#if defined(BOOST_NO_CXX11_SCOPED_ENUMS) && !defined(BOOST_NO_SCOPED_ENUMS)
838# define BOOST_NO_SCOPED_ENUMS
839#endif
840// Use BOOST_NO_CXX11_STATIC_ASSERT instead of BOOST_NO_STATIC_ASSERT
841#if defined(BOOST_NO_CXX11_STATIC_ASSERT) && !defined(BOOST_NO_STATIC_ASSERT)
842# define BOOST_NO_STATIC_ASSERT
843#endif
844// Use BOOST_NO_CXX11_STD_UNORDERED instead of BOOST_NO_STD_UNORDERED
845#if defined(BOOST_NO_CXX11_STD_UNORDERED) && !defined(BOOST_NO_STD_UNORDERED)
846# define BOOST_NO_STD_UNORDERED
847#endif
848// Use BOOST_NO_CXX11_UNICODE_LITERALS instead of BOOST_NO_UNICODE_LITERALS
849#if defined(BOOST_NO_CXX11_UNICODE_LITERALS) && !defined(BOOST_NO_UNICODE_LITERALS)
850# define BOOST_NO_UNICODE_LITERALS
851#endif
852// Use BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX instead of BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX
853#if defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) && !defined(BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX)
854# define BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX
855#endif
856// Use BOOST_NO_CXX11_VARIADIC_TEMPLATES instead of BOOST_NO_VARIADIC_TEMPLATES
857#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_VARIADIC_TEMPLATES)
858# define BOOST_NO_VARIADIC_TEMPLATES
859#endif
860// Use BOOST_NO_CXX11_VARIADIC_MACROS instead of BOOST_NO_VARIADIC_MACROS
861#if defined(BOOST_NO_CXX11_VARIADIC_MACROS) && !defined(BOOST_NO_VARIADIC_MACROS)
862# define BOOST_NO_VARIADIC_MACROS
863#endif
864// Use BOOST_NO_CXX11_NUMERIC_LIMITS instead of BOOST_NO_NUMERIC_LIMITS_LOWEST
865#if defined(BOOST_NO_CXX11_NUMERIC_LIMITS) && !defined(BOOST_NO_NUMERIC_LIMITS_LOWEST)
866# define BOOST_NO_NUMERIC_LIMITS_LOWEST
867#endif
868// ------------------ End of deprecated macros for 1.51 ---------------------------
869
870
871
872//
873// Helper macros BOOST_NOEXCEPT, BOOST_NOEXCEPT_IF, BOOST_NOEXCEPT_EXPR
874// These aid the transition to C++11 while still supporting C++03 compilers
875//
876#ifdef BOOST_NO_CXX11_NOEXCEPT
877# define BOOST_NOEXCEPT
Jeff Thompsona28eed82013-08-22 16:21:10 -0700878# define BOOST_NOEXCEPT_OR_NOTHROW throw()
Jeff Thompsonf7d49942013-08-01 16:47:40 -0700879# define BOOST_NOEXCEPT_IF(Predicate)
880# define BOOST_NOEXCEPT_EXPR(Expression) false
881#else
882# define BOOST_NOEXCEPT noexcept
Jeff Thompsona28eed82013-08-22 16:21:10 -0700883# define BOOST_NOEXCEPT_OR_NOTHROW noexcept
Jeff Thompsonf7d49942013-08-01 16:47:40 -0700884# define BOOST_NOEXCEPT_IF(Predicate) noexcept((Predicate))
885# define BOOST_NOEXCEPT_EXPR(Expression) noexcept((Expression))
886#endif
Jeff Thompsona28eed82013-08-22 16:21:10 -0700887//
888// Helper macro BOOST_FALLTHROUGH
889// Fallback definition of BOOST_FALLTHROUGH macro used to mark intended
890// fall-through between case labels in a switch statement. We use a definition
891// that requires a semicolon after it to avoid at least one type of misuse even
892// on unsupported compilers.
893//
894#ifndef BOOST_FALLTHROUGH
895# define BOOST_FALLTHROUGH ((void)0)
896#endif
Jeff Thompsonf7d49942013-08-01 16:47:40 -0700897
898//
899// constexpr workarounds
900//
901#if defined(BOOST_NO_CXX11_CONSTEXPR)
902#define BOOST_CONSTEXPR
903#define BOOST_CONSTEXPR_OR_CONST const
904#else
905#define BOOST_CONSTEXPR constexpr
906#define BOOST_CONSTEXPR_OR_CONST constexpr
907#endif
908
909#define BOOST_STATIC_CONSTEXPR static BOOST_CONSTEXPR_OR_CONST
910
911//
912// Set BOOST_HAS_STATIC_ASSERT when BOOST_NO_CXX11_STATIC_ASSERT is not defined
913//
914#if !defined(BOOST_NO_CXX11_STATIC_ASSERT) && !defined(BOOST_HAS_STATIC_ASSERT)
915# define BOOST_HAS_STATIC_ASSERT
916#endif
917
918//
919// Set BOOST_HAS_RVALUE_REFS when BOOST_NO_CXX11_RVALUE_REFERENCES is not defined
920//
921#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_HAS_RVALUE_REFS)
922#define BOOST_HAS_RVALUE_REFS
923#endif
924
925//
926// Set BOOST_HAS_VARIADIC_TMPL when BOOST_NO_CXX11_VARIADIC_TEMPLATES is not defined
927//
928#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_HAS_VARIADIC_TMPL)
929#define BOOST_HAS_VARIADIC_TMPL
930#endif
931
932
933#endif