__config revision 227825
1227825Stheraven// -*- C++ -*-
2227825Stheraven//===--------------------------- __config ---------------------------------===//
3227825Stheraven//
4227825Stheraven//                     The LLVM Compiler Infrastructure
5227825Stheraven//
6227825Stheraven// This file is dual licensed under the MIT and the University of Illinois Open
7227825Stheraven// Source Licenses. See LICENSE.TXT for details.
8227825Stheraven//
9227825Stheraven//===----------------------------------------------------------------------===//
10227825Stheraven
11227825Stheraven#ifndef _LIBCPP_CONFIG
12227825Stheraven#define _LIBCPP_CONFIG
13227825Stheraven
14227825Stheraven#if !_MSC_VER // explicit macro necessary because it is only defined below in this file
15227825Stheraven#pragma GCC system_header
16227825Stheraven#endif
17227825Stheraven
18227825Stheraven#define _LIBCPP_VERSION 1001
19227825Stheraven
20227825Stheraven#define _LIBCPP_ABI_VERSION 1
21227825Stheraven
22227825Stheraven#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y
23227825Stheraven#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y)
24227825Stheraven
25227825Stheraven#define _LIBCPP_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION)
26227825Stheraven
27227825Stheraven#ifdef __LITTLE_ENDIAN__
28227825Stheraven#if __LITTLE_ENDIAN__
29227825Stheraven#define _LIBCPP_LITTLE_ENDIAN 1
30227825Stheraven#define _LIBCPP_BIG_ENDIAN    0
31227825Stheraven#endif  // __LITTLE_ENDIAN__
32227825Stheraven#endif  // __LITTLE_ENDIAN__
33227825Stheraven
34227825Stheraven#ifdef __BIG_ENDIAN__
35227825Stheraven#if __BIG_ENDIAN__
36227825Stheraven#define _LIBCPP_LITTLE_ENDIAN 0
37227825Stheraven#define _LIBCPP_BIG_ENDIAN    1
38227825Stheraven#endif  // __BIG_ENDIAN__
39227825Stheraven#endif  // __BIG_ENDIAN__
40227825Stheraven
41227825Stheraven#ifdef __FreeBSD__
42227825Stheraven# include <sys/endian.h>
43227825Stheraven#  if _BYTE_ORDER == _LITTLE_ENDIAN
44227825Stheraven#   define _LIBCPP_LITTLE_ENDIAN 1
45227825Stheraven#   define _LIBCPP_BIG_ENDIAN    0
46227825Stheraven# else  // _BYTE_ORDER == _LITTLE_ENDIAN
47227825Stheraven#   define _LIBCPP_LITTLE_ENDIAN 0
48227825Stheraven#   define _LIBCPP_BIG_ENDIAN    1
49227825Stheraven# endif  // _BYTE_ORDER == _LITTLE_ENDIAN
50227825Stheraven#endif  // __FreeBSD__
51227825Stheraven
52227825Stheraven#ifdef _WIN32
53227825Stheraven#  define _LIBCPP_LITTLE_ENDIAN 1
54227825Stheraven#  define _LIBCPP_BIG_ENDIAN    0
55227825Stheraven// Compiler intrinsics (GCC or MSVC)
56227825Stheraven#  if (defined(_MSC_VER) && _MSC_VER >= 1400) || (__GNUC__ >= 4 && __GNUC_MINOR__ > 3)
57227825Stheraven#    define _LIBCP_HAS_IS_BASE_OF
58227825Stheraven#  endif
59227825Stheraven#endif  // _WIN32
60227825Stheraven
61227825Stheraven#if !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
62227825Stheraven# include <endian.h>
63227825Stheraven# if __BYTE_ORDER == __LITTLE_ENDIAN
64227825Stheraven#  define _LIBCPP_LITTLE_ENDIAN 1
65227825Stheraven#  define _LIBCPP_BIG_ENDIAN    0
66227825Stheraven# elif __BYTE_ORDER == __BIG_ENDIAN
67227825Stheraven#  define _LIBCPP_LITTLE_ENDIAN 0
68227825Stheraven#  define _LIBCPP_BIG_ENDIAN    1
69227825Stheraven# else  // __BYTE_ORDER == __BIG_ENDIAN
70227825Stheraven#  error unable to determine endian
71227825Stheraven# endif
72227825Stheraven#endif  // !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
73227825Stheraven
74227825Stheraven#if _WIN32
75227825Stheraven
76227825Stheraven// only really useful for a DLL
77227825Stheraven#ifdef _LIBCPP_DLL // this should be a compiler builtin define ideally...
78227825Stheraven# ifdef cxx_EXPORTS
79227825Stheraven#  define _LIBCPP_HIDDEN
80227825Stheraven#  define _LIBCPP_VISIBLE __declspec(dllexport)
81227825Stheraven# else
82227825Stheraven#  define _LIBCPP_HIDDEN
83227825Stheraven#  define _LIBCPP_VISIBLE __declspec(dllimport)
84227825Stheraven# endif
85227825Stheraven#else
86227825Stheraven# define _LIBCPP_HIDDEN
87227825Stheraven# define _LIBCPP_VISIBLE
88227825Stheraven#endif
89227825Stheraven
90227825Stheraven#ifndef _LIBCPP_INLINE_VISIBILITY
91227825Stheraven# if _MSC_VER
92227825Stheraven#  define _LIBCPP_INLINE_VISIBILITY __forceinline
93227825Stheraven# else // MinGW GCC and Clang
94227825Stheraven#  define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__always_inline__))
95227825Stheraven# endif
96227825Stheraven#endif
97227825Stheraven
98227825Stheraven#ifndef _LIBCPP_EXCEPTION_ABI
99227825Stheraven#define _LIBCPP_EXCEPTION_ABI _LIBCPP_VISIBLE
100227825Stheraven#endif
101227825Stheraven
102227825Stheraven#ifndef _LIBCPP_ALWAYS_INLINE
103227825Stheraven# if _MSC_VER
104227825Stheraven#  define _LIBCPP_ALWAYS_INLINE __forceinline
105227825Stheraven# endif
106227825Stheraven#endif
107227825Stheraven
108227825Stheraven#endif // _WIN32
109227825Stheraven
110227825Stheraven#ifndef _LIBCPP_HIDDEN
111227825Stheraven#define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
112227825Stheraven#endif
113227825Stheraven
114227825Stheraven#ifndef _LIBCPP_VISIBLE
115227825Stheraven#define _LIBCPP_VISIBLE __attribute__ ((__visibility__("default")))
116227825Stheraven#endif
117227825Stheraven
118227825Stheraven#ifndef _LIBCPP_INLINE_VISIBILITY
119227825Stheraven#define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__visibility__("hidden"), __always_inline__))
120227825Stheraven#endif
121227825Stheraven
122227825Stheraven#ifndef _LIBCPP_EXCEPTION_ABI
123227825Stheraven#define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default")))
124227825Stheraven#endif
125227825Stheraven
126227825Stheraven#ifndef _LIBCPP_CANTTHROW
127227825Stheraven#define _LIBCPP_CANTTHROW __attribute__ ((__nothrow__))
128227825Stheraven#endif
129227825Stheraven
130227825Stheraven#ifndef _LIBCPP_ALWAYS_INLINE
131227825Stheraven#define _LIBCPP_ALWAYS_INLINE  __attribute__ ((__visibility__("hidden"), __always_inline__))
132227825Stheraven#endif
133227825Stheraven
134227825Stheraven#if defined(__clang__)
135227825Stheraven
136227825Stheraven#if __has_feature(cxx_alignas)
137227825Stheraven#  define _ALIGNAS(x) alignas(x)
138227825Stheraven#else
139227825Stheraven#  define _ALIGNAS(x) __attribute__((__aligned__(x)))
140227825Stheraven#endif
141227825Stheraven
142227825Stheraven#if !__has_feature(cxx_alias_templates)
143227825Stheraven#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
144227825Stheraven#endif
145227825Stheraven
146227825Stheraven#ifndef __GXX_EXPERIMENTAL_CXX0X__
147227825Stheraven#ifdef __linux__
148227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
149227825Stheraven#else
150227825Stheraventypedef __char16_t char16_t;
151227825Stheraventypedef __char32_t char32_t;
152227825Stheraven#endif
153227825Stheraven#endif
154227825Stheraven
155227825Stheraven#if !(__has_feature(cxx_exceptions))
156227825Stheraven#define _LIBCPP_NO_EXCEPTIONS
157227825Stheraven#endif
158227825Stheraven
159227825Stheraven#if !(__has_feature(cxx_rtti))
160227825Stheraven#define _LIBCPP_NO_RTTI
161227825Stheraven#endif
162227825Stheraven
163227825Stheraven#if !(__has_feature(cxx_decltype))
164227825Stheraven#define _LIBCPP_HAS_NO_DECLTYPE
165227825Stheraven#endif
166227825Stheraven
167227825Stheraven#if __has_feature(cxx_attributes)
168227825Stheraven#  define _ATTRIBUTE(x) [[x]]
169227825Stheraven#else
170227825Stheraven#  define _ATTRIBUTE(x) __attribute__ ((x))
171227825Stheraven#endif
172227825Stheraven
173227825Stheraven#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
174227825Stheraven
175227825Stheraven#if !(__has_feature(cxx_deleted_functions))
176227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
177227825Stheraven#endif  // !(__has_feature(cxx_deleted_functions))
178227825Stheraven
179227825Stheraven#if !(__has_feature(cxx_lambdas))
180227825Stheraven#define _LIBCPP_HAS_NO_LAMBDAS
181227825Stheraven#endif
182227825Stheraven
183227825Stheraven#if !(__has_feature(cxx_nullptr))
184227825Stheraven#define _LIBCPP_HAS_NO_NULLPTR
185227825Stheraven#endif
186227825Stheraven
187227825Stheraven#if !(__has_feature(cxx_rvalue_references))
188227825Stheraven#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
189227825Stheraven#endif
190227825Stheraven
191227825Stheraven#if !(__has_feature(cxx_static_assert))
192227825Stheraven#define _LIBCPP_HAS_NO_STATIC_ASSERT
193227825Stheraven#endif
194227825Stheraven
195227825Stheraven#if !(__has_feature(cxx_auto_type))
196227825Stheraven#define _LIBCPP_HAS_NO_AUTO_TYPE
197227825Stheraven#endif
198227825Stheraven
199227825Stheraven#if !(__has_feature(cxx_access_control_sfinae)) || !__has_feature(cxx_trailing_return)
200227825Stheraven#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
201227825Stheraven#endif
202227825Stheraven
203227825Stheraven#if !(__has_feature(cxx_variadic_templates))
204227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
205227825Stheraven#endif
206227825Stheraven
207227825Stheraven#if !(__has_feature(cxx_trailing_return))
208227825Stheraven#define _LIBCPP_HAS_NO_TRAILING_RETURN
209227825Stheraven#endif
210227825Stheraven
211227825Stheraven#if !(__has_feature(cxx_generalized_initializers))
212227825Stheraven#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
213227825Stheraven#endif
214227825Stheraven
215227825Stheraven#if __has_feature(is_base_of)
216227825Stheraven#  define _LIBCP_HAS_IS_BASE_OF
217227825Stheraven#endif
218227825Stheraven
219227825Stheraven// Objective-C++ features (opt-in)
220227825Stheraven#if __has_feature(objc_arc)
221227825Stheraven#define _LIBCPP_HAS_OBJC_ARC
222227825Stheraven#endif
223227825Stheraven
224227825Stheraven#if __has_feature(objc_arc_weak)
225227825Stheraven#define _LIBCPP_HAS_OBJC_ARC_WEAK
226227825Stheraven#endif
227227825Stheraven
228227825Stheraven#if !(__has_feature(cxx_constexpr))
229227825Stheraven#define _LIBCPP_HAS_NO_CONSTEXPR
230227825Stheraven#endif
231227825Stheraven
232227825Stheraven#if (__has_feature(cxx_noexcept))
233227825Stheraven#  define _NOEXCEPT noexcept
234227825Stheraven#  define _NOEXCEPT_(x) noexcept(x)
235227825Stheraven#else
236227825Stheraven#  define _NOEXCEPT throw()
237227825Stheraven#  define _NOEXCEPT_(x)
238227825Stheraven#endif
239227825Stheraven
240227825Stheraven#if __has_feature(underlying_type)
241227825Stheraven#  define _LIBCXX_UNDERLYING_TYPE(T) __underlying_type(T)
242227825Stheraven#endif
243227825Stheraven
244227825Stheraven// Inline namespaces are available in Clang regardless of C++ dialect.
245227825Stheraven#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
246227825Stheraven#define _LIBCPP_END_NAMESPACE_STD  } }
247227825Stheraven#define _VSTD std::_LIBCPP_NAMESPACE
248227825Stheraven
249227825Stheravennamespace std {
250227825Stheraven  inline namespace _LIBCPP_NAMESPACE {
251227825Stheraven  }
252227825Stheraven}
253227825Stheraven
254227825Stheraven#elif defined(__GNUC__)
255227825Stheraven
256227825Stheraven#define _ALIGNAS(x) __attribute__((__aligned__(x)))
257227825Stheraven
258227825Stheraven#define _ATTRIBUTE(x) __attribute__((x))
259227825Stheraven
260227825Stheraven#if !__EXCEPTIONS
261227825Stheraven#define _LIBCPP_NO_EXCEPTIONS
262227825Stheraven#endif
263227825Stheraven
264227825Stheraven#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
265227825Stheraven#define _LIBCPP_HAS_NO_CONSTEXPR
266227825Stheraven
267227825Stheraven#define _NOEXCEPT throw()
268227825Stheraven#define _NOEXCEPT_(x)
269227825Stheraven
270227825Stheraven#ifndef __GXX_EXPERIMENTAL_CXX0X__
271227825Stheraven
272227825Stheraven#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
273227825Stheraven#define _LIBCPP_HAS_NO_DECLTYPE
274227825Stheraven#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
275227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
276227825Stheraven#define _LIBCPP_HAS_NO_NULLPTR
277227825Stheraven#define _LIBCPP_HAS_NO_STATIC_ASSERT
278227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
279227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
280227825Stheraven#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
281227825Stheraven#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
282227825Stheraven
283227825Stheraven#else  // __GXX_EXPERIMENTAL_CXX0X__
284227825Stheraven
285227825Stheraven#define _LIBCPP_HAS_NO_TRAILING_RETURN
286227825Stheraven#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
287227825Stheraven
288227825Stheraven#if !(__GNUC__ >= 4 && __GNUC_MINOR__ >= 3)
289227825Stheraven#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
290227825Stheraven#endif
291227825Stheraven
292227825Stheraven#if !(__GNUC__ >= 4 && __GNUC_MINOR__ >= 3)
293227825Stheraven#define _LIBCPP_HAS_NO_STATIC_ASSERT
294227825Stheraven#endif
295227825Stheraven
296227825Stheraven#if !(__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
297227825Stheraven#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
298227825Stheraven#define _LIBCPP_HAS_NO_DECLTYPE
299227825Stheraven#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
300227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
301227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
302227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
303227825Stheraven#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
304227825Stheraven#endif  // !(__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
305227825Stheraven
306227825Stheraven#if !(__GNUC__ >= 4 && __GNUC_MINOR__ >= 6)
307227825Stheraven#define _LIBCPP_HAS_NO_NULLPTR
308227825Stheraven#endif
309227825Stheraven
310227825Stheraven#endif  // __GXX_EXPERIMENTAL_CXX0X__
311227825Stheraven
312227825Stheraven#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { namespace _LIBCPP_NAMESPACE {
313227825Stheraven#define _LIBCPP_END_NAMESPACE_STD  } }
314227825Stheraven#define _VSTD std::_LIBCPP_NAMESPACE
315227825Stheraven
316227825Stheravennamespace std {
317227825Stheravennamespace _LIBCPP_NAMESPACE {
318227825Stheraven}
319227825Stheravenusing namespace _LIBCPP_NAMESPACE __attribute__((__strong__));
320227825Stheraven}
321227825Stheraven
322227825Stheraven#elif defined(_MSC_VER)
323227825Stheraven
324227825Stheraven#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
325227825Stheraven#define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
326227825Stheraven#define _LIBCPP_HAS_NO_CONSTEXPR
327227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
328227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
329227825Stheraven#define __alignof__ __alignof
330227825Stheraven#define _ATTRIBUTE __declspec
331227825Stheraven#define _ALIGNAS(x) __declspec(align(x))
332227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
333227825Stheraven
334227825Stheraven#define _NOEXCEPT throw()
335227825Stheraven#define _NOEXCEPT_(x)
336227825Stheraven
337227825Stheraven#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
338227825Stheraven#define _LIBCPP_END_NAMESPACE_STD  }
339227825Stheraven#define _VSTD std
340227825Stheraven
341227825Stheravennamespace std {
342227825Stheraven}
343227825Stheraven
344227825Stheraven#endif // __clang__ || __GNUC___ || _MSC_VER
345227825Stheraven
346227825Stheraven#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS
347227825Stheraventypedef unsigned short char16_t;
348227825Stheraventypedef unsigned int   char32_t;
349227825Stheraven#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
350227825Stheraven
351227825Stheraven#ifdef _LIBCPP_HAS_NO_STATIC_ASSERT
352227825Stheraven
353227825Stheraventemplate <bool> struct __static_assert_test;
354227825Stheraventemplate <> struct __static_assert_test<true> {};
355227825Stheraventemplate <unsigned> struct __static_assert_check {};
356227825Stheraven#define static_assert(__b, __m) \
357227825Stheraven    typedef __static_assert_check<sizeof(__static_assert_test<(__b)>)> \
358227825Stheraven    _LIBCPP_CONCAT(__t, __LINE__)
359227825Stheraven
360227825Stheraven#endif  // _LIBCPP_HAS_NO_STATIC_ASSERT
361227825Stheraven
362227825Stheraven#ifdef _LIBCPP_HAS_NO_DECLTYPE
363227825Stheraven#define decltype(x) __typeof__(x)
364227825Stheraven#endif
365227825Stheraven
366227825Stheraven#ifdef _LIBCPP_HAS_NO_CONSTEXPR
367227825Stheraven#define constexpr const
368227825Stheraven#endif
369227825Stheraven
370227825Stheraven#ifndef __has_feature
371227825Stheraven#define __has_feature(__x) 0
372227825Stheraven#endif
373227825Stheraven
374227825Stheraven#if __APPLE__ || __FreeBSD__ || _WIN32
375227825Stheraven#define _LIBCPP_LOCALE__L_EXTENSIONS 1
376227825Stheraven#endif
377227825Stheraven#if __FreeBSD__
378227825Stheraven#define _DECLARE_C99_LDBL_MATH 1
379227825Stheraven#endif
380227825Stheraven
381227825Stheraven#if __APPLE__ || __FreeBSD__
382227825Stheraven#define _LIBCPP_HAS_DEFAULTRUNELOCALE
383227825Stheraven#endif
384227825Stheraven
385227825Stheraven#if __APPLE__ || __FreeBSD__
386227825Stheraven#define _LIBCPP_WCTYPE_IS_MASK
387227825Stheraven#endif
388227825Stheraven
389227825Stheraven#ifdef _LIBCPP_DEBUG2
390227825Stheraven#   if _LIBCPP_DEBUG2 == 0
391227825Stheraven#       define _LIBCPP_DEBUG_LEVEL 1
392227825Stheraven#   elif _LIBCPP_DEBUG2 == 1
393227825Stheraven#       define _LIBCPP_DEBUG_LEVEL 2
394227825Stheraven#   else
395227825Stheraven#       error Supported values for _LIBCPP_DEBUG2 are 0 and 1
396227825Stheraven#   endif
397227825Stheraven#endif
398227825Stheraven
399227825Stheraven#ifdef _LIBCPP_DEBUG2
400227825Stheraven#   include <__debug>
401227825Stheraven#else
402227825Stheraven#   define _LIBCPP_ASSERT(x, m) ((void)0)
403227825Stheraven#endif
404227825Stheraven
405227825Stheraven#endif  // _LIBCPP_CONFIG
406