Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-03 08:13:13

0001 //===----------------------------------------------------------------------===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 
0009 #ifndef _LIBCPP___ATOMIC_MEMORY_ORDER_H
0010 #define _LIBCPP___ATOMIC_MEMORY_ORDER_H
0011 
0012 #include <__config>
0013 #include <__type_traits/is_same.h>
0014 #include <__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 // Figure out what the underlying type for `memory_order` would be if it were
0023 // declared as an unscoped enum (accounting for -fshort-enums). Use this result
0024 // to pin the underlying type in C++20.
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 _LIBCPP_NODEBUG = 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 // _LIBCPP_STD_VER >= 20
0062 
0063 _LIBCPP_END_NAMESPACE_STD
0064 
0065 #endif // _LIBCPP___ATOMIC_MEMORY_ORDER_H