File indexing completed on 2026-05-03 08:13:13
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _LIBCPP___ATOMIC_SUPPORT_C11_H
0010 #define _LIBCPP___ATOMIC_SUPPORT_C11_H
0011
0012 #include <__atomic/memory_order.h>
0013 #include <__config>
0014 #include <__cstddef/ptrdiff_t.h>
0015 #include <__memory/addressof.h>
0016 #include <__type_traits/remove_const.h>
0017
0018 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0019 # pragma GCC system_header
0020 #endif
0021
0022
0023
0024
0025
0026 _LIBCPP_BEGIN_NAMESPACE_STD
0027
0028 template <typename _Tp>
0029 struct __cxx_atomic_base_impl {
0030 _LIBCPP_HIDE_FROM_ABI
0031 #ifndef _LIBCPP_CXX03_LANG
0032 __cxx_atomic_base_impl() _NOEXCEPT = default;
0033 #else
0034 __cxx_atomic_base_impl() _NOEXCEPT : __a_value() {
0035 }
0036 #endif
0037 _LIBCPP_CONSTEXPR explicit __cxx_atomic_base_impl(_Tp __value) _NOEXCEPT : __a_value(__value) {}
0038 _LIBCPP_DISABLE_EXTENSION_WARNING _Atomic(_Tp) __a_value;
0039 };
0040
0041 #define __cxx_atomic_is_lock_free(__s) __c11_atomic_is_lock_free(__s)
0042
0043 _LIBCPP_HIDE_FROM_ABI inline void __cxx_atomic_thread_fence(memory_order __order) _NOEXCEPT {
0044 __c11_atomic_thread_fence(static_cast<__memory_order_underlying_t>(__order));
0045 }
0046
0047 _LIBCPP_HIDE_FROM_ABI inline void __cxx_atomic_signal_fence(memory_order __order) _NOEXCEPT {
0048 __c11_atomic_signal_fence(static_cast<__memory_order_underlying_t>(__order));
0049 }
0050
0051 template <class _Tp>
0052 _LIBCPP_HIDE_FROM_ABI void __cxx_atomic_init(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __val) _NOEXCEPT {
0053 __c11_atomic_init(std::addressof(__a->__a_value), __val);
0054 }
0055 template <class _Tp>
0056 _LIBCPP_HIDE_FROM_ABI void __cxx_atomic_init(__cxx_atomic_base_impl<_Tp>* __a, _Tp __val) _NOEXCEPT {
0057 __c11_atomic_init(std::addressof(__a->__a_value), __val);
0058 }
0059
0060 template <class _Tp>
0061 _LIBCPP_HIDE_FROM_ABI void
0062 __cxx_atomic_store(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __val, memory_order __order) _NOEXCEPT {
0063 __c11_atomic_store(std::addressof(__a->__a_value), __val, static_cast<__memory_order_underlying_t>(__order));
0064 }
0065 template <class _Tp>
0066 _LIBCPP_HIDE_FROM_ABI void
0067 __cxx_atomic_store(__cxx_atomic_base_impl<_Tp>* __a, _Tp __val, memory_order __order) _NOEXCEPT {
0068 __c11_atomic_store(std::addressof(__a->__a_value), __val, static_cast<__memory_order_underlying_t>(__order));
0069 }
0070
0071 template <class _Tp>
0072 _LIBCPP_HIDE_FROM_ABI _Tp
0073 __cxx_atomic_load(__cxx_atomic_base_impl<_Tp> const volatile* __a, memory_order __order) _NOEXCEPT {
0074 using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*;
0075 return __c11_atomic_load(
0076 const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order));
0077 }
0078 template <class _Tp>
0079 _LIBCPP_HIDE_FROM_ABI _Tp __cxx_atomic_load(__cxx_atomic_base_impl<_Tp> const* __a, memory_order __order) _NOEXCEPT {
0080 using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*;
0081 return __c11_atomic_load(
0082 const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order));
0083 }
0084
0085 template <class _Tp>
0086 _LIBCPP_HIDE_FROM_ABI void
0087 __cxx_atomic_load_inplace(__cxx_atomic_base_impl<_Tp> const volatile* __a, _Tp* __dst, memory_order __order) _NOEXCEPT {
0088 using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*;
0089 *__dst = __c11_atomic_load(
0090 const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order));
0091 }
0092 template <class _Tp>
0093 _LIBCPP_HIDE_FROM_ABI void
0094 __cxx_atomic_load_inplace(__cxx_atomic_base_impl<_Tp> const* __a, _Tp* __dst, memory_order __order) _NOEXCEPT {
0095 using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*;
0096 *__dst = __c11_atomic_load(
0097 const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order));
0098 }
0099
0100 template <class _Tp>
0101 _LIBCPP_HIDE_FROM_ABI _Tp
0102 __cxx_atomic_exchange(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __value, memory_order __order) _NOEXCEPT {
0103 return __c11_atomic_exchange(
0104 std::addressof(__a->__a_value), __value, static_cast<__memory_order_underlying_t>(__order));
0105 }
0106 template <class _Tp>
0107 _LIBCPP_HIDE_FROM_ABI _Tp
0108 __cxx_atomic_exchange(__cxx_atomic_base_impl<_Tp>* __a, _Tp __value, memory_order __order) _NOEXCEPT {
0109 return __c11_atomic_exchange(
0110 std::addressof(__a->__a_value), __value, static_cast<__memory_order_underlying_t>(__order));
0111 }
0112
0113 _LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR memory_order __to_failure_order(memory_order __order) {
0114
0115 return __order == memory_order_release
0116 ? memory_order_relaxed
0117 : (__order == memory_order_acq_rel ? memory_order_acquire : __order);
0118 }
0119
0120 template <class _Tp>
0121 _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_strong(
0122 __cxx_atomic_base_impl<_Tp> volatile* __a,
0123 _Tp* __expected,
0124 _Tp __value,
0125 memory_order __success,
0126 memory_order __failure) _NOEXCEPT {
0127 return __c11_atomic_compare_exchange_strong(
0128 std::addressof(__a->__a_value),
0129 __expected,
0130 __value,
0131 static_cast<__memory_order_underlying_t>(__success),
0132 static_cast<__memory_order_underlying_t>(__to_failure_order(__failure)));
0133 }
0134 template <class _Tp>
0135 _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_strong(
0136 __cxx_atomic_base_impl<_Tp>* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure)
0137 _NOEXCEPT {
0138 return __c11_atomic_compare_exchange_strong(
0139 std::addressof(__a->__a_value),
0140 __expected,
0141 __value,
0142 static_cast<__memory_order_underlying_t>(__success),
0143 static_cast<__memory_order_underlying_t>(__to_failure_order(__failure)));
0144 }
0145
0146 template <class _Tp>
0147 _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_weak(
0148 __cxx_atomic_base_impl<_Tp> volatile* __a,
0149 _Tp* __expected,
0150 _Tp __value,
0151 memory_order __success,
0152 memory_order __failure) _NOEXCEPT {
0153 return __c11_atomic_compare_exchange_weak(
0154 std::addressof(__a->__a_value),
0155 __expected,
0156 __value,
0157 static_cast<__memory_order_underlying_t>(__success),
0158 static_cast<__memory_order_underlying_t>(__to_failure_order(__failure)));
0159 }
0160 template <class _Tp>
0161 _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_weak(
0162 __cxx_atomic_base_impl<_Tp>* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure)
0163 _NOEXCEPT {
0164 return __c11_atomic_compare_exchange_weak(
0165 std::addressof(__a->__a_value),
0166 __expected,
0167 __value,
0168 static_cast<__memory_order_underlying_t>(__success),
0169 static_cast<__memory_order_underlying_t>(__to_failure_order(__failure)));
0170 }
0171
0172 template <class _Tp>
0173 _LIBCPP_HIDE_FROM_ABI _Tp
0174 __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __delta, memory_order __order) _NOEXCEPT {
0175 return __c11_atomic_fetch_add(
0176 std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0177 }
0178 template <class _Tp>
0179 _LIBCPP_HIDE_FROM_ABI _Tp
0180 __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp>* __a, _Tp __delta, memory_order __order) _NOEXCEPT {
0181 return __c11_atomic_fetch_add(
0182 std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0183 }
0184
0185 template <class _Tp>
0186 _LIBCPP_HIDE_FROM_ABI _Tp*
0187 __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp*> volatile* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT {
0188 return __c11_atomic_fetch_add(
0189 std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0190 }
0191 template <class _Tp>
0192 _LIBCPP_HIDE_FROM_ABI _Tp*
0193 __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp*>* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT {
0194 return __c11_atomic_fetch_add(
0195 std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0196 }
0197
0198 template <class _Tp>
0199 _LIBCPP_HIDE_FROM_ABI _Tp
0200 __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __delta, memory_order __order) _NOEXCEPT {
0201 return __c11_atomic_fetch_sub(
0202 std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0203 }
0204 template <class _Tp>
0205 _LIBCPP_HIDE_FROM_ABI _Tp
0206 __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp>* __a, _Tp __delta, memory_order __order) _NOEXCEPT {
0207 return __c11_atomic_fetch_sub(
0208 std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0209 }
0210 template <class _Tp>
0211 _LIBCPP_HIDE_FROM_ABI _Tp*
0212 __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp*> volatile* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT {
0213 return __c11_atomic_fetch_sub(
0214 std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0215 }
0216 template <class _Tp>
0217 _LIBCPP_HIDE_FROM_ABI _Tp*
0218 __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp*>* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT {
0219 return __c11_atomic_fetch_sub(
0220 std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
0221 }
0222
0223 template <class _Tp>
0224 _LIBCPP_HIDE_FROM_ABI _Tp
0225 __cxx_atomic_fetch_and(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
0226 return __c11_atomic_fetch_and(
0227 std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
0228 }
0229 template <class _Tp>
0230 _LIBCPP_HIDE_FROM_ABI _Tp
0231 __cxx_atomic_fetch_and(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
0232 return __c11_atomic_fetch_and(
0233 std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
0234 }
0235
0236 template <class _Tp>
0237 _LIBCPP_HIDE_FROM_ABI _Tp
0238 __cxx_atomic_fetch_or(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
0239 return __c11_atomic_fetch_or(
0240 std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
0241 }
0242 template <class _Tp>
0243 _LIBCPP_HIDE_FROM_ABI _Tp
0244 __cxx_atomic_fetch_or(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
0245 return __c11_atomic_fetch_or(
0246 std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
0247 }
0248
0249 template <class _Tp>
0250 _LIBCPP_HIDE_FROM_ABI _Tp
0251 __cxx_atomic_fetch_xor(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
0252 return __c11_atomic_fetch_xor(
0253 std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
0254 }
0255 template <class _Tp>
0256 _LIBCPP_HIDE_FROM_ABI _Tp
0257 __cxx_atomic_fetch_xor(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
0258 return __c11_atomic_fetch_xor(
0259 std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
0260 }
0261
0262 _LIBCPP_END_NAMESPACE_STD
0263
0264 #endif