Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/boost/config/suffix.hpp @ 29

Last change on this file since 29 was 29, checked in by landauf, 17 years ago

updated boost from 1_33_1 to 1_34_1

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