Ada 2.7.8
Fast spec-compliant URL parser
Loading...
Searching...
No Matches
common_defs.h
Go to the documentation of this file.
1
5#ifndef ADA_COMMON_DEFS_H
6#define ADA_COMMON_DEFS_H
7
8#ifdef _MSC_VER
9#define ADA_VISUAL_STUDIO 1
15#ifdef __clang__
16// clang under visual studio
17#define ADA_CLANG_VISUAL_STUDIO 1
18#else
19// just regular visual studio (best guess)
20#define ADA_REGULAR_VISUAL_STUDIO 1
21#endif // __clang__
22#endif // _MSC_VER
23
24#if defined(__GNUC__)
25// Marks a block with a name so that MCA analysis can see it.
26#define ADA_BEGIN_DEBUG_BLOCK(name) __asm volatile("# LLVM-MCA-BEGIN " #name);
27#define ADA_END_DEBUG_BLOCK(name) __asm volatile("# LLVM-MCA-END " #name);
28#define ADA_DEBUG_BLOCK(name, block) \
29 BEGIN_DEBUG_BLOCK(name); \
30 block; \
31 END_DEBUG_BLOCK(name);
32#else
33#define ADA_BEGIN_DEBUG_BLOCK(name)
34#define ADA_END_DEBUG_BLOCK(name)
35#define ADA_DEBUG_BLOCK(name, block)
36#endif
37
38// Align to N-byte boundary
39#define ADA_ROUNDUP_N(a, n) (((a) + ((n)-1)) & ~((n)-1))
40#define ADA_ROUNDDOWN_N(a, n) ((a) & ~((n)-1))
41
42#define ADA_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n)-1)) == 0)
43
44#if defined(ADA_REGULAR_VISUAL_STUDIO)
45
46#define ada_really_inline __forceinline
47#define ada_never_inline __declspec(noinline)
48
49#define ada_unused
50#define ada_warn_unused
51
52#ifndef ada_likely
53#define ada_likely(x) x
54#endif
55#ifndef ada_unlikely
56#define ada_unlikely(x) x
57#endif
58
59#define ADA_PUSH_DISABLE_WARNINGS __pragma(warning(push))
60#define ADA_PUSH_DISABLE_ALL_WARNINGS __pragma(warning(push, 0))
61#define ADA_DISABLE_VS_WARNING(WARNING_NUMBER) \
62 __pragma(warning(disable : WARNING_NUMBER))
63// Get rid of Intellisense-only warnings (Code Analysis)
64// Though __has_include is C++17, it is supported in Visual Studio 2017 or
65// better (_MSC_VER>=1910).
66#ifdef __has_include
67#if __has_include(<CppCoreCheck\Warnings.h>)
68#include <CppCoreCheck\Warnings.h>
69#define ADA_DISABLE_UNDESIRED_WARNINGS \
70 ADA_DISABLE_VS_WARNING(ALL_CPPCORECHECK_WARNINGS)
71#endif
72#endif
73
74#ifndef ADA_DISABLE_UNDESIRED_WARNINGS
75#define ADA_DISABLE_UNDESIRED_WARNINGS
76#endif
77
78#define ADA_DISABLE_DEPRECATED_WARNING ADA_DISABLE_VS_WARNING(4996)
79#define ADA_DISABLE_STRICT_OVERFLOW_WARNING
80#define ADA_POP_DISABLE_WARNINGS __pragma(warning(pop))
81
82#else // ADA_REGULAR_VISUAL_STUDIO
83
84#define ada_really_inline inline __attribute__((always_inline))
85#define ada_never_inline inline __attribute__((noinline))
86
87#define ada_unused __attribute__((unused))
88#define ada_warn_unused __attribute__((warn_unused_result))
89
90#ifndef ada_likely
91#define ada_likely(x) __builtin_expect(!!(x), 1)
92#endif
93#ifndef ada_unlikely
94#define ada_unlikely(x) __builtin_expect(!!(x), 0)
95#endif
96
97#define ADA_PUSH_DISABLE_WARNINGS _Pragma("GCC diagnostic push")
98// gcc doesn't seem to disable all warnings with all and extra, add warnings
99// here as necessary
100#define ADA_PUSH_DISABLE_ALL_WARNINGS \
101 ADA_PUSH_DISABLE_WARNINGS \
102 ADA_DISABLE_GCC_WARNING("-Weffc++") \
103 ADA_DISABLE_GCC_WARNING("-Wall") \
104 ADA_DISABLE_GCC_WARNING("-Wconversion") \
105 ADA_DISABLE_GCC_WARNING("-Wextra") \
106 ADA_DISABLE_GCC_WARNING("-Wattributes") \
107 ADA_DISABLE_GCC_WARNING("-Wimplicit-fallthrough") \
108 ADA_DISABLE_GCC_WARNING("-Wnon-virtual-dtor") \
109 ADA_DISABLE_GCC_WARNING("-Wreturn-type") \
110 ADA_DISABLE_GCC_WARNING("-Wshadow") \
111 ADA_DISABLE_GCC_WARNING("-Wunused-parameter") \
112 ADA_DISABLE_GCC_WARNING("-Wunused-variable")
113#define ADA_PRAGMA(P) _Pragma(#P)
114#define ADA_DISABLE_GCC_WARNING(WARNING) \
115 ADA_PRAGMA(GCC diagnostic ignored WARNING)
116#if defined(ADA_CLANG_VISUAL_STUDIO)
117#define ADA_DISABLE_UNDESIRED_WARNINGS \
118 ADA_DISABLE_GCC_WARNING("-Wmicrosoft-include")
119#else
120#define ADA_DISABLE_UNDESIRED_WARNINGS
121#endif
122#define ADA_DISABLE_DEPRECATED_WARNING \
123 ADA_DISABLE_GCC_WARNING("-Wdeprecated-declarations")
124#define ADA_DISABLE_STRICT_OVERFLOW_WARNING \
125 ADA_DISABLE_GCC_WARNING("-Wstrict-overflow")
126#define ADA_POP_DISABLE_WARNINGS _Pragma("GCC diagnostic pop")
127
128#endif // MSC_VER
129
130#if defined(ADA_VISUAL_STUDIO)
136#if ADA_USING_LIBRARY
137#define ADA_DLLIMPORTEXPORT __declspec(dllimport)
138#else
139#define ADA_DLLIMPORTEXPORT __declspec(dllexport)
140#endif
141#else
142#define ADA_DLLIMPORTEXPORT
143#endif
144
146#define ADA_TRY(EXPR) \
147 { \
148 auto _err = (EXPR); \
149 if (_err) { \
150 return _err; \
151 } \
152 }
153
154// __has_cpp_attribute is part of C++20
155#if !defined(__has_cpp_attribute)
156#define __has_cpp_attribute(x) 0
157#endif
158
159#if __has_cpp_attribute(gnu::noinline)
160#define ADA_ATTRIBUTE_NOINLINE [[gnu::noinline]]
161#else
162#define ADA_ATTRIBUTE_NOINLINE
163#endif
164
165namespace ada {
166[[noreturn]] inline void unreachable() {
167#ifdef __GNUC__
169#elif defined(_MSC_VER)
170 __assume(false);
171#else
172#endif
173}
174} // namespace ada
175
176#if defined(__GNUC__) && !defined(__clang__)
177#if __GNUC__ <= 8
178#define ADA_OLD_GCC 1
179#endif // __GNUC__ <= 8
180#endif // defined(__GNUC__) && !defined(__clang__)
181
182#if ADA_OLD_GCC
183#define ada_constexpr
184#else
185#define ada_constexpr constexpr
186#endif
187
188#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__)
189#define ADA_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
190#elif defined(_WIN32)
191#define ADA_IS_BIG_ENDIAN 0
192#else
193#if defined(__APPLE__) || \
194 defined(__FreeBSD__) // defined __BYTE_ORDER__ && defined
195 // __ORDER_BIG_ENDIAN__
196#include <machine/endian.h>
197#elif defined(sun) || \
198 defined(__sun) // defined(__APPLE__) || defined(__FreeBSD__)
199#include <sys/byteorder.h>
200#else // defined(__APPLE__) || defined(__FreeBSD__)
201
202#ifdef __has_include
203#if __has_include(<endian.h>)
204#include <endian.h>
205#endif //__has_include(<endian.h>)
206#endif //__has_include
207
208#endif // defined(__APPLE__) || defined(__FreeBSD__)
209
210#ifndef !defined(__BYTE_ORDER__) || !defined(__ORDER_LITTLE_ENDIAN__)
211#define ADA_IS_BIG_ENDIAN 0
212#endif
213
214#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
215#define ADA_IS_BIG_ENDIAN 0
216#else // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
217#define ADA_IS_BIG_ENDIAN 1
218#endif // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
219
220#endif // defined __BYTE_ORDER__ && defined __ORDER_BIG_ENDIAN__
221
222// Unless the programmer has already set ADA_DEVELOPMENT_CHECKS,
223// we want to set it under debug builds. We detect a debug build
224// under Visual Studio when the _DEBUG macro is set. Under the other
225// compilers, we use the fact that they define __OPTIMIZE__ whenever
226// they allow optimizations.
227// It is possible that this could miss some cases where ADA_DEVELOPMENT_CHECKS
228// is helpful, but the programmer can set the macro ADA_DEVELOPMENT_CHECKS.
229// It could also wrongly set ADA_DEVELOPMENT_CHECKS (e.g., if the programmer
230// sets _DEBUG in a release build under Visual Studio, or if some compiler fails
231// to set the __OPTIMIZE__ macro).
232#if !defined(ADA_DEVELOPMENT_CHECKS) && !defined(NDEBUG)
233#ifdef _MSC_VER
234// Visual Studio seems to set _DEBUG for debug builds.
235#ifdef _DEBUG
236#define ADA_DEVELOPMENT_CHECKS 1
237#endif // _DEBUG
238#else // _MSC_VER
239// All other compilers appear to set __OPTIMIZE__ to a positive integer
240// when the compiler is optimizing.
241#ifndef __OPTIMIZE__
242#define ADA_DEVELOPMENT_CHECKS 1
243#endif // __OPTIMIZE__
244#endif // _MSC_VER
245#endif // ADA_DEVELOPMENT_CHECKS
246
247#define ADA_STR(x) #x
248
249#if ADA_DEVELOPMENT_CHECKS
250#define ADA_REQUIRE(EXPR) \
251 { \
252 if (!(EXPR) { abort(); }) }
253
254#define ADA_FAIL(MESSAGE) \
255 do { \
256 std::cerr << "FAIL: " << (MESSAGE) << std::endl; \
257 abort(); \
258 } while (0);
259#define ADA_ASSERT_EQUAL(LHS, RHS, MESSAGE) \
260 do { \
261 if (LHS != RHS) { \
262 std::cerr << "Mismatch: '" << LHS << "' - '" << RHS << "'" << std::endl; \
263 ADA_FAIL(MESSAGE); \
264 } \
265 } while (0);
266#define ADA_ASSERT_TRUE(COND) \
267 do { \
268 if (!(COND)) { \
269 std::cerr << "Assert at line " << __LINE__ << " of file " << __FILE__ \
270 << std::endl; \
271 ADA_FAIL(ADA_STR(COND)); \
272 } \
273 } while (0);
274#else
275#define ADA_FAIL(MESSAGE)
276#define ADA_ASSERT_EQUAL(LHS, RHS, MESSAGE)
277#define ADA_ASSERT_TRUE(COND)
278#endif
279
280#ifdef ADA_VISUAL_STUDIO
281#define ADA_ASSUME(COND) __assume(COND)
282#else
283#define ADA_ASSUME(COND) \
284 do { \
285 if (!(COND)) { \
286 __builtin_unreachable(); \
287 } \
288 } while (0)
289#endif
290
291#if defined(__SSE2__) || defined(__x86_64__) || defined(__x86_64) || \
292 (defined(_M_AMD64) || defined(_M_X64) || \
293 (defined(_M_IX86_FP) && _M_IX86_FP == 2))
294#define ADA_SSE2 1
295#endif
296
297#if defined(__aarch64__) || defined(_M_ARM64)
298#define ADA_NEON 1
299#endif
300
301#endif // ADA_COMMON_DEFS_H
Definition ada_idna.h:13
void unreachable()
ada_warn_unused ada::result< result_type > parse(std::string_view input, const result_type *base_url=nullptr)