Line data Source code
1 : //
2 : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3 : //
4 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 : //
7 : // Official repository: https://github.com/boostorg/json
8 : //
9 :
10 : #ifndef BOOST_JSON_DETAIL_CONFIG_HPP
11 : #define BOOST_JSON_DETAIL_CONFIG_HPP
12 :
13 : #include <boost/config.hpp>
14 : #include <boost/config/pragma_message.hpp>
15 : #include <boost/assert.hpp>
16 : #include <boost/throw_exception.hpp>
17 : #include <cstdint>
18 : #include <type_traits>
19 : #include <utility>
20 :
21 : // detect 32/64 bit
22 : #if UINTPTR_MAX == UINT64_MAX
23 : # define BOOST_JSON_ARCH 64
24 : #elif UINTPTR_MAX == UINT32_MAX
25 : # define BOOST_JSON_ARCH 32
26 : #else
27 : # error Unknown or unsupported architecture, please open an issue
28 : #endif
29 :
30 : #ifndef BOOST_JSON_REQUIRE_CONST_INIT
31 : # define BOOST_JSON_REQUIRE_CONST_INIT
32 : # if __cpp_constinit >= 201907L
33 : # undef BOOST_JSON_REQUIRE_CONST_INIT
34 : # define BOOST_JSON_REQUIRE_CONST_INIT constinit
35 : # elif defined(__clang__) && defined(__has_cpp_attribute)
36 : # if __has_cpp_attribute(clang::require_constant_initialization)
37 : # undef BOOST_JSON_REQUIRE_CONST_INIT
38 : # define BOOST_JSON_REQUIRE_CONST_INIT [[clang::require_constant_initialization]]
39 : # endif
40 : # endif
41 : #endif
42 :
43 : #ifndef BOOST_JSON_NO_DESTROY
44 : # if defined(__clang__) && defined(__has_cpp_attribute)
45 : # if __has_cpp_attribute(clang::no_destroy)
46 : # define BOOST_JSON_NO_DESTROY [[clang::no_destroy]]
47 : # endif
48 : # endif
49 : #endif
50 :
51 : #if ! defined(BOOST_JSON_NO_SSE2) && \
52 : ! defined(BOOST_JSON_USE_SSE2)
53 : # if (defined(_M_IX86) && _M_IX86_FP == 2) || \
54 : defined(_M_X64) || defined(__SSE2__)
55 : # define BOOST_JSON_USE_SSE2
56 : # endif
57 : #endif
58 :
59 : #if defined(BOOST_JSON_DOCS)
60 : # define BOOST_JSON_DECL
61 : #else
62 : # if (defined(BOOST_JSON_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)) && !defined(BOOST_JSON_STATIC_LINK)
63 : # if defined(BOOST_JSON_SOURCE)
64 : # define BOOST_JSON_DECL BOOST_SYMBOL_EXPORT
65 : # else
66 : # define BOOST_JSON_DECL BOOST_SYMBOL_IMPORT
67 : # endif
68 : # endif // shared lib
69 : # ifndef BOOST_JSON_DECL
70 : # define BOOST_JSON_DECL
71 : # endif
72 : # if !defined(BOOST_JSON_SOURCE) && !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_JSON_NO_LIB)
73 : # define BOOST_LIB_NAME boost_json
74 : # if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_JSON_DYN_LINK)
75 : # define BOOST_DYN_LINK
76 : # endif
77 : # include <boost/config/auto_link.hpp>
78 : # endif
79 : #endif
80 :
81 : #ifndef BOOST_JSON_LIKELY
82 : # define BOOST_JSON_LIKELY(x) BOOST_LIKELY( !!(x) )
83 : #endif
84 :
85 : #ifndef BOOST_JSON_UNLIKELY
86 : # define BOOST_JSON_UNLIKELY(x) BOOST_UNLIKELY( !!(x) )
87 : #endif
88 :
89 : #ifndef BOOST_JSON_UNREACHABLE
90 : # ifdef _MSC_VER
91 : # define BOOST_JSON_UNREACHABLE() __assume(0)
92 : # elif defined(__GNUC__) || defined(__clang__)
93 : # define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
94 : # elif defined(__has_builtin)
95 : # if __has_builtin(__builtin_unreachable)
96 : # define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
97 : # endif
98 : # else
99 : # define BOOST_JSON_UNREACHABLE() static_cast<void>(0)
100 : # endif
101 : #endif
102 :
103 : #ifndef BOOST_JSON_ASSUME
104 : # define BOOST_JSON_ASSUME(x) (!!(x) ? void() : BOOST_JSON_UNREACHABLE())
105 : # ifdef _MSC_VER
106 : # undef BOOST_JSON_ASSUME
107 : # define BOOST_JSON_ASSUME(x) __assume(!!(x))
108 : # elif defined(__has_builtin)
109 : # if __has_builtin(__builtin_assume)
110 : # undef BOOST_JSON_ASSUME
111 : # define BOOST_JSON_ASSUME(x) __builtin_assume(!!(x))
112 : # endif
113 : # endif
114 : #endif
115 :
116 : // older versions of msvc and clang don't always
117 : // constant initialize when they are supposed to
118 : #ifndef BOOST_JSON_WEAK_CONSTINIT
119 : # if defined(_MSC_VER) && ! defined(__clang__) && _MSC_VER < 1920
120 : # define BOOST_JSON_WEAK_CONSTINIT
121 : # elif defined(__clang__) && __clang_major__ < 4
122 : # define BOOST_JSON_WEAK_CONSTINIT
123 : # endif
124 : #endif
125 :
126 : // These macros are private, for tests, do not change
127 : // them or else previously built libraries won't match.
128 : #ifndef BOOST_JSON_MAX_STRING_SIZE
129 : # define BOOST_JSON_NO_MAX_STRING_SIZE
130 : # define BOOST_JSON_MAX_STRING_SIZE 0x7ffffffe
131 : #endif
132 : #ifndef BOOST_JSON_MAX_STRUCTURED_SIZE
133 : # define BOOST_JSON_NO_MAX_STRUCTURED_SIZE
134 : # define BOOST_JSON_MAX_STRUCTURED_SIZE 0x7ffffffe
135 : #endif
136 : #ifndef BOOST_JSON_STACK_BUFFER_SIZE
137 : # define BOOST_JSON_NO_STACK_BUFFER_SIZE
138 : # if defined(__i386__) || defined(__x86_64__) || \
139 : defined(_M_IX86) || defined(_M_X64)
140 : # define BOOST_JSON_STACK_BUFFER_SIZE 4096
141 : # else
142 : // If we are not on Intel, then assume we are on
143 : // embedded and use a smaller stack size. If this
144 : // is not suitable, the user can define the macro
145 : // themselves when building the library or including
146 : // src.hpp.
147 : # define BOOST_JSON_STACK_BUFFER_SIZE 256
148 : # endif
149 : #endif
150 :
151 : #if defined(__cpp_constinit) && __cpp_constinit >= 201907L
152 : # define BOOST_JSON_CONSTINIT constinit
153 : #elif defined(__has_cpp_attribute) && defined(__clang__)
154 : # if __has_cpp_attribute(clang::require_constant_initialization)
155 : # define BOOST_JSON_CONSTINIT [[clang::require_constant_initialization]]
156 : # endif
157 : #elif defined(__GNUC__) && (__GNUC__ >= 10)
158 : # define BOOST_JSON_CONSTINIT __constinit
159 : #endif
160 : #ifndef BOOST_JSON_CONSTINIT
161 : # define BOOST_JSON_CONSTINIT
162 : #endif
163 :
164 : namespace boost {
165 : namespace json {
166 : namespace detail {
167 :
168 : template<class...>
169 : struct make_void
170 : {
171 : using type =void;
172 : };
173 :
174 : template<class... Ts>
175 : using void_t = typename
176 : make_void<Ts...>::type;
177 :
178 : template<class T>
179 : using remove_cvref = typename
180 : std::remove_cv<typename
181 : std::remove_reference<T>::type>::type;
182 :
183 : template<class T, class U>
184 25056816 : T exchange(T& t, U u) noexcept
185 : {
186 25056816 : T v = std::move(t);
187 25056816 : t = std::move(u);
188 25056816 : return v;
189 : }
190 :
191 : /* This is a derivative work, original copyright:
192 :
193 : Copyright Eric Niebler 2013-present
194 :
195 : Use, modification and distribution is subject to the
196 : Boost Software License, Version 1.0. (See accompanying
197 : file LICENSE_1_0.txt or copy at
198 : http://www.boost.org/LICENSE_1_0.txt)
199 :
200 : Project home: https://github.com/ericniebler/range-v3
201 : */
202 : template<typename T>
203 : struct static_const
204 : {
205 : static constexpr T value {};
206 : };
207 : template<typename T>
208 : constexpr T static_const<T>::value;
209 :
210 : #define BOOST_JSON_INLINE_VARIABLE(name, type) \
211 : namespace { constexpr auto& name = \
212 : ::boost::json::detail::static_const<type>::value; \
213 : } struct _unused_ ## name ## _semicolon_bait_
214 :
215 : } // detail
216 : } // namespace json
217 : } // namespace boost
218 :
219 : #ifndef BOOST_JSON_ALLOW_DEPRECATED
220 : # ifdef BOOST_ALLOW_DEPRECATED
221 : # define BOOST_JSON_ALLOW_DEPRECATED
222 : # endif
223 : #endif
224 :
225 : #if defined(BOOST_GCC) && BOOST_GCC < 50000 && !defined(BOOST_JSON_ALLOW_DEPRECATED)
226 : # pragma GCC warning "Support for GCC versions below 5.0 is deprecated and will stop in Boost 1.88.0. To suppress this message define macro BOOST_JSON_ALLOW_DEPRECATED."
227 : #endif
228 :
229 : #ifndef BOOST_JSON_ALLOW_DEPRECATED
230 : # define BOOST_JSON_DEPRECATED(x) BOOST_DEPRECATED(x)
231 : #else
232 : # define BOOST_JSON_DEPRECATED(x)
233 : #endif
234 :
235 : #ifndef BOOST_ALL_NO_EMBEDDED_GDB_SCRIPTS
236 : #include <boost/json/detail/gdb_printers.hpp>
237 : #endif
238 :
239 : #endif
|