]> AND Private Git Repository - canny.git/blob - stc/exp/ml_stc_linux_make_v1.0/include/boost/config/suffix.hpp
Logo AND Algorithmique Numérique Distribuée

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