btrfs: [] on the end of a struct field is a variable length array.
[haiku.git] / headers / cpp / stl_config.h
blob5c619adf1ad7babee42f4560bc941e64ed29d46f
1 /*
3 * Copyright (c) 1994
4 * Hewlett-Packard Company
6 * Permission to use, copy, modify, distribute and sell this software
7 * and its documentation for any purpose is hereby granted without fee,
8 * provided that the above copyright notice appear in all copies and
9 * that both that copyright notice and this permission notice appear
10 * in supporting documentation. Hewlett-Packard Company makes no
11 * representations about the suitability of this software for any
12 * purpose. It is provided "as is" without express or implied warranty.
14 * Copyright (c) 1997
15 * Silicon Graphics
17 * Permission to use, copy, modify, distribute and sell this software
18 * and its documentation for any purpose is hereby granted without fee,
19 * provided that the above copyright notice appear in all copies and
20 * that both that copyright notice and this permission notice appear
21 * in supporting documentation. Silicon Graphics makes no
22 * representations about the suitability of this software for any
23 * purpose. It is provided "as is" without express or implied warranty.
27 #ifndef __STL_CONFIG_H
28 # define __STL_CONFIG_H
30 // Flags:
31 // * __STL_NO_BOOL: defined if the compiler doesn't have bool as a builtin
32 // type.
33 // * __STL_HAS_WCHAR_T: defined if the compier has wchar_t as a builtin type.
34 // * __STL_NO_DRAND48: defined if the compiler doesn't have the drand48
35 // function.
36 // * __STL_STATIC_TEMPLATE_MEMBER_BUG: defined if the compiler can't handle
37 // static members of template classes.
38 // * __STL_CLASS_PARTIAL_SPECIALIZATION: defined if the compiler supports
39 // partial specialization of template classes.
40 // * __STL_PARTIAL_SPECIALIZATION_SYNTAX: defined if the compiler
41 // supports partial specialization syntax for full specialization of
42 // class templates. (Even if it doesn't actually support partial
43 // specialization itself.)
44 // * __STL_FUNCTION_TMPL_PARTIAL_ORDER: defined if the compiler supports
45 // partial ordering of function templates. (a.k.a partial specialization
46 // of function templates.)
47 // * __STL_MEMBER_TEMPLATES: defined if the compiler supports template
48 // member functions of classes.
49 // * __STL_MEMBER_TEMPLATE_CLASSES: defined if the compiler supports
50 // nested classes that are member templates of other classes.
51 // * __STL_EXPLICIT_FUNCTION_TMPL_ARGS: defined if the compiler
52 // supports calling a function template by providing its template
53 // arguments explicitly.
54 // * __STL_LIMITED_DEFAULT_TEMPLATES: defined if the compiler is unable
55 // to handle default template parameters that depend on previous template
56 // parameters.
57 // * __STL_NON_TYPE_TMPL_PARAM_BUG: defined if the compiler has trouble with
58 // function template argument deduction for non-type template parameters.
59 // * __SGI_STL_NO_ARROW_OPERATOR: defined if the compiler is unable
60 // to support the -> operator for iterators.
61 // * __STL_USE_EXCEPTIONS: defined if the compiler (in the current compilation
62 // mode) supports exceptions.
63 // * __STL_USE_NAMESPACES: defined if the compiler has the necessary
64 // support for namespaces.
65 // * __STL_NO_EXCEPTION_HEADER: defined if the compiler does not have a
66 // standard-conforming header <exception>.
67 // * __STL_SGI_THREADS: defined if this is being compiled for an SGI IRIX
68 // system in multithreaded mode, using native SGI threads instead of
69 // pthreads.
70 // * __STL_WIN32THREADS: defined if this is being compiled on a WIN32
71 // compiler in multithreaded mode.
72 // * __STL_LONG_LONG if the compiler has long long and unsigned long long
73 // types. (They're not in the C++ standard, but they are expected to be
74 // included in the forthcoming C9X standard.)
77 // User-settable macros that control compilation:
78 // * __STL_USE_SGI_ALLOCATORS: if defined, then the STL will use older
79 // SGI-style allocators, instead of standard-conforming allocators,
80 // even if the compiler supports all of the language features needed
81 // for standard-conforming allocators.
82 // * __STL_NO_NAMESPACES: if defined, don't put the library in namespace
83 // std, even if the compiler supports namespaces.
84 // * __STL_ASSERTIONS: if defined, then enable runtime checking through the
85 // __stl_assert macro.
86 // * _PTHREADS: if defined, use Posix threads for multithreading support.
87 // * _NOTHREADS: if defined, don't use any multithreading support.
90 # define __USE_MALLOC
91 // BeOS used to trick the STL allocator (in stl_alloc.h) into falling back
92 // to malloc/free-allocation by setting MAX_BYTES to 0.
93 // By requesting to use those directly, we should get the same allocator,
94 // but will avoid the '... creates array of size 0'-warnings that are
95 // produced by 'gcc -strict' (for instance when building ICU).
96 // Alternatively, we could define _PTHREADS here and use the real STL
97 // allocator with posix threads enabled (however, this would have to be
98 // tested first, and most probably requires a rebuild of gcc2, too,
99 // in order to make sure that no code existing in libstdc++.r4.so is
100 // still using the old allocator).
103 // Other macros defined by this file:
105 // * bool, true, and false, if __STL_NO_BOOL is defined.
106 // * typename, as a null macro if it's not already a keyword.
107 // * explicit, as a null macro if it's not already a keyword.
108 // * namespace-related macros (__STD, __STL_BEGIN_NAMESPACE, etc.)
109 // * exception-related macros (__STL_TRY, __STL_UNWIND, etc.)
110 // * __stl_assert, either as a test or as a null macro, depending on
111 // whether or not __STL_ASSERTIONS is defined.
113 #ifdef _PTHREADS
114 # define __STL_PTHREADS
115 #endif
116 #ifdef _SOLTHREADS
117 # define __STL_SOLTHREADS
118 #endif
120 # if defined(__sgi) && !defined(__GNUC__)
121 # if !defined(_BOOL)
122 # define __STL_NO_BOOL
123 # endif
124 # if defined(_WCHAR_T_IS_KEYWORD)
125 # define __STL_HAS_WCHAR_T
126 # endif
127 # if !defined(_TYPENAME_IS_KEYWORD)
128 # define __STL_NEED_TYPENAME
129 # endif
130 # ifdef _PARTIAL_SPECIALIZATION_OF_CLASS_TEMPLATES
131 # define __STL_CLASS_PARTIAL_SPECIALIZATION
132 # endif
133 # ifdef _MEMBER_TEMPLATES
134 # define __STL_MEMBER_TEMPLATES
135 # define __STL_MEMBER_TEMPLATE_CLASSES
136 # endif
137 # if defined(_MEMBER_TEMPLATE_KEYWORD)
138 # define __STL_MEMBER_TEMPLATE_KEYWORD
139 # endif
140 # if (_COMPILER_VERSION >= 730) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32
141 # define __STL_MEMBER_TEMPLATE_KEYWORD
142 # endif
143 # if !defined(_EXPLICIT_IS_KEYWORD)
144 # define __STL_NEED_EXPLICIT
145 # endif
146 # ifdef __EXCEPTIONS
147 # define __STL_USE_EXCEPTIONS
148 # endif
149 # if (_COMPILER_VERSION >= 721) && defined(_NAMESPACES)
150 # define __STL_HAS_NAMESPACES
151 # endif
152 # if (_COMPILER_VERSION < 721)
153 # define __STL_NO_EXCEPTION_HEADER
154 # endif
155 # if !defined(_NOTHREADS) && !defined(__STL_PTHREADS)
156 # define __STL_SGI_THREADS
157 # endif
158 # if defined(_LONGLONG) && defined(_SGIAPI) && _SGIAPI
159 # define __STL_LONG_LONG
160 # endif
161 # endif
163 # ifdef __GNUC__
164 # include <_G_config.h>
165 # define __STL_HAS_WCHAR_T
166 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
167 # define __STL_STATIC_TEMPLATE_MEMBER_BUG
168 # define __STL_NEED_TYPENAME
169 # define __STL_NEED_EXPLICIT
170 # else
171 # define __STL_CLASS_PARTIAL_SPECIALIZATION
172 # define __STL_FUNCTION_TMPL_PARTIAL_ORDER
173 # define __STL_MEMBER_TEMPLATES
174 # define __STL_MEMBER_TEMPLATE_CLASSES
175 # define __STL_EXPLICIT_FUNCTION_TMPL_ARGS
176 # define __STL_HAS_NAMESPACES
177 # define __STL_NO_NAMESPACES
178 # define __SGI_STL_USE_AUTO_PTR_CONVERSIONS
179 # define __STL_USE_NAMESPACES
180 # endif
181 # if defined(__linux__)
182 /* glibc pre 2.0 is very buggy. We have to disable thread for it.
183 It should be upgraded to glibc 2.0 or later. */
184 # if !defined(_NOTHREADS) && __GLIBC__ >= 2 && defined(_G_USING_THUNKS)
185 # define __STL_PTHREADS
186 # ifdef __STRICT_ANSI__
187 /* Work around a bug in the glibc 2.0.x pthread.h. */
188 # define sigset_t __sigset_t
189 # endif
190 # endif
191 # endif
192 # ifdef __EXCEPTIONS
193 # define __STL_USE_EXCEPTIONS
194 # endif
195 # ifndef __STRICT_ANSI__
196 # define __STL_LONG_LONG
197 # endif
198 # endif
200 # if defined(__SUNPRO_CC)
201 # define __STL_NO_BOOL
202 # define __STL_NEED_TYPENAME
203 # define __STL_NEED_EXPLICIT
204 # define __STL_USE_EXCEPTIONS
205 # endif
207 # if defined(__COMO__)
208 # define __STL_MEMBER_TEMPLATES
209 # define __STL_MEMBER_TEMPLATE_CLASSES
210 # define __STL_CLASS_PARTIAL_SPECIALIZATION
211 # define __STL_USE_EXCEPTIONS
212 # define __STL_HAS_NAMESPACES
213 # endif
215 # if defined(__MINGW32__)
216 # define __STL_NO_DRAND48
217 # endif
219 # if defined(__CYGWIN__)
220 # define __STL_NO_DRAND48
221 # endif
223 # if defined(_MSC_VER)
224 # define __STL_NO_DRAND48
225 # define __STL_NEED_TYPENAME
226 # if _MSC_VER < 1100 /* 1000 is version 4.0, 1100 is 5.0, 1200 is 6.0. */
227 # define __STL_NEED_EXPLICIT
228 # define __STL_NO_BOOL
229 # if _MSC_VER > 1000
230 # include <yvals.h>
231 # define __STL_DONT_USE_BOOL_TYPEDEF
232 # endif
233 # endif
234 # define __STL_NON_TYPE_TMPL_PARAM_BUG
235 # define __SGI_STL_NO_ARROW_OPERATOR
236 # ifdef _CPPUNWIND
237 # define __STL_USE_EXCEPTIONS
238 # endif
239 # ifdef _MT
240 # define __STL_WIN32THREADS
241 # endif
242 # if _MSC_VER >= 1200
243 # define __STL_PARTIAL_SPECIALIZATION_SYNTAX
244 # define __STL_HAS_NAMESPACES
245 # define __STL_NO_NAMESPACES
246 # endif
247 # endif
249 # if defined(__BORLANDC__)
250 # define __STL_NO_DRAND48
251 # define __STL_NEED_TYPENAME
252 # define __STL_LIMITED_DEFAULT_TEMPLATES
253 # define __SGI_STL_NO_ARROW_OPERATOR
254 # define __STL_NON_TYPE_TMPL_PARAM_BUG
255 # ifdef _CPPUNWIND
256 # define __STL_USE_EXCEPTIONS
257 # endif
258 # ifdef __MT__
259 # define __STL_WIN32THREADS
260 # endif
261 # endif
263 # if defined(__STL_NO_BOOL) && !defined(__STL_DONT_USE_BOOL_TYPEDEF)
264 typedef int bool;
265 # define true 1
266 # define false 0
267 # endif
269 # ifdef __STL_NEED_TYPENAME
270 # define typename
271 # endif
273 # ifdef __STL_MEMBER_TEMPLATE_KEYWORD
274 # define __STL_TEMPLATE template
275 # else
276 # define __STL_TEMPLATE
277 # endif
279 # ifdef __STL_NEED_EXPLICIT
280 # define explicit
281 # endif
283 # ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
284 # define __STL_NULL_TMPL_ARGS <>
285 # else
286 # define __STL_NULL_TMPL_ARGS
287 # endif
289 # if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) \
290 || defined (__STL_PARTIAL_SPECIALIZATION_SYNTAX)
291 # define __STL_TEMPLATE_NULL template<>
292 # else
293 # define __STL_TEMPLATE_NULL
294 # endif
296 // Use standard-conforming allocators if we have the necessary language
297 // features. __STL_USE_SGI_ALLOCATORS is a hook so that users can
298 // disable new-style allocators, and continue to use the same kind of
299 // allocators as before, without having to edit library headers.
300 # if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) && \
301 defined(__STL_MEMBER_TEMPLATES) && \
302 defined(__STL_MEMBER_TEMPLATE_CLASSES) && \
303 !defined(__STL_NO_BOOL) && \
304 !defined(__STL_NON_TYPE_TMPL_PARAM_BUG) && \
305 !defined(__STL_LIMITED_DEFAULT_TEMPLATES) && \
306 !defined(__STL_USE_SGI_ALLOCATORS) || \
307 (defined(__BEOS__) || defined(__HAIKU__))
308 # define __STL_USE_STD_ALLOCATORS
309 # endif
311 # ifndef __STL_DEFAULT_ALLOCATOR
312 # ifdef __STL_USE_STD_ALLOCATORS
313 # define __STL_DEFAULT_ALLOCATOR(T) allocator<T>
314 # else
315 # define __STL_DEFAULT_ALLOCATOR(T) alloc
316 # endif
317 # endif
319 // __STL_NO_NAMESPACES is a hook so that users can disable namespaces
320 // without having to edit library headers.
321 # if defined(__STL_HAS_NAMESPACES) && !defined(__STL_NO_NAMESPACES)
322 # define __STD std
323 # define __STL_BEGIN_NAMESPACE namespace std {
324 # define __STL_END_NAMESPACE }
325 # define __STL_USE_NAMESPACE_FOR_RELOPS
326 # define __STL_BEGIN_RELOPS_NAMESPACE namespace std {
327 # define __STL_END_RELOPS_NAMESPACE }
328 # define __STD_RELOPS std
329 # define __STL_USE_NAMESPACES
330 # else
331 # define __STD
332 # define __STL_BEGIN_NAMESPACE
333 # define __STL_END_NAMESPACE
334 # undef __STL_USE_NAMESPACE_FOR_RELOPS
335 # define __STL_BEGIN_RELOPS_NAMESPACE
336 # define __STL_END_RELOPS_NAMESPACE
337 # define __STD_RELOPS
338 # undef __STL_USE_NAMESPACES
339 # endif
341 # ifdef __STL_USE_EXCEPTIONS
342 # define __STL_TRY try
343 # define __STL_CATCH_ALL catch(...)
344 # define __STL_THROW(x) throw x
345 # define __STL_RETHROW throw
346 # define __STL_NOTHROW throw()
347 # define __STL_UNWIND(action) catch(...) { action; throw; }
348 # else
349 # define __STL_TRY
350 # define __STL_CATCH_ALL if (false)
351 # define __STL_THROW(x)
352 # define __STL_RETHROW
353 # define __STL_NOTHROW
354 # define __STL_UNWIND(action)
355 # endif
357 #ifdef __STL_ASSERTIONS
358 # include <stdio.h>
359 # define __stl_assert(expr) \
360 if (!(expr)) { fprintf(stderr, "%s:%d STL assertion failure: %s\n", \
361 __FILE__, __LINE__, # expr); abort(); }
362 #else
363 # define __stl_assert(expr)
364 #endif
366 #endif /* __STL_CONFIG_H */
368 // Local Variables:
369 // mode:C++
370 // End: