]> git.donarmstrong.com Git - rsem.git/blob - boost/config/suffix.hpp
3408d22588d1e1cef1a61c1424c70ef254f9c746
[rsem.git] / boost / config / suffix.hpp
1 //  Boost config.hpp configuration header file  ------------------------------//
2
3 //  Copyright (c) 2001-2003 John Maddock
4 //  Copyright (c) 2001 Darin Adler
5 //  Copyright (c) 2001 Peter Dimov
6 //  Copyright (c) 2002 Bill Kempf 
7 //  Copyright (c) 2002 Jens Maurer
8 //  Copyright (c) 2002-2003 David Abrahams
9 //  Copyright (c) 2003 Gennaro Prota
10 //  Copyright (c) 2003 Eric Friedman
11 //  Copyright (c) 2010 Eric Jourdanneau, Joel Falcou
12 // Distributed under the Boost Software License, Version 1.0. (See
13 // accompanying file LICENSE_1_0.txt or copy at
14 // http://www.boost.org/LICENSE_1_0.txt)
15
16 //  See http://www.boost.org/ for most recent version.
17
18 //  Boost config.hpp policy and rationale documentation has been moved to
19 //  http://www.boost.org/libs/config/
20 //
21 //  This file is intended to be stable, and relatively unchanging.
22 //  It should contain boilerplate code only - no compiler specific
23 //  code unless it is unavoidable - no changes unless unavoidable.
24
25 #ifndef BOOST_CONFIG_SUFFIX_HPP
26 #define BOOST_CONFIG_SUFFIX_HPP
27
28 //
29 // ensure that visibility macros are always defined, thus symplifying use
30 //
31 #ifndef BOOST_SYMBOL_EXPORT
32 # define BOOST_SYMBOL_EXPORT
33 #endif
34 #ifndef BOOST_SYMBOL_IMPORT
35 # define BOOST_SYMBOL_IMPORT
36 #endif
37 #ifndef BOOST_SYMBOL_VISIBLE
38 # define BOOST_SYMBOL_VISIBLE
39 #endif
40
41 //
42 // look for long long by looking for the appropriate macros in <limits.h>.
43 // Note that we use limits.h rather than climits for maximal portability,
44 // remember that since these just declare a bunch of macros, there should be
45 // no namespace issues from this.
46 //
47 #if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG)                                              \
48    && !defined(BOOST_MSVC) && !defined(__BORLANDC__)
49 # include <limits.h>
50 # if (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX))
51 #   define BOOST_HAS_LONG_LONG
52 # else
53 #   define BOOST_NO_LONG_LONG
54 # endif
55 #endif
56
57 // GCC 3.x will clean up all of those nasty macro definitions that
58 // BOOST_NO_CTYPE_FUNCTIONS is intended to help work around, so undefine
59 // it under GCC 3.x.
60 #if defined(__GNUC__) && (__GNUC__ >= 3) && defined(BOOST_NO_CTYPE_FUNCTIONS)
61 #  undef BOOST_NO_CTYPE_FUNCTIONS
62 #endif
63
64 //
65 // Assume any extensions are in namespace std:: unless stated otherwise:
66 //
67 #  ifndef BOOST_STD_EXTENSION_NAMESPACE
68 #    define BOOST_STD_EXTENSION_NAMESPACE std
69 #  endif
70
71 //
72 // If cv-qualified specializations are not allowed, then neither are cv-void ones:
73 //
74 #  if defined(BOOST_NO_CV_SPECIALIZATIONS) \
75       && !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS)
76 #     define BOOST_NO_CV_VOID_SPECIALIZATIONS
77 #  endif
78
79 //
80 // If there is no numeric_limits template, then it can't have any compile time
81 // constants either!
82 //
83 #  if defined(BOOST_NO_LIMITS) \
84       && !defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS)
85 #     define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
86 #     define BOOST_NO_MS_INT64_NUMERIC_LIMITS
87 #     define BOOST_NO_LONG_LONG_NUMERIC_LIMITS
88 #  endif
89
90 //
91 // if there is no long long then there is no specialisation
92 // for numeric_limits<long long> either:
93 //
94 #if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG_NUMERIC_LIMITS)
95 #  define BOOST_NO_LONG_LONG_NUMERIC_LIMITS
96 #endif
97
98 //
99 // Normalize BOOST_NO_STATIC_ASSERT and (depricated) BOOST_HAS_STATIC_ASSERT:
100 //
101 #if !defined(BOOST_NO_STATIC_ASSERT) && !defined(BOOST_HAS_STATIC_ASSERT)
102 #  define BOOST_HAS_STATIC_ASSERT
103 #endif
104
105 //
106 // if there is no __int64 then there is no specialisation
107 // for numeric_limits<__int64> either:
108 //
109 #if !defined(BOOST_HAS_MS_INT64) && !defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS)
110 #  define BOOST_NO_MS_INT64_NUMERIC_LIMITS
111 #endif
112
113 //
114 // if member templates are supported then so is the
115 // VC6 subset of member templates:
116 //
117 #  if !defined(BOOST_NO_MEMBER_TEMPLATES) \
118        && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
119 #     define BOOST_MSVC6_MEMBER_TEMPLATES
120 #  endif
121
122 //
123 // Without partial specialization, can't test for partial specialisation bugs:
124 //
125 #  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
126       && !defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG)
127 #     define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG
128 #  endif
129
130 //
131 // Without partial specialization, we can't have array-type partial specialisations:
132 //
133 #  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
134       && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
135 #     define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS
136 #  endif
137
138 //
139 // Without partial specialization, std::iterator_traits can't work:
140 //
141 #  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
142       && !defined(BOOST_NO_STD_ITERATOR_TRAITS)
143 #     define BOOST_NO_STD_ITERATOR_TRAITS
144 #  endif
145
146 //
147 // Without partial specialization, partial 
148 // specialization with default args won't work either:
149 //
150 #  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
151       && !defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS)
152 #     define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS
153 #  endif
154
155 //
156 // Without member template support, we can't have template constructors
157 // in the standard library either:
158 //
159 #  if defined(BOOST_NO_MEMBER_TEMPLATES) \
160       && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \
161       && !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
162 #     define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
163 #  endif
164
165 //
166 // Without member template support, we can't have a conforming
167 // std::allocator template either:
168 //
169 #  if defined(BOOST_NO_MEMBER_TEMPLATES) \
170       && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \
171       && !defined(BOOST_NO_STD_ALLOCATOR)
172 #     define BOOST_NO_STD_ALLOCATOR
173 #  endif
174
175 //
176 // without ADL support then using declarations will break ADL as well:
177 //
178 #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)
179 #  define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
180 #endif
181
182 //
183 // Without typeid support we have no dynamic RTTI either:
184 //
185 #if defined(BOOST_NO_TYPEID) && !defined(BOOST_NO_RTTI)
186 #  define BOOST_NO_RTTI
187 #endif
188
189 //
190 // If we have a standard allocator, then we have a partial one as well:
191 //
192 #if !defined(BOOST_NO_STD_ALLOCATOR)
193 #  define BOOST_HAS_PARTIAL_STD_ALLOCATOR
194 #endif
195
196 //
197 // We can't have a working std::use_facet if there is no std::locale:
198 //
199 #  if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_USE_FACET)
200 #     define BOOST_NO_STD_USE_FACET
201 #  endif
202
203 //
204 // We can't have a std::messages facet if there is no std::locale:
205 //
206 #  if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_MESSAGES)
207 #     define BOOST_NO_STD_MESSAGES
208 #  endif
209
210 //
211 // We can't have a working std::wstreambuf if there is no std::locale:
212 //
213 #  if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_WSTREAMBUF)
214 #     define BOOST_NO_STD_WSTREAMBUF
215 #  endif
216
217 //
218 // We can't have a <cwctype> if there is no <cwchar>:
219 //
220 #  if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_CWCTYPE)
221 #     define BOOST_NO_CWCTYPE
222 #  endif
223
224 //
225 // We can't have a swprintf if there is no <cwchar>:
226 //
227 #  if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_SWPRINTF)
228 #     define BOOST_NO_SWPRINTF
229 #  endif
230
231 //
232 // If Win32 support is turned off, then we must turn off
233 // threading support also, unless there is some other
234 // thread API enabled:
235 //
236 #if defined(BOOST_DISABLE_WIN32) && defined(_WIN32) \
237    && !defined(BOOST_DISABLE_THREADS) && !defined(BOOST_HAS_PTHREADS)
238 #  define BOOST_DISABLE_THREADS
239 #endif
240
241 //
242 // Turn on threading support if the compiler thinks that it's in
243 // multithreaded mode.  We put this here because there are only a
244 // limited number of macros that identify this (if there's any missing
245 // from here then add to the appropriate compiler section):
246 //
247 #if (defined(__MT__) || defined(_MT) || defined(_REENTRANT) \
248     || defined(_PTHREADS) || defined(__APPLE__) || defined(__DragonFly__)) \
249     && !defined(BOOST_HAS_THREADS)
250 #  define BOOST_HAS_THREADS
251 #endif
252
253 //
254 // Turn threading support off if BOOST_DISABLE_THREADS is defined:
255 //
256 #if defined(BOOST_DISABLE_THREADS) && defined(BOOST_HAS_THREADS)
257 #  undef BOOST_HAS_THREADS
258 #endif
259
260 //
261 // Turn threading support off if we don't recognise the threading API:
262 //
263 #if defined(BOOST_HAS_THREADS) && !defined(BOOST_HAS_PTHREADS)\
264       && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_BETHREADS)\
265       && !defined(BOOST_HAS_MPTASKS)
266 #  undef BOOST_HAS_THREADS
267 #endif
268
269 //
270 // Turn threading detail macros off if we don't (want to) use threading
271 //
272 #ifndef BOOST_HAS_THREADS
273 #  undef BOOST_HAS_PTHREADS
274 #  undef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
275 #  undef BOOST_HAS_PTHREAD_YIELD
276 #  undef BOOST_HAS_PTHREAD_DELAY_NP
277 #  undef BOOST_HAS_WINTHREADS
278 #  undef BOOST_HAS_BETHREADS
279 #  undef BOOST_HAS_MPTASKS
280 #endif
281
282 //
283 // If the compiler claims to be C99 conformant, then it had better
284 // have a <stdint.h>:
285 //
286 #  if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
287 #     define BOOST_HAS_STDINT_H
288 #     ifndef BOOST_HAS_LOG1P
289 #        define BOOST_HAS_LOG1P
290 #     endif
291 #     ifndef BOOST_HAS_EXPM1
292 #        define BOOST_HAS_EXPM1
293 #     endif
294 #  endif
295
296 //
297 // Define BOOST_NO_SLIST and BOOST_NO_HASH if required.
298 // Note that this is for backwards compatibility only.
299 //
300 #  if !defined(BOOST_HAS_SLIST) && !defined(BOOST_NO_SLIST)
301 #     define BOOST_NO_SLIST
302 #  endif
303
304 #  if !defined(BOOST_HAS_HASH) && !defined(BOOST_NO_HASH)
305 #     define BOOST_NO_HASH
306 #  endif
307
308 //
309 // Set BOOST_SLIST_HEADER if not set already:
310 //
311 #if defined(BOOST_HAS_SLIST) && !defined(BOOST_SLIST_HEADER)
312 #  define BOOST_SLIST_HEADER <slist>
313 #endif
314
315 //
316 // Set BOOST_HASH_SET_HEADER if not set already:
317 //
318 #if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_SET_HEADER)
319 #  define BOOST_HASH_SET_HEADER <hash_set>
320 #endif
321
322 //
323 // Set BOOST_HASH_MAP_HEADER if not set already:
324 //
325 #if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_MAP_HEADER)
326 #  define BOOST_HASH_MAP_HEADER <hash_map>
327 #endif
328
329 //
330 // Set BOOST_NO_INITIALIZER_LISTS if there is no library support.
331 //
332
333 #if defined(BOOST_NO_0X_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_INITIALIZER_LISTS)
334 #  define BOOST_NO_INITIALIZER_LISTS
335 #endif
336
337 //
338 // Set BOOST_HAS_RVALUE_REFS when BOOST_NO_RVALUE_REFERENCES is not defined
339 //
340 #if !defined(BOOST_NO_RVALUE_REFERENCES) && !defined(BOOST_HAS_RVALUE_REFS)
341 #define BOOST_HAS_RVALUE_REFS
342 #endif
343
344 //  BOOST_HAS_ABI_HEADERS
345 //  This macro gets set if we have headers that fix the ABI,
346 //  and prevent ODR violations when linking to external libraries:
347 #if defined(BOOST_ABI_PREFIX) && defined(BOOST_ABI_SUFFIX) && !defined(BOOST_HAS_ABI_HEADERS)
348 #  define BOOST_HAS_ABI_HEADERS
349 #endif
350
351 #if defined(BOOST_HAS_ABI_HEADERS) && defined(BOOST_DISABLE_ABI_HEADERS)
352 #  undef BOOST_HAS_ABI_HEADERS
353 #endif
354
355 //  BOOST_NO_STDC_NAMESPACE workaround  --------------------------------------//
356 //  Because std::size_t usage is so common, even in boost headers which do not
357 //  otherwise use the C library, the <cstddef> workaround is included here so
358 //  that ugly workaround code need not appear in many other boost headers.
359 //  NOTE WELL: This is a workaround for non-conforming compilers; <cstddef>
360 //  must still be #included in the usual places so that <cstddef> inclusion
361 //  works as expected with standard conforming compilers.  The resulting
362 //  double inclusion of <cstddef> is harmless.
363
364 # ifdef BOOST_NO_STDC_NAMESPACE
365 #   include <cstddef>
366     namespace std { using ::ptrdiff_t; using ::size_t; }
367 # endif
368
369 //  Workaround for the unfortunate min/max macros defined by some platform headers
370
371 #define BOOST_PREVENT_MACRO_SUBSTITUTION
372
373 #ifndef BOOST_USING_STD_MIN
374 #  define BOOST_USING_STD_MIN() using std::min
375 #endif
376
377 #ifndef BOOST_USING_STD_MAX
378 #  define BOOST_USING_STD_MAX() using std::max
379 #endif
380
381 //  BOOST_NO_STD_MIN_MAX workaround  -----------------------------------------//
382
383 #  ifdef BOOST_NO_STD_MIN_MAX
384
385 namespace std {
386   template <class _Tp>
387   inline const _Tp& min BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) {
388     return __b < __a ? __b : __a;
389   }
390   template <class _Tp>
391   inline const _Tp& max BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) {
392     return  __a < __b ? __b : __a;
393   }
394 }
395
396 #  endif
397
398 // BOOST_STATIC_CONSTANT workaround --------------------------------------- //
399 // On compilers which don't allow in-class initialization of static integral
400 // constant members, we must use enums as a workaround if we want the constants
401 // to be available at compile-time. This macro gives us a convenient way to
402 // declare such constants.
403
404 #  ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
405 #       define BOOST_STATIC_CONSTANT(type, assignment) enum { assignment }
406 #  else
407 #     define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment
408 #  endif
409
410 // BOOST_USE_FACET / HAS_FACET workaround ----------------------------------//
411 // When the standard library does not have a conforming std::use_facet there
412 // are various workarounds available, but they differ from library to library.
413 // The same problem occurs with has_facet.
414 // These macros provide a consistent way to access a locale's facets.
415 // Usage:
416 //    replace
417 //       std::use_facet<Type>(loc);
418 //    with
419 //       BOOST_USE_FACET(Type, loc);
420 //    Note do not add a std:: prefix to the front of BOOST_USE_FACET!
421 //  Use for BOOST_HAS_FACET is analogous.
422
423 #if defined(BOOST_NO_STD_USE_FACET)
424 #  ifdef BOOST_HAS_TWO_ARG_USE_FACET
425 #     define BOOST_USE_FACET(Type, loc) std::use_facet(loc, static_cast<Type*>(0))
426 #     define BOOST_HAS_FACET(Type, loc) std::has_facet(loc, static_cast<Type*>(0))
427 #  elif defined(BOOST_HAS_MACRO_USE_FACET)
428 #     define BOOST_USE_FACET(Type, loc) std::_USE(loc, Type)
429 #     define BOOST_HAS_FACET(Type, loc) std::_HAS(loc, Type)
430 #  elif defined(BOOST_HAS_STLP_USE_FACET)
431 #     define BOOST_USE_FACET(Type, loc) (*std::_Use_facet<Type >(loc))
432 #     define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc)
433 #  endif
434 #else
435 #  define BOOST_USE_FACET(Type, loc) std::use_facet< Type >(loc)
436 #  define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc)
437 #endif
438
439 // BOOST_NESTED_TEMPLATE workaround ------------------------------------------//
440 // Member templates are supported by some compilers even though they can't use
441 // the A::template member<U> syntax, as a workaround replace:
442 //
443 // typedef typename A::template rebind<U> binder;
444 //
445 // with:
446 //
447 // typedef typename A::BOOST_NESTED_TEMPLATE rebind<U> binder;
448
449 #ifndef BOOST_NO_MEMBER_TEMPLATE_KEYWORD
450 #  define BOOST_NESTED_TEMPLATE template
451 #else
452 #  define BOOST_NESTED_TEMPLATE
453 #endif
454
455 // BOOST_UNREACHABLE_RETURN(x) workaround -------------------------------------//
456 // Normally evaluates to nothing, unless BOOST_NO_UNREACHABLE_RETURN_DETECTION
457 // is defined, in which case it evaluates to return x; Use when you have a return
458 // statement that can never be reached.
459
460 #ifdef BOOST_NO_UNREACHABLE_RETURN_DETECTION
461 #  define BOOST_UNREACHABLE_RETURN(x) return x;
462 #else
463 #  define BOOST_UNREACHABLE_RETURN(x)
464 #endif
465
466 // BOOST_DEDUCED_TYPENAME workaround ------------------------------------------//
467 //
468 // Some compilers don't support the use of `typename' for dependent
469 // types in deduced contexts, e.g.
470 //
471 //     template <class T> void f(T, typename T::type);
472 //                                  ^^^^^^^^
473 // Replace these declarations with:
474 //
475 //     template <class T> void f(T, BOOST_DEDUCED_TYPENAME T::type);
476
477 #ifndef BOOST_NO_DEDUCED_TYPENAME
478 #  define BOOST_DEDUCED_TYPENAME typename
479 #else
480 #  define BOOST_DEDUCED_TYPENAME
481 #endif
482
483 #ifndef BOOST_NO_TYPENAME_WITH_CTOR
484 #  define BOOST_CTOR_TYPENAME typename
485 #else
486 #  define BOOST_CTOR_TYPENAME
487 #endif
488
489 // long long workaround ------------------------------------------//
490 // On gcc (and maybe other compilers?) long long is alway supported
491 // but it's use may generate either warnings (with -ansi), or errors
492 // (with -pedantic -ansi) unless it's use is prefixed by __extension__
493 //
494 #if defined(BOOST_HAS_LONG_LONG)
495 namespace boost{
496 #  ifdef __GNUC__
497    __extension__ typedef long long long_long_type;
498    __extension__ typedef unsigned long long ulong_long_type;
499 #  else
500    typedef long long long_long_type;
501    typedef unsigned long long ulong_long_type;
502 #  endif
503 }
504 #endif
505
506 // BOOST_[APPEND_]EXPLICIT_TEMPLATE_[NON_]TYPE macros --------------------------//
507 //
508 // Some compilers have problems with function templates whose template
509 // parameters don't appear in the function parameter list (basically
510 // they just link one instantiation of the template in the final
511 // executable). These macros provide a uniform way to cope with the
512 // problem with no effects on the calling syntax.
513
514 // Example:
515 //
516 //  #include <iostream>
517 //  #include <ostream>
518 //  #include <typeinfo>
519 //
520 //  template <int n>
521 //  void f() { std::cout << n << ' '; }
522 //
523 //  template <typename T>
524 //  void g() { std::cout << typeid(T).name() << ' '; }
525 //
526 //  int main() {
527 //    f<1>();
528 //    f<2>();
529 //
530 //    g<int>();
531 //    g<double>();
532 //  }
533 //
534 // With VC++ 6.0 the output is:
535 //
536 //   2 2 double double
537 //
538 // To fix it, write
539 //
540 //   template <int n>
541 //   void f(BOOST_EXPLICIT_TEMPLATE_NON_TYPE(int, n)) { ... }
542 //
543 //   template <typename T>
544 //   void g(BOOST_EXPLICIT_TEMPLATE_TYPE(T)) { ... }
545 //
546
547
548 #if defined BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS
549
550 #  include "boost/type.hpp"
551 #  include "boost/non_type.hpp"
552
553 #  define BOOST_EXPLICIT_TEMPLATE_TYPE(t)              boost::type<t>* = 0
554 #  define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t)         boost::type<t>*
555 #  define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v)       boost::non_type<t, v>* = 0
556 #  define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)  boost::non_type<t, v>*
557
558 #  define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t)        \
559              , BOOST_EXPLICIT_TEMPLATE_TYPE(t)
560 #  define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t)   \
561              , BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t)
562 #  define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v) \
563              , BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v)
564 #  define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)    \
565              , BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)
566
567 #else
568
569 // no workaround needed: expand to nothing
570
571 #  define BOOST_EXPLICIT_TEMPLATE_TYPE(t)
572 #  define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t)
573 #  define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v)
574 #  define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)
575
576 #  define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t)
577 #  define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t)
578 #  define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v)
579 #  define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)
580
581
582 #endif // defined BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS
583
584 // When BOOST_NO_STD_TYPEINFO is defined, we can just import
585 // the global definition into std namespace:
586 #ifdef BOOST_NO_STD_TYPEINFO
587 #include <typeinfo>
588 namespace std{ using ::typeinfo; }
589 #endif
590
591 // ---------------------------------------------------------------------------//
592
593 //
594 // Helper macro BOOST_STRINGIZE:
595 // Converts the parameter X to a string after macro replacement
596 // on X has been performed.
597 //
598 #define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X)
599 #define BOOST_DO_STRINGIZE(X) #X
600
601 //
602 // Helper macro BOOST_JOIN:
603 // The following piece of macro magic joins the two
604 // arguments together, even when one of the arguments is
605 // itself a macro (see 16.3.1 in C++ standard).  The key
606 // is that macro expansion of macro arguments does not
607 // occur in BOOST_DO_JOIN2 but does in BOOST_DO_JOIN.
608 //
609 #define BOOST_JOIN( X, Y ) BOOST_DO_JOIN( X, Y )
610 #define BOOST_DO_JOIN( X, Y ) BOOST_DO_JOIN2(X,Y)
611 #define BOOST_DO_JOIN2( X, Y ) X##Y
612
613 //
614 // Set some default values for compiler/library/platform names.
615 // These are for debugging config setup only:
616 //
617 #  ifndef BOOST_COMPILER
618 #     define BOOST_COMPILER "Unknown ISO C++ Compiler"
619 #  endif
620 #  ifndef BOOST_STDLIB
621 #     define BOOST_STDLIB "Unknown ISO standard library"
622 #  endif
623 #  ifndef BOOST_PLATFORM
624 #     if defined(unix) || defined(__unix) || defined(_XOPEN_SOURCE) \
625          || defined(_POSIX_SOURCE)
626 #        define BOOST_PLATFORM "Generic Unix"
627 #     else
628 #        define BOOST_PLATFORM "Unknown"
629 #     endif
630 #  endif
631
632 //
633 // Set some default values GPU support
634 //
635 #  ifndef BOOST_GPU_ENABLED
636 #  define BOOST_GPU_ENABLED 
637 #  endif
638 #endif
639