__config revision 249998
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
14249998Sdim#ifndef _MSC_VER // explicit macro necessary because it is only defined below in this file
15227825Stheraven#pragma GCC system_header
16227825Stheraven#endif
17227825Stheraven
18241903Sdim#ifdef __GNUC__
19241903Sdim#define _GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
20241903Sdim#endif
21227825Stheraven
22241903Sdim#define _LIBCPP_VERSION 1101
23241903Sdim
24227825Stheraven#define _LIBCPP_ABI_VERSION 1
25227825Stheraven
26227825Stheraven#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y
27227825Stheraven#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y)
28227825Stheraven
29227825Stheraven#define _LIBCPP_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION)
30227825Stheraven
31227825Stheraven#ifdef __LITTLE_ENDIAN__
32227825Stheraven#if __LITTLE_ENDIAN__
33227825Stheraven#define _LIBCPP_LITTLE_ENDIAN 1
34227825Stheraven#define _LIBCPP_BIG_ENDIAN    0
35227825Stheraven#endif  // __LITTLE_ENDIAN__
36227825Stheraven#endif  // __LITTLE_ENDIAN__
37227825Stheraven
38227825Stheraven#ifdef __BIG_ENDIAN__
39227825Stheraven#if __BIG_ENDIAN__
40227825Stheraven#define _LIBCPP_LITTLE_ENDIAN 0
41227825Stheraven#define _LIBCPP_BIG_ENDIAN    1
42227825Stheraven#endif  // __BIG_ENDIAN__
43227825Stheraven#endif  // __BIG_ENDIAN__
44227825Stheraven
45227825Stheraven#ifdef __FreeBSD__
46227825Stheraven# include <sys/endian.h>
47227825Stheraven#  if _BYTE_ORDER == _LITTLE_ENDIAN
48227825Stheraven#   define _LIBCPP_LITTLE_ENDIAN 1
49227825Stheraven#   define _LIBCPP_BIG_ENDIAN    0
50227825Stheraven# else  // _BYTE_ORDER == _LITTLE_ENDIAN
51227825Stheraven#   define _LIBCPP_LITTLE_ENDIAN 0
52227825Stheraven#   define _LIBCPP_BIG_ENDIAN    1
53227825Stheraven# endif  // _BYTE_ORDER == _LITTLE_ENDIAN
54243572Sdim# ifndef __LONG_LONG_SUPPORTED
55243572Sdim#  define _LIBCPP_HAS_NO_LONG_LONG
56243572Sdim# endif  // __LONG_LONG_SUPPORTED
57227825Stheraven#endif  // __FreeBSD__
58227825Stheraven
59227825Stheraven#ifdef _WIN32
60227825Stheraven#  define _LIBCPP_LITTLE_ENDIAN 1
61227825Stheraven#  define _LIBCPP_BIG_ENDIAN    0
62227825Stheraven// Compiler intrinsics (GCC or MSVC)
63241903Sdim#  if (defined(_MSC_VER) && _MSC_VER >= 1400) \
64241903Sdim   || (defined(__GNUC__) && _GNUC_VER > 403)
65227825Stheraven#    define _LIBCP_HAS_IS_BASE_OF
66227825Stheraven#  endif
67227825Stheraven#endif  // _WIN32
68227825Stheraven
69246487Stheraven#ifdef __linux__
70246487Stheraven#  if defined(__GNUC__) && _GNUC_VER >= 403
71246487Stheraven#    define _LIBCP_HAS_IS_BASE_OF
72246487Stheraven#  endif
73246487Stheraven#endif
74246487Stheraven
75232950Stheraven#ifdef __sun__
76232950Stheraven# include <sys/isa_defs.h>
77232950Stheraven# ifdef _LITTLE_ENDIAN
78232950Stheraven#   define _LIBCPP_LITTLE_ENDIAN 1
79232950Stheraven#   define _LIBCPP_BIG_ENDIAN    0
80232950Stheraven# else
81232950Stheraven#   define _LIBCPP_LITTLE_ENDIAN 0
82232950Stheraven#   define _LIBCPP_BIG_ENDIAN    1
83232950Stheraven# endif
84232950Stheraven#endif // __sun__
85232950Stheraven
86227825Stheraven#if !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
87227825Stheraven# include <endian.h>
88227825Stheraven# if __BYTE_ORDER == __LITTLE_ENDIAN
89227825Stheraven#  define _LIBCPP_LITTLE_ENDIAN 1
90227825Stheraven#  define _LIBCPP_BIG_ENDIAN    0
91227825Stheraven# elif __BYTE_ORDER == __BIG_ENDIAN
92227825Stheraven#  define _LIBCPP_LITTLE_ENDIAN 0
93227825Stheraven#  define _LIBCPP_BIG_ENDIAN    1
94227825Stheraven# else  // __BYTE_ORDER == __BIG_ENDIAN
95227825Stheraven#  error unable to determine endian
96227825Stheraven# endif
97227825Stheraven#endif  // !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
98227825Stheraven
99249998Sdim#ifdef _WIN32
100227825Stheraven
101227825Stheraven// only really useful for a DLL
102227825Stheraven#ifdef _LIBCPP_DLL // this should be a compiler builtin define ideally...
103227825Stheraven# ifdef cxx_EXPORTS
104227825Stheraven#  define _LIBCPP_HIDDEN
105249998Sdim#  define _LIBCPP_FUNC_VIS __declspec(dllexport)
106249998Sdim#  define _LIBCPP_TYPE_VIS __declspec(dllexport)
107227825Stheraven# else
108227825Stheraven#  define _LIBCPP_HIDDEN
109249998Sdim#  define _LIBCPP_FUNC_VIS __declspec(dllimport)
110249998Sdim#  define _LIBCPP_TYPE_VIS __declspec(dllimport)
111227825Stheraven# endif
112227825Stheraven#else
113227825Stheraven# define _LIBCPP_HIDDEN
114249998Sdim# define _LIBCPP_FUNC_VIS
115249998Sdim# define _LIBCPP_TYPE_VIS
116227825Stheraven#endif
117227825Stheraven
118227825Stheraven#ifndef _LIBCPP_INLINE_VISIBILITY
119249998Sdim# ifdef _MSC_VER
120227825Stheraven#  define _LIBCPP_INLINE_VISIBILITY __forceinline
121227825Stheraven# else // MinGW GCC and Clang
122227825Stheraven#  define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__always_inline__))
123227825Stheraven# endif
124227825Stheraven#endif
125227825Stheraven
126227825Stheraven#ifndef _LIBCPP_EXCEPTION_ABI
127249998Sdim#define _LIBCPP_EXCEPTION_ABI _LIBCPP_TYPE_VIS
128227825Stheraven#endif
129227825Stheraven
130227825Stheraven#ifndef _LIBCPP_ALWAYS_INLINE
131249998Sdim# ifdef _MSC_VER
132227825Stheraven#  define _LIBCPP_ALWAYS_INLINE __forceinline
133227825Stheraven# endif
134227825Stheraven#endif
135227825Stheraven
136227825Stheraven#endif // _WIN32
137227825Stheraven
138227825Stheraven#ifndef _LIBCPP_HIDDEN
139227825Stheraven#define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
140227825Stheraven#endif
141227825Stheraven
142249998Sdim#ifndef _LIBCPP_FUNC_VIS
143249998Sdim#define _LIBCPP_FUNC_VIS __attribute__ ((__visibility__("default")))
144227825Stheraven#endif
145227825Stheraven
146249998Sdim#ifndef _LIBCPP_TYPE_VIS
147249998Sdim#  if __has_attribute(type_visibility)
148249998Sdim#    define _LIBCPP_TYPE_VIS __attribute__ ((__type_visibility__("default")))
149249998Sdim#  else
150249998Sdim#    define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default")))
151249998Sdim#  endif
152249998Sdim#endif
153249998Sdim
154227825Stheraven#ifndef _LIBCPP_INLINE_VISIBILITY
155227825Stheraven#define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__visibility__("hidden"), __always_inline__))
156227825Stheraven#endif
157227825Stheraven
158227825Stheraven#ifndef _LIBCPP_EXCEPTION_ABI
159249998Sdim#define _LIBCPP_EXCEPTION_ABI _LIBCPP_TYPE_VIS
160227825Stheraven#endif
161227825Stheraven
162227825Stheraven#ifndef _LIBCPP_CANTTHROW
163227825Stheraven#define _LIBCPP_CANTTHROW __attribute__ ((__nothrow__))
164227825Stheraven#endif
165227825Stheraven
166227825Stheraven#ifndef _LIBCPP_ALWAYS_INLINE
167227825Stheraven#define _LIBCPP_ALWAYS_INLINE  __attribute__ ((__visibility__("hidden"), __always_inline__))
168227825Stheraven#endif
169227825Stheraven
170227825Stheraven#if defined(__clang__)
171227825Stheraven
172227825Stheraven#if __has_feature(cxx_alignas)
173241903Sdim#  define _ALIGNAS_TYPE(x) alignas(x)
174227825Stheraven#  define _ALIGNAS(x) alignas(x)
175227825Stheraven#else
176241903Sdim#  define _ALIGNAS_TYPE(x) __attribute__((__aligned__(__alignof(x))))
177227825Stheraven#  define _ALIGNAS(x) __attribute__((__aligned__(x)))
178227825Stheraven#endif
179227825Stheraven
180227825Stheraven#if !__has_feature(cxx_alias_templates)
181227825Stheraven#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
182227825Stheraven#endif
183227825Stheraven
184227825Stheraven#ifndef __GXX_EXPERIMENTAL_CXX0X__
185227825Stheraven#ifdef __linux__
186227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
187227825Stheraven#else
188227825Stheraventypedef __char16_t char16_t;
189227825Stheraventypedef __char32_t char32_t;
190227825Stheraven#endif
191227825Stheraven#endif
192227825Stheraven
193227825Stheraven#if !(__has_feature(cxx_exceptions))
194227825Stheraven#define _LIBCPP_NO_EXCEPTIONS
195227825Stheraven#endif
196227825Stheraven
197227825Stheraven#if !(__has_feature(cxx_rtti))
198227825Stheraven#define _LIBCPP_NO_RTTI
199227825Stheraven#endif
200227825Stheraven
201232950Stheraven#if !(__has_feature(cxx_strong_enums))
202232950Stheraven#define _LIBCPP_HAS_NO_STRONG_ENUMS
203232950Stheraven#endif
204232950Stheraven
205227825Stheraven#if !(__has_feature(cxx_decltype))
206227825Stheraven#define _LIBCPP_HAS_NO_DECLTYPE
207227825Stheraven#endif
208227825Stheraven
209227825Stheraven#if __has_feature(cxx_attributes)
210241903Sdim#  define _LIBCPP_NORETURN [[noreturn]]
211227825Stheraven#else
212241903Sdim#  define _LIBCPP_NORETURN __attribute__ ((noreturn))
213227825Stheraven#endif
214227825Stheraven
215227825Stheraven#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
216227825Stheraven
217227825Stheraven#if !(__has_feature(cxx_deleted_functions))
218227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
219227825Stheraven#endif  // !(__has_feature(cxx_deleted_functions))
220227825Stheraven
221227825Stheraven#if !(__has_feature(cxx_lambdas))
222227825Stheraven#define _LIBCPP_HAS_NO_LAMBDAS
223227825Stheraven#endif
224227825Stheraven
225227825Stheraven#if !(__has_feature(cxx_nullptr))
226227825Stheraven#define _LIBCPP_HAS_NO_NULLPTR
227227825Stheraven#endif
228227825Stheraven
229227825Stheraven#if !(__has_feature(cxx_rvalue_references))
230227825Stheraven#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
231227825Stheraven#endif
232227825Stheraven
233227825Stheraven#if !(__has_feature(cxx_static_assert))
234227825Stheraven#define _LIBCPP_HAS_NO_STATIC_ASSERT
235227825Stheraven#endif
236227825Stheraven
237227825Stheraven#if !(__has_feature(cxx_auto_type))
238227825Stheraven#define _LIBCPP_HAS_NO_AUTO_TYPE
239227825Stheraven#endif
240227825Stheraven
241227825Stheraven#if !(__has_feature(cxx_access_control_sfinae)) || !__has_feature(cxx_trailing_return)
242227825Stheraven#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
243227825Stheraven#endif
244227825Stheraven
245227825Stheraven#if !(__has_feature(cxx_variadic_templates))
246227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
247227825Stheraven#endif
248227825Stheraven
249227825Stheraven#if !(__has_feature(cxx_trailing_return))
250227825Stheraven#define _LIBCPP_HAS_NO_TRAILING_RETURN
251227825Stheraven#endif
252227825Stheraven
253227825Stheraven#if !(__has_feature(cxx_generalized_initializers))
254227825Stheraven#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
255227825Stheraven#endif
256227825Stheraven
257227825Stheraven#if __has_feature(is_base_of)
258227825Stheraven#  define _LIBCP_HAS_IS_BASE_OF
259227825Stheraven#endif
260227825Stheraven
261227825Stheraven// Objective-C++ features (opt-in)
262227825Stheraven#if __has_feature(objc_arc)
263227825Stheraven#define _LIBCPP_HAS_OBJC_ARC
264227825Stheraven#endif
265227825Stheraven
266227825Stheraven#if __has_feature(objc_arc_weak)
267227825Stheraven#define _LIBCPP_HAS_OBJC_ARC_WEAK
268232950Stheraven#define _LIBCPP_HAS_NO_STRONG_ENUMS
269227825Stheraven#endif
270227825Stheraven
271227825Stheraven#if !(__has_feature(cxx_constexpr))
272227825Stheraven#define _LIBCPP_HAS_NO_CONSTEXPR
273227825Stheraven#endif
274227825Stheraven
275249998Sdim#if defined(__FreeBSD__) && (__ISO_C_VISIBLE >= 2011 || __cplusplus >= 201103L)
276232972Stheraven#define _LIBCPP_HAS_QUICK_EXIT
277241903Sdim#define _LIBCPP_HAS_C11_FEATURES
278232972Stheraven#endif
279232972Stheraven
280227825Stheraven#if (__has_feature(cxx_noexcept))
281227825Stheraven#  define _NOEXCEPT noexcept
282227825Stheraven#  define _NOEXCEPT_(x) noexcept(x)
283227825Stheraven#else
284227825Stheraven#  define _NOEXCEPT throw()
285227825Stheraven#  define _NOEXCEPT_(x)
286227825Stheraven#endif
287227825Stheraven
288227825Stheraven#if __has_feature(underlying_type)
289227825Stheraven#  define _LIBCXX_UNDERLYING_TYPE(T) __underlying_type(T)
290227825Stheraven#endif
291227825Stheraven
292227825Stheraven// Inline namespaces are available in Clang regardless of C++ dialect.
293227825Stheraven#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
294227825Stheraven#define _LIBCPP_END_NAMESPACE_STD  } }
295227825Stheraven#define _VSTD std::_LIBCPP_NAMESPACE
296227825Stheraven
297227825Stheravennamespace std {
298227825Stheraven  inline namespace _LIBCPP_NAMESPACE {
299227825Stheraven  }
300227825Stheraven}
301227825Stheraven
302227825Stheraven#elif defined(__GNUC__)
303227825Stheraven
304227825Stheraven#define _ALIGNAS(x) __attribute__((__aligned__(x)))
305241903Sdim#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(__alignof(x))))
306227825Stheraven
307241903Sdim#define _LIBCPP_NORETURN __attribute__((noreturn))
308227825Stheraven
309227825Stheraven#if !__EXCEPTIONS
310227825Stheraven#define _LIBCPP_NO_EXCEPTIONS
311227825Stheraven#endif
312227825Stheraven
313227825Stheraven#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
314227825Stheraven#define _LIBCPP_HAS_NO_CONSTEXPR
315227825Stheraven
316227825Stheraven#define _NOEXCEPT throw()
317227825Stheraven#define _NOEXCEPT_(x)
318227825Stheraven
319227825Stheraven#ifndef __GXX_EXPERIMENTAL_CXX0X__
320227825Stheraven
321227825Stheraven#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
322227825Stheraven#define _LIBCPP_HAS_NO_DECLTYPE
323227825Stheraven#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
324227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
325227825Stheraven#define _LIBCPP_HAS_NO_NULLPTR
326227825Stheraven#define _LIBCPP_HAS_NO_STATIC_ASSERT
327227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
328227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
329227825Stheraven#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
330227825Stheraven#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
331227825Stheraven
332227825Stheraven#else  // __GXX_EXPERIMENTAL_CXX0X__
333227825Stheraven
334227825Stheraven#define _LIBCPP_HAS_NO_TRAILING_RETURN
335227825Stheraven#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
336227825Stheraven
337241903Sdim#if _GNUC_VER < 403
338227825Stheraven#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
339227825Stheraven#endif
340227825Stheraven
341241903Sdim#if _GNUC_VER < 403
342227825Stheraven#define _LIBCPP_HAS_NO_STATIC_ASSERT
343227825Stheraven#endif
344227825Stheraven
345241903Sdim#if _GNUC_VER < 404
346227825Stheraven#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
347227825Stheraven#define _LIBCPP_HAS_NO_DECLTYPE
348227825Stheraven#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
349227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
350227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
351227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
352227825Stheraven#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
353241903Sdim#endif  // _GNUC_VER < 404
354227825Stheraven
355241903Sdim#if _GNUC_VER < 406
356227825Stheraven#define _LIBCPP_HAS_NO_NULLPTR
357227825Stheraven#endif
358227825Stheraven
359227825Stheraven#endif  // __GXX_EXPERIMENTAL_CXX0X__
360227825Stheraven
361227825Stheraven#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { namespace _LIBCPP_NAMESPACE {
362227825Stheraven#define _LIBCPP_END_NAMESPACE_STD  } }
363227825Stheraven#define _VSTD std::_LIBCPP_NAMESPACE
364227825Stheraven
365227825Stheravennamespace std {
366227825Stheravennamespace _LIBCPP_NAMESPACE {
367227825Stheraven}
368227825Stheravenusing namespace _LIBCPP_NAMESPACE __attribute__((__strong__));
369227825Stheraven}
370227825Stheraven
371227825Stheraven#elif defined(_MSC_VER)
372227825Stheraven
373227825Stheraven#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
374227825Stheraven#define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
375227825Stheraven#define _LIBCPP_HAS_NO_CONSTEXPR
376227825Stheraven#define _LIBCPP_HAS_NO_UNICODE_CHARS
377227825Stheraven#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
378227825Stheraven#define __alignof__ __alignof
379241903Sdim#define _LIBCPP_NORETURN __declspec(noreturn)
380227825Stheraven#define _ALIGNAS(x) __declspec(align(x))
381227825Stheraven#define _LIBCPP_HAS_NO_VARIADICS
382227825Stheraven
383227825Stheraven#define _NOEXCEPT throw()
384227825Stheraven#define _NOEXCEPT_(x)
385227825Stheraven
386227825Stheraven#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
387227825Stheraven#define _LIBCPP_END_NAMESPACE_STD  }
388227825Stheraven#define _VSTD std
389227825Stheraven
390227825Stheravennamespace std {
391227825Stheraven}
392227825Stheraven
393227825Stheraven#endif // __clang__ || __GNUC___ || _MSC_VER
394227825Stheraven
395227825Stheraven#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS
396227825Stheraventypedef unsigned short char16_t;
397227825Stheraventypedef unsigned int   char32_t;
398227825Stheraven#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
399227825Stheraven
400227825Stheraven#ifdef _LIBCPP_HAS_NO_STATIC_ASSERT
401227825Stheraven
402227825Stheraventemplate <bool> struct __static_assert_test;
403227825Stheraventemplate <> struct __static_assert_test<true> {};
404227825Stheraventemplate <unsigned> struct __static_assert_check {};
405227825Stheraven#define static_assert(__b, __m) \
406227825Stheraven    typedef __static_assert_check<sizeof(__static_assert_test<(__b)>)> \
407227825Stheraven    _LIBCPP_CONCAT(__t, __LINE__)
408227825Stheraven
409227825Stheraven#endif  // _LIBCPP_HAS_NO_STATIC_ASSERT
410227825Stheraven
411227825Stheraven#ifdef _LIBCPP_HAS_NO_DECLTYPE
412227825Stheraven#define decltype(x) __typeof__(x)
413227825Stheraven#endif
414227825Stheraven
415227825Stheraven#ifdef _LIBCPP_HAS_NO_CONSTEXPR
416234976Stheraven#define _LIBCPP_CONSTEXPR
417234976Stheraven#else
418234976Stheraven#define _LIBCPP_CONSTEXPR constexpr
419227825Stheraven#endif
420227825Stheraven
421241903Sdim#ifdef __GNUC__
422241903Sdim#define _NOALIAS __attribute__((malloc))
423241903Sdim#else
424241903Sdim#define _NOALIAS
425241903Sdim#endif
426241903Sdim
427227825Stheraven#ifndef __has_feature
428227825Stheraven#define __has_feature(__x) 0
429227825Stheraven#endif
430227825Stheraven
431232950Stheraven#if __has_feature(cxx_explicit_conversions)
432232950Stheraven#   define _LIBCPP_EXPLICIT explicit
433232950Stheraven#else
434232950Stheraven#   define _LIBCPP_EXPLICIT
435232950Stheraven#endif
436232950Stheraven
437232950Stheraven#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
438249998Sdim#define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_TYPE_VIS x { enum __lx
439232950Stheraven#define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) \
440242945Stheraven    __lx __v_; \
441242945Stheraven    _LIBCPP_ALWAYS_INLINE x(__lx __v) : __v_(__v) {} \
442242945Stheraven    _LIBCPP_ALWAYS_INLINE explicit x(int __v) : __v_(static_cast<__lx>(__v)) {} \
443232950Stheraven    _LIBCPP_ALWAYS_INLINE operator int() const {return __v_;} \
444232950Stheraven    };
445232950Stheraven#else  // _LIBCPP_HAS_NO_STRONG_ENUMS
446249998Sdim#define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_TYPE_VIS x
447232950Stheraven#define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x)
448232950Stheraven#endif  // _LIBCPP_HAS_NO_STRONG_ENUMS
449232950Stheraven
450242945Stheraven#ifndef _LIBCPP_EXTERN_TEMPLATE
451242945Stheraven#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
452242945Stheraven#endif
453242945Stheraven
454249998Sdim#if defined(__APPLE__) || defined(__FreeBSD__) || defined(_WIN32) || defined(__sun__)
455227825Stheraven#define _LIBCPP_LOCALE__L_EXTENSIONS 1
456227825Stheraven#endif
457249998Sdim#ifdef __FreeBSD__
458227825Stheraven#define _DECLARE_C99_LDBL_MATH 1
459227825Stheraven#endif
460227825Stheraven
461249998Sdim#if defined(__APPLE__) || defined(__FreeBSD__)
462227825Stheraven#define _LIBCPP_HAS_DEFAULTRUNELOCALE
463227825Stheraven#endif
464227825Stheraven
465249998Sdim#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__)
466227825Stheraven#define _LIBCPP_WCTYPE_IS_MASK
467227825Stheraven#endif
468227825Stheraven
469227825Stheraven#ifdef _LIBCPP_DEBUG2
470227825Stheraven#   if _LIBCPP_DEBUG2 == 0
471227825Stheraven#       define _LIBCPP_DEBUG_LEVEL 1
472227825Stheraven#   elif _LIBCPP_DEBUG2 == 1
473227825Stheraven#       define _LIBCPP_DEBUG_LEVEL 2
474227825Stheraven#   else
475227825Stheraven#       error Supported values for _LIBCPP_DEBUG2 are 0 and 1
476227825Stheraven#   endif
477227825Stheraven#endif
478227825Stheraven
479227825Stheraven#ifdef _LIBCPP_DEBUG2
480227825Stheraven#   include <__debug>
481227825Stheraven#else
482227825Stheraven#   define _LIBCPP_ASSERT(x, m) ((void)0)
483227825Stheraven#endif
484227825Stheraven
485227825Stheraven#endif  // _LIBCPP_CONFIG
486