File indexing completed on 2026-05-03 08:13:23
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _LIBCPP___CXX03___ATOMIC_MEMORY_ORDER_H
0010 #define _LIBCPP___CXX03___ATOMIC_MEMORY_ORDER_H
0011
0012 #include <__cxx03/__config>
0013 #include <__cxx03/__type_traits/is_same.h>
0014 #include <__cxx03/__type_traits/underlying_type.h>
0015
0016 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0017 # pragma GCC system_header
0018 #endif
0019
0020 _LIBCPP_BEGIN_NAMESPACE_STD
0021
0022
0023
0024
0025 enum __legacy_memory_order { __mo_relaxed, __mo_consume, __mo_acquire, __mo_release, __mo_acq_rel, __mo_seq_cst };
0026
0027 using __memory_order_underlying_t = underlying_type<__legacy_memory_order>::type;
0028
0029 #if _LIBCPP_STD_VER >= 20
0030
0031 enum class memory_order : __memory_order_underlying_t {
0032 relaxed = __mo_relaxed,
0033 consume = __mo_consume,
0034 acquire = __mo_acquire,
0035 release = __mo_release,
0036 acq_rel = __mo_acq_rel,
0037 seq_cst = __mo_seq_cst
0038 };
0039
0040 static_assert(is_same<underlying_type<memory_order>::type, __memory_order_underlying_t>::value,
0041 "unexpected underlying type for std::memory_order");
0042
0043 inline constexpr auto memory_order_relaxed = memory_order::relaxed;
0044 inline constexpr auto memory_order_consume = memory_order::consume;
0045 inline constexpr auto memory_order_acquire = memory_order::acquire;
0046 inline constexpr auto memory_order_release = memory_order::release;
0047 inline constexpr auto memory_order_acq_rel = memory_order::acq_rel;
0048 inline constexpr auto memory_order_seq_cst = memory_order::seq_cst;
0049
0050 #else
0051
0052 enum memory_order {
0053 memory_order_relaxed = __mo_relaxed,
0054 memory_order_consume = __mo_consume,
0055 memory_order_acquire = __mo_acquire,
0056 memory_order_release = __mo_release,
0057 memory_order_acq_rel = __mo_acq_rel,
0058 memory_order_seq_cst = __mo_seq_cst,
0059 };
0060
0061 #endif
0062
0063 _LIBCPP_END_NAMESPACE_STD
0064
0065 #endif