1
// Copyright David Abrahams 2002.
2
// Distributed under the Boost Software License, Version 1.0. (See
3
// accompanying file LICENSE_1_0.txt or copy at
4
// http://www.boost.org/LICENSE_1_0.txt)
5
#ifndef WORKAROUND_DWA2002126_HPP
6
# define WORKAROUND_DWA2002126_HPP
8
// Compiler/library version workaround macro
12
// #if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
13
// // workaround for eVC4 and VC6
14
// ... // workaround code here
17
// When BOOST_STRICT_CONFIG is defined, expands to 0. Otherwise, the
18
// first argument must be undefined or expand to a numeric
19
// value. The above expands to:
21
// (BOOST_MSVC) != 0 && (BOOST_MSVC) < 1300
23
// When used for workarounds that apply to the latest known version
24
// and all earlier versions of a compiler, the following convention
25
// should be observed:
27
// #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1301))
29
// The version number in this case corresponds to the last version in
30
// which the workaround was known to have been required. When
31
// BOOST_DETECT_OUTDATED_WORKAROUNDS is not the defined, the macro
32
// BOOST_TESTED_AT(x) expands to "!= 0", which effectively activates
33
// the workaround for any version of the compiler. When
34
// BOOST_DETECT_OUTDATED_WORKAROUNDS is defined, a compiler warning or
35
// error will be issued if the compiler version exceeds the argument
36
// to BOOST_TESTED_AT(). This can be used to locate workarounds which
37
// may be obsoleted by newer versions.
39
# ifndef BOOST_STRICT_CONFIG
41
#include <boost/config.hpp>
44
#define __BORLANDC___WORKAROUND_GUARD 1
46
#define __BORLANDC___WORKAROUND_GUARD 0
49
#define __MSC_VER_WORKAROUND_GUARD 1
51
#define __MSC_VER_WORKAROUND_GUARD 0
54
#define _MSC_FULL_VER_WORKAROUND_GUARD 1
56
#define _MSC_FULL_VER_WORKAROUND_GUARD 0
59
#define BOOST_MSVC_WORKAROUND_GUARD 1
61
#define BOOST_MSVC_WORKAROUND_GUARD 0
64
#define __GNUC___WORKAROUND_GUARD 1
66
#define __GNUC___WORKAROUND_GUARD 0
68
#ifndef __GNUC_MINOR__
69
#define __GNUC_MINOR___WORKAROUND_GUARD 1
71
#define __GNUC_MINOR___WORKAROUND_GUARD 0
73
#ifndef __GNUC_PATCHLEVEL__
74
#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 1
76
#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 0
79
#define __IBMCPP___WORKAROUND_GUARD 1
81
#define __IBMCPP___WORKAROUND_GUARD 0
84
#define __SUNPRO_CC_WORKAROUND_GUARD 1
86
#define __SUNPRO_CC_WORKAROUND_GUARD 0
89
#define __DECCXX_VER_WORKAROUND_GUARD 1
91
#define __DECCXX_VER_WORKAROUND_GUARD 0
94
#define __MWERKS___WORKAROUND_GUARD 1
96
#define __MWERKS___WORKAROUND_GUARD 0
98
#ifndef __EDG_VERSION__
99
#define __EDG_VERSION___WORKAROUND_GUARD 1
101
#define __EDG_VERSION___WORKAROUND_GUARD 0
104
#define __HP_aCC_WORKAROUND_GUARD 1
106
#define __HP_aCC_WORKAROUND_GUARD 0
109
#define _CRAYC_WORKAROUND_GUARD 1
111
#define _CRAYC_WORKAROUND_GUARD 0
114
#define __DMC___WORKAROUND_GUARD 1
116
#define __DMC___WORKAROUND_GUARD 0
119
#define MPW_CPLUS_WORKAROUND_GUARD 1
121
#define MPW_CPLUS_WORKAROUND_GUARD 0
125
#define _RWSTD_VER_WORKAROUND_GUARD 1
127
#define _RWSTD_VER_WORKAROUND_GUARD 0
129
#ifndef _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
130
#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 1
132
#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 0
134
#ifndef __SGI_STL_PORT
135
#define __SGI_STL_PORT_WORKAROUND_GUARD 1
137
#define __SGI_STL_PORT_WORKAROUND_GUARD 0
139
#ifndef _STLPORT_VERSION
140
#define _STLPORT_VERSION_WORKAROUND_GUARD 1
142
#define _STLPORT_VERSION_WORKAROUND_GUARD 0
145
#ifndef BOOST_INTEL_CXX_VERSION
146
#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 1
148
#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 0
150
#ifndef BOOST_INTEL_WIN
151
#define BOOST_INTEL_WIN_WORKAROUND_GUARD 1
153
#define BOOST_INTEL_WIN_WORKAROUND_GUARD 0
155
#ifndef BOOST_DINKUMWARE_STDLIB
156
#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 1
158
#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 0
161
#define BOOST_INTEL_WORKAROUND_GUARD 1
163
#define BOOST_INTEL_WORKAROUND_GUARD 0
165
// Always define to zero, if it's used it'll be defined my MPL:
166
#define BOOST_MPL_CFG_GCC_WORKAROUND_GUARD 0
168
# define BOOST_WORKAROUND(symbol, test) \
169
((symbol ## _WORKAROUND_GUARD + 0 == 0) && \
170
(symbol != 0) && (1 % (( (symbol test) ) + 1)))
172
// The extra level of parenthesis nesting above, along with the
173
// BOOST_OPEN_PAREN indirection below, is required to satisfy the
174
// broken preprocessor in MWCW 8.3 and earlier.
176
// The basic mechanism works as follows:
177
// (symbol test) + 1 => if (symbol test) then 2 else 1
178
// 1 % ((symbol test) + 1) => if (symbol test) then 1 else 0
180
// The complication with % is for cooperation with BOOST_TESTED_AT().
181
// When "test" is BOOST_TESTED_AT(x) and
182
// BOOST_DETECT_OUTDATED_WORKAROUNDS is #defined,
184
// symbol test => if (symbol <= x) then 1 else -1
185
// (symbol test) + 1 => if (symbol <= x) then 2 else 0
186
// 1 % ((symbol test) + 1) => if (symbol <= x) then 1 else divide-by-zero
189
# ifdef BOOST_DETECT_OUTDATED_WORKAROUNDS
190
# define BOOST_OPEN_PAREN (
191
# define BOOST_TESTED_AT(value) > value) ?(-1): BOOST_OPEN_PAREN 1
193
# define BOOST_TESTED_AT(value) != ((value)-(value))
198
# define BOOST_WORKAROUND(symbol, test) 0
202
#endif // WORKAROUND_DWA2002126_HPP