1 //  (C) Copyright Christopher Jefferson 2011.
2 //  Use, modification and distribution are subject to the
3 //  Boost Software License, Version 1.0. (See accompanying file
4 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 //  See http://www.boost.org for most recent version.
7 
8 //  config for libc++
9 //  Might need more in here later.
10 
11 #if !defined(_LIBCPP_VERSION)
12 #  include <ciso646>
13 #  if !defined(_LIBCPP_VERSION)
14 #      error "This is not libc++!"
15 #  endif
16 #endif
17 
18 #define BOOST_STDLIB "libc++ version " BOOST_STRINGIZE(_LIBCPP_VERSION)
19 
20 #define BOOST_HAS_THREADS
21 
22 #ifdef _LIBCPP_HAS_NO_VARIADICS
23 #    define BOOST_NO_CXX11_HDR_TUPLE
24 #endif
25 
26 // BOOST_NO_CXX11_ALLOCATOR should imply no support for the C++11
27 // allocator model. The C++11 allocator model requires a conforming
28 // std::allocator_traits which is only possible with C++11 template
29 // aliases since members rebind_alloc and rebind_traits require it.
30 #if defined(_LIBCPP_HAS_NO_TEMPLATE_ALIASES)
31 #    define BOOST_NO_CXX11_ALLOCATOR
32 #    define BOOST_NO_CXX11_POINTER_TRAITS
33 #endif
34 
35 #if __cplusplus < 201103
36 //
37 // These two appear to be somewhat useable in C++03 mode, there may be others...
38 //
39 //#  define BOOST_NO_CXX11_HDR_ARRAY
40 //#  define BOOST_NO_CXX11_HDR_FORWARD_LIST
41 
42 #  define BOOST_NO_CXX11_HDR_CODECVT
43 #  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE
44 #  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST
45 #  define BOOST_NO_CXX11_HDR_MUTEX
46 #  define BOOST_NO_CXX11_HDR_RANDOM
47 #  define BOOST_NO_CXX11_HDR_RATIO
48 #  define BOOST_NO_CXX11_HDR_REGEX
49 #  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR
50 #  define BOOST_NO_CXX11_HDR_THREAD
51 #  define BOOST_NO_CXX11_HDR_TUPLE
52 #  define BOOST_NO_CXX11_HDR_TYPEINDEX
53 #  define BOOST_NO_CXX11_HDR_UNORDERED_MAP
54 #  define BOOST_NO_CXX11_HDR_UNORDERED_SET
55 #  define BOOST_NO_CXX11_NUMERIC_LIMITS
56 #  define BOOST_NO_CXX11_ALLOCATOR
57 #  define BOOST_NO_CXX11_POINTER_TRAITS
58 #  define BOOST_NO_CXX11_SMART_PTR
59 #  define BOOST_NO_CXX11_HDR_FUNCTIONAL
60 #  define BOOST_NO_CXX11_STD_ALIGN
61 #  define BOOST_NO_CXX11_ADDRESSOF
62 #  define BOOST_NO_CXX11_HDR_ATOMIC
63 #  define BOOST_NO_CXX11_ATOMIC_SMART_PTR
64 #  define BOOST_NO_CXX11_HDR_CHRONO
65 #  define BOOST_NO_CXX11_HDR_TYPE_TRAITS
66 #  define BOOST_NO_CXX11_HDR_FUTURE
67 #elif _LIBCPP_VERSION < 3700
68 //
69 // These appear to be unusable/incomplete so far:
70 //
71 #  define BOOST_NO_CXX11_HDR_ATOMIC
72 #  define BOOST_NO_CXX11_ATOMIC_SMART_PTR
73 #  define BOOST_NO_CXX11_HDR_CHRONO
74 #  define BOOST_NO_CXX11_HDR_TYPE_TRAITS
75 #  define BOOST_NO_CXX11_HDR_FUTURE
76 #endif
77 
78 
79 #if _LIBCPP_VERSION < 3700
80 // libc++ uses a non-standard messages_base
81 #define BOOST_NO_STD_MESSAGES
82 #endif
83 
84 // C++14 features
85 #if (_LIBCPP_VERSION < 3700) || (__cplusplus <= 201402L)
86 #  define BOOST_NO_CXX14_STD_EXCHANGE
87 #endif
88 
89 // C++17 features
90 #if (_LIBCPP_VERSION < 4000) || (__cplusplus <= 201402L)
91 #  define BOOST_NO_CXX17_STD_APPLY
92 #  define BOOST_NO_CXX17_HDR_OPTIONAL
93 #  define BOOST_NO_CXX17_HDR_STRING_VIEW
94 #endif
95 #if (_LIBCPP_VERSION > 4000) && (__cplusplus > 201402L) && !defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
96 #  define BOOST_NO_AUTO_PTR
97 #endif
98 #if (_LIBCPP_VERSION > 4000) && (__cplusplus > 201402L) && !defined(_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE)
99 #  define BOOST_NO_CXX98_RANDOM_SHUFFLE
100 #endif
101 #if (_LIBCPP_VERSION > 4000) && (__cplusplus > 201402L) && !defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS)
102 #  define BOOST_NO_CXX98_BINDERS
103 #endif
104 
105 #define BOOST_NO_CXX17_ITERATOR_TRAITS
106 #define BOOST_NO_CXX17_STD_INVOKE      // Invoke support is incomplete (no invoke_result)
107 
108 #if (_LIBCPP_VERSION <= 1101) && !defined(BOOST_NO_CXX11_THREAD_LOCAL)
109 // This is a bit of a sledgehammer, because really it's just libc++abi that has no
110 // support for thread_local, leading to linker errors such as
111 // "undefined reference to `__cxa_thread_atexit'".  It is fixed in the
112 // most recent releases of libc++abi though...
113 #  define BOOST_NO_CXX11_THREAD_LOCAL
114 #endif
115 
116 #if defined(__linux__) && (_LIBCPP_VERSION < 6000) && !defined(BOOST_NO_CXX11_THREAD_LOCAL)
117 // After libc++-dev is installed on Trusty, clang++-libc++ almost works,
118 // except uses of `thread_local` fail with undefined reference to
119 // `__cxa_thread_atexit`.
120 //
121 // clang's libc++abi provides an implementation by deferring to the glibc
122 // implementation, which may or may not be available (it is not on Trusty).
123 // clang 4's libc++abi will provide an implementation if one is not in glibc
124 // though, so thread local support should work with clang 4 and above as long
125 // as libc++abi is linked in.
126 #  define BOOST_NO_CXX11_THREAD_LOCAL
127 #endif
128 
129 #if defined(__has_include)
130 #if !__has_include(<shared_mutex>)
131 #  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
132 #elif __cplusplus <= 201103
133 #  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
134 #endif
135 #elif __cplusplus < 201402
136 #  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
137 #endif
138 
139 #if !defined(BOOST_NO_CXX14_HDR_SHARED_MUTEX) && (_LIBCPP_VERSION < 5000)
140 #  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
141 #endif
142 
143 //  --- end ---
144