Loading...
Searching...
No Matches
Go to the documentation of this file.
9# if __has_include(<version>)
12#elif defined(_MSC_VER) && \
13 ((defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L))
28#if !defined(LIBCOPP_UTIL_HAVE_BUILTIN)
30# define LIBCOPP_UTIL_HAVE_BUILTIN(x) __has_builtin(x)
32# define LIBCOPP_UTIL_HAVE_BUILTIN(x) 0
36#if !defined(LIBCOPP_UTIL_HAVE_FEATURE)
38# define LIBCOPP_UTIL_HAVE_FEATURE(f) __has_feature(f)
40# define LIBCOPP_UTIL_HAVE_FEATURE(f) 0
55#if !defined(LIBCOPP_UTIL_HAVE_ATTRIBUTE)
56# ifdef __has_attribute
57# define LIBCOPP_UTIL_HAVE_ATTRIBUTE(x) __has_attribute(x)
59# define LIBCOPP_UTIL_HAVE_ATTRIBUTE(x) 0
69#if !defined(LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE)
70# if defined(__cplusplus) && defined(__has_cpp_attribute)
73# define LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
75# define LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE(x) 0
80#if !defined(LIBCOPP_UTIL_LIKELY_IF) && defined(__cplusplus)
82# if defined(__has_cpp_attribute) && (defined(__clang__) || !defined(__GNUC__) || __GNUC__ > 9)
83# if __has_cpp_attribute(likely)
84# define LIBCOPP_UTIL_LIKELY_IF(...) if (__VA_ARGS__) [[likely]]
88#if !defined(LIBCOPP_UTIL_LIKELY_IF) && (defined(__clang__) || defined(__GNUC__))
89# define LIBCOPP_UTIL_LIKELY_IF(...) if (__builtin_expect(!!(__VA_ARGS__), true))
91#ifndef LIBCOPP_UTIL_LIKELY_IF
92# define LIBCOPP_UTIL_LIKELY_IF(...) if (__VA_ARGS__)
94#if !defined(LIBCOPP_UTIL_LIKELY_CONDITION) && defined(__cplusplus)
96# if defined(__has_cpp_attribute) && (defined(__clang__) || !defined(__GNUC__) || __GNUC__ > 9)
97# if __has_cpp_attribute(likely)
98# define LIBCOPP_UTIL_LIKELY_CONDITION(__C) (__C) [[likely]]
102#if !defined(LIBCOPP_UTIL_LIKELY_CONDITION) && (defined(__clang__) || defined(__GNUC__))
103# define LIBCOPP_UTIL_LIKELY_CONDITION(__C) (__builtin_expect(!!(__C), true))
105#ifndef LIBCOPP_UTIL_LIKELY_CONDITION
106# define LIBCOPP_UTIL_LIKELY_CONDITION(__C) (__C)
109#if !defined(LIBCOPP_UTIL_UNLIKELY_IF) && defined(__cplusplus)
111# if defined(__has_cpp_attribute) && (defined(__clang__) || !defined(__GNUC__) || __GNUC__ > 9)
112# if __has_cpp_attribute(likely)
113# define LIBCOPP_UTIL_UNLIKELY_IF(...) if (__VA_ARGS__) [[unlikely]]
117#if !defined(LIBCOPP_UTIL_UNLIKELY_IF) && (defined(__clang__) || defined(__GNUC__))
118# define LIBCOPP_UTIL_UNLIKELY_IF(...) if (__builtin_expect(!!(__VA_ARGS__), false))
120#ifndef LIBCOPP_UTIL_UNLIKELY_IF
121# define LIBCOPP_UTIL_UNLIKELY_IF(...) if (__VA_ARGS__)
123#if !defined(LIBCOPP_UTIL_UNLIKELY_CONDITION) && defined(__cplusplus)
125# if defined(__has_cpp_attribute) && (defined(__clang__) || !defined(__GNUC__) || __GNUC__ > 9)
126# if __has_cpp_attribute(likely)
127# define LIBCOPP_UTIL_UNLIKELY_CONDITION(__C) (__C) [[unlikely]]
131#if !defined(LIBCOPP_UTIL_UNLIKELY_CONDITION) && (defined(__clang__) || defined(__GNUC__))
132# define LIBCOPP_UTIL_UNLIKELY_CONDITION(__C) (__builtin_expect(!!(__C), false))
134#ifndef LIBCOPP_UTIL_UNLIKELY_CONDITION
135# define LIBCOPP_UTIL_UNLIKELY_CONDITION(__C) (__C)
146#if defined(__GNUC__) && !defined(__ibmxl__)
152# if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)
156# ifndef LIBCOPP_UTIL_SYMBOL_EXPORT
157# define LIBCOPP_UTIL_SYMBOL_EXPORT __attribute__((__dllexport__))
159# ifndef LIBCOPP_UTIL_SYMBOL_IMPORT
160# define LIBCOPP_UTIL_SYMBOL_IMPORT __attribute__((__dllimport__))
165# ifndef LIBCOPP_UTIL_SYMBOL_EXPORT
166# define LIBCOPP_UTIL_SYMBOL_EXPORT __attribute__((visibility("default")))
168# ifndef LIBCOPP_UTIL_SYMBOL_IMPORT
169# define LIBCOPP_UTIL_SYMBOL_IMPORT __attribute__((visibility("default")))
171# ifndef LIBCOPP_UTIL_SYMBOL_VISIBLE
172# define LIBCOPP_UTIL_SYMBOL_VISIBLE __attribute__((visibility("default")))
174# ifndef LIBCOPP_UTIL_SYMBOL_LOCAL
175# define LIBCOPP_UTIL_SYMBOL_LOCAL __attribute__((visibility("hidden")))
182# ifndef LIBCOPP_UTIL_SYMBOL_EXPORT
183# define LIBCOPP_UTIL_SYMBOL_EXPORT
186# ifndef LIBCOPP_UTIL_SYMBOL_IMPORT
187# define LIBCOPP_UTIL_SYMBOL_IMPORT
189# ifndef LIBCOPP_UTIL_SYMBOL_VISIBLE
190# define LIBCOPP_UTIL_SYMBOL_VISIBLE
192# ifndef LIBCOPP_UTIL_SYMBOL_LOCAL
193# define LIBCOPP_UTIL_SYMBOL_LOCAL
198#elif defined(_MSC_VER)
212#if !defined(LIBCOPP_UTIL_SYMBOL_EXPORT) && \
213 (defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__))
215# ifndef LIBCOPP_UTIL_SYMBOL_EXPORT
216# define LIBCOPP_UTIL_SYMBOL_EXPORT __declspec(dllexport)
218# ifndef LIBCOPP_UTIL_SYMBOL_IMPORT
219# define LIBCOPP_UTIL_SYMBOL_IMPORT __declspec(dllimport)
224#ifndef LIBCOPP_UTIL_SYMBOL_EXPORT
225# define LIBCOPP_UTIL_SYMBOL_EXPORT
227#ifndef LIBCOPP_UTIL_SYMBOL_IMPORT
228# define LIBCOPP_UTIL_SYMBOL_IMPORT
230#ifndef LIBCOPP_UTIL_SYMBOL_VISIBLE
231# define LIBCOPP_UTIL_SYMBOL_VISIBLE
233#ifndef LIBCOPP_UTIL_SYMBOL_LOCAL
234# define LIBCOPP_UTIL_SYMBOL_LOCAL
236#ifndef LIBCOPP_UTIL_SYMBOL_NONE
237# define LIBCOPP_UTIL_SYMBOL_NONE
243#if defined(__GNUC__) || defined(__GNUG__)
248# define __cdecl __attribute__((__cdecl__))
258#ifndef LIBCOPP_UTIL_FORCEINLINE
259# if defined(__clang__)
260# if __cplusplus >= 201103L
261# define LIBCOPP_UTIL_FORCEINLINE [[gnu::always_inline]] inline
263# define LIBCOPP_UTIL_FORCEINLINE __attribute__((always_inline)) inline
265# elif defined(__GNUC__) && __GNUC__ > 3
266# if __cplusplus >= 201103L && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408
267# define LIBCOPP_UTIL_FORCEINLINE [[gnu::always_inline]] inline
269# define LIBCOPP_UTIL_FORCEINLINE __attribute__((always_inline)) inline
271# elif defined(_MSC_VER)
272# define LIBCOPP_UTIL_FORCEINLINE __forceinline
274# define LIBCOPP_UTIL_FORCEINLINE inline
278#ifndef LIBCOPP_UTIL_NOINLINE_NOCLONE
279# if defined(__clang__)
280# if __cplusplus >= 201103L
281# define LIBCOPP_UTIL_NOINLINE_NOCLONE [[gnu::noinline]]
283# define LIBCOPP_UTIL_NOINLINE_NOCLONE __attribute__((noinline))
285# elif defined(__GNUC__) && __GNUC__ > 3
286# if __cplusplus >= 201103L && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408
287# define LIBCOPP_UTIL_NOINLINE_NOCLONE [[gnu::noinline, gnu::noclone]]
289# define LIBCOPP_UTIL_NOINLINE_NOCLONE __attribute__((noinline, noclone))
291# elif defined(_MSC_VER)
292# define LIBCOPP_UTIL_NOINLINE_NOCLONE __declspec(noinline)
294# define LIBCOPP_UTIL_NOINLINE_NOCLONE
298#ifndef LIBCOPP_UTIL_CONST_INIT
299# if defined(__cpp_constinit) && __cpp_constinit >= 201907L
300# if defined(_MSC_VER)
301# define LIBCOPP_UTIL_CONST_INIT
303# define LIBCOPP_UTIL_CONST_INIT constinit
305# elif LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE(clang::require_constant_initialization)
306# define LIBCOPP_UTIL_CONST_INIT [[clang::require_constant_initialization]]
308# define LIBCOPP_UTIL_CONST_INIT
326#ifndef LIBCOPP_UTIL_ATTRIBUTE_LIFETIME_BOUND
327# if LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE(clang::lifetimebound)
328# define LIBCOPP_UTIL_ATTRIBUTE_LIFETIME_BOUND [[clang::lifetimebound]]
329# elif LIBCOPP_UTIL_HAVE_ATTRIBUTE(lifetimebound)
330# define LIBCOPP_UTIL_ATTRIBUTE_LIFETIME_BOUND __attribute__((lifetimebound))
332# define LIBCOPP_UTIL_ATTRIBUTE_LIFETIME_BOUND
340#ifndef LIBCOPP_UTIL_INTERNAL_ATTRIBUTE_CAPTURED_BY
341# if LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE(clang::lifetime_capture_by)
342# define LIBCOPP_UTIL_INTERNAL_ATTRIBUTE_CAPTURED_BY(Owner) [[clang::lifetime_capture_by(Owner)]]
344# define LIBCOPP_UTIL_INTERNAL_ATTRIBUTE_CAPTURED_BY(Owner)
367#ifndef LIBCOPP_UTIL_ATTRIBUTE_VIEW
368# if LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE(gsl::Pointer) && (!defined(__clang_major__) || __clang_major__ >= 13)
369# define LIBCOPP_UTIL_ATTRIBUTE_VIEW [[gsl::Pointer]]
371# define LIBCOPP_UTIL_ATTRIBUTE_VIEW
395#ifndef LIBCOPP_UTIL_ATTRIBUTE_OWNER
396# if LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE(gsl::Owner) && (!defined(__clang_major__) || __clang_major__ >= 13)
397# define LIBCOPP_UTIL_ATTRIBUTE_OWNER [[gsl::Owner]]
399# define LIBCOPP_UTIL_ATTRIBUTE_OWNER
417#ifndef LIBCOPP_UTIL_ATTRIBUTE_NO_UNIQUE_ADDRESS
418# if defined(_MSC_VER) && _MSC_VER >= 1929
419# define LIBCOPP_UTIL_ATTRIBUTE_NO_UNIQUE_ADDRESS [[msvc::no_unique_address]]
420# elif LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE(no_unique_address)
421# define LIBCOPP_UTIL_ATTRIBUTE_NO_UNIQUE_ADDRESS [[no_unique_address]]
423# define LIBCOPP_UTIL_ATTRIBUTE_NO_UNIQUE_ADDRESS
436#ifndef LIBCOPP_UTIL_ATTRIBUTE_UNINITIALIZED
437# if LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE(clang::uninitialized)
438# define LIBCOPP_UTIL_ATTRIBUTE_UNINITIALIZED [[clang::uninitialized]]
439# elif LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE(gnu::uninitialized)
440# define LIBCOPP_UTIL_ATTRIBUTE_UNINITIALIZED [[gnu::uninitialized]]
441# elif LIBCOPP_UTIL_HAVE_ATTRIBUTE(uninitialized)
442# define LIBCOPP_UTIL_ATTRIBUTE_UNINITIALIZED __attribute__((uninitialized))
444# define LIBCOPP_UTIL_ATTRIBUTE_UNINITIALIZED
470#ifndef LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE
471# if LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE(gnu::warn_unused)
472# define LIBCOPP_UTIL_ATTRIBUTE_WARN_UNUSED [[gnu::warn_unused]]
474# define LIBCOPP_UTIL_ATTRIBUTE_WARN_UNUSED
482#ifndef LIBCOPP_UTIL_HAVE_MEMORY_SANITIZER
483# if !defined(__native_client__) && LIBCOPP_UTIL_HAVE_FEATURE(memory_sanitizer)
484# define LIBCOPP_UTIL_HAVE_MEMORY_SANITIZER 1
486# define LIBCOPP_UTIL_HAVE_MEMORY_SANITIZER 0
490#if LIBCOPP_UTIL_HAVE_MEMORY_SANITIZER && LIBCOPP_UTIL_HAVE_ATTRIBUTE(no_sanitize_memory)
491# define LIBCOPP_UTIL_SANITIZER_NO_MEMORY \
492 __attribute__((no_sanitize_memory))
494# define LIBCOPP_UTIL_SANITIZER_NO_MEMORY
500#ifndef LIBCOPP_UTIL_HAVE_THREAD_SANITIZER
501# if defined(__SANITIZE_THREAD__)
502# define LIBCOPP_UTIL_HAVE_THREAD_SANITIZER 1
503# elif LIBCOPP_UTIL_HAVE_FEATURE(thread_sanitizer)
504# define LIBCOPP_UTIL_HAVE_THREAD_SANITIZER 1
506# define LIBCOPP_UTIL_HAVE_THREAD_SANITIZER 0
510#if LIBCOPP_UTIL_HAVE_THREAD_SANITIZER && LIBCOPP_UTIL_HAVE_ATTRIBUTE(no_sanitize_thread)
511# define LIBCOPP_UTIL_SANITIZER_NO_THREAD \
512 __attribute__((no_sanitize_thread))
514# define LIBCOPP_UTIL_SANITIZER_NO_THREAD
520#ifndef LIBCOPP_UTIL_HAVE_ADDRESS_SANITIZER
521# if defined(__SANITIZE_ADDRESS__)
522# define LIBCOPP_UTIL_HAVE_ADDRESS_SANITIZER 1
523# elif LIBCOPP_UTIL_HAVE_FEATURE(address_sanitizer)
524# define LIBCOPP_UTIL_HAVE_ADDRESS_SANITIZER 1
526# define LIBCOPP_UTIL_HAVE_ADDRESS_SANITIZER 0
535#ifndef LIBCOPP_UTIL_HAVE_HWADDRESS_SANITIZER
536# if defined(__SANITIZE_HWADDRESS__)
537# define LIBCOPP_UTIL_HAVE_HWADDRESS_SANITIZER 1
538# elif LIBCOPP_UTIL_HAVE_FEATURE(hwaddress_sanitizer)
539# define LIBCOPP_UTIL_HAVE_HWADDRESS_SANITIZER 1
541# define LIBCOPP_UTIL_HAVE_HWADDRESS_SANITIZER 0
545#if LIBCOPP_UTIL_HAVE_ADDRESS_SANITIZER && LIBCOPP_UTIL_HAVE_ATTRIBUTE(no_sanitize_address)
546# define LIBCOPP_UTIL_SANITIZER_NO_ADDRESS \
547 __attribute__((no_sanitize_address))
548#elif LIBCOPP_UTIL_HAVE_ADDRESS_SANITIZER && defined(_MSC_VER) && _MSC_VER >= 1928
549# define LIBCOPP_UTIL_SANITIZER_NO_ADDRESS __declspec(no_sanitize_address)
550#elif LIBCOPP_UTIL_HAVE_HWADDRESS_SANITIZER && LIBCOPP_UTIL_HAVE_ATTRIBUTE(no_sanitize)
551# define LIBCOPP_UTIL_SANITIZER_NO_ADDRESS __attribute__((no_sanitize("hwaddress")))
553# define LIBCOPP_UTIL_SANITIZER_NO_ADDRESS
559#ifndef LIBCOPP_UTIL_HAVE_DATAFLOW_SANITIZER
560# if defined(DATAFLOW_SANITIZER)
564# define LIBCOPP_UTIL_HAVE_DATAFLOW_SANITIZER 1
565# elif LIBCOPP_UTIL_HAVE_FEATURE(dataflow_sanitizer)
566# define LIBCOPP_UTIL_HAVE_DATAFLOW_SANITIZER 1
568# define LIBCOPP_UTIL_HAVE_DATAFLOW_SANITIZER 0
581#ifndef LIBCOPP_UTIL_HAVE_LEAK_SANITIZER
582# if defined(LEAK_SANITIZER)
586# define LIBCOPP_UTIL_HAVE_LEAK_SANITIZER 1
588# elif LIBCOPP_UTIL_HAVE_FEATURE(leak_sanitizer)
589# define LIBCOPP_UTIL_HAVE_LEAK_SANITIZER 1
590# elif defined(LIBCOPP_UTIL_HAVE_ADDRESS_SANITIZER)
592# define LIBCOPP_UTIL_HAVE_LEAK_SANITIZER 1
594# define LIBCOPP_UTIL_HAVE_LEAK_SANITIZER 0
598#ifndef LIBCOPP_UTIL_SANITIZER_NO_UNDEFINED
599# if LIBCOPP_UTIL_HAVE_ATTRIBUTE(no_sanitize_undefined)
600# define LIBCOPP_UTIL_SANITIZER_NO_UNDEFINED __attribute__((no_sanitize_undefined))
601# elif LIBCOPP_UTIL_HAVE_ATTRIBUTE(no_sanitize)
602# define LIBCOPP_UTIL_SANITIZER_NO_UNDEFINED __attribute__((no_sanitize("undefined")))
604# define LIBCOPP_UTIL_SANITIZER_NO_UNDEFINED
608#ifndef LIBCOPP_UTIL_MACRO_INLINE_VARIABLE
609# if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
610# define LIBCOPP_UTIL_MACRO_INLINE_VARIABLE inline
612# define LIBCOPP_UTIL_MACRO_INLINE_VARIABLE
624#ifndef LIBCOPP_UTIL_ATTRIBUTE_REINITIALIZES
625# if LIBCOPP_UTIL_HAVE_CPP_ATTRIBUTE(clang::reinitializes)
626# define LIBCOPP_UTIL_ATTRIBUTE_REINITIALIZES [[clang::reinitializes]]
628# define LIBCOPP_UTIL_ATTRIBUTE_REINITIALIZES
635#if LIBCOPP_UTIL_HAVE_ATTRIBUTE(returns_nonnull) || \
636 (defined(__GNUC__) && (__GNUC__ > 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) && !defined(__clang__))
637# define LIBCOPP_UTIL_ATTRIBUTE_RETURNS_NONNULL __attribute__((returns_nonnull))
639# define LIBCOPP_UTIL_ATTRIBUTE_RETURNS_NONNULL
643#ifndef LIBCOPP_UTIL_ATTRIBUTE_RETURNS_NONNULL
644# define LIBCOPP_UTIL_ATTRIBUTE_RETURNS_NONNULL LIBCOPP_UTIL_ATTRIBUTE_RETURNS_NONNULL