66 lines · c
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef _LIBCPP___ATOMIC_MEMORY_ORDER_H10#define _LIBCPP___ATOMIC_MEMORY_ORDER_H11 12#include <__config>13#include <__type_traits/is_same.h>14#include <__type_traits/underlying_type.h>15 16#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)17# pragma GCC system_header18#endif19 20_LIBCPP_BEGIN_NAMESPACE_STD21 22// Figure out what the underlying type for `memory_order` would be if it were23// declared as an unscoped enum (accounting for -fshort-enums). Use this result24// to pin the underlying type in C++20.25enum __legacy_memory_order { __mo_relaxed, __mo_consume, __mo_acquire, __mo_release, __mo_acq_rel, __mo_seq_cst };26 27using __memory_order_underlying_t _LIBCPP_NODEBUG = __underlying_type_t<__legacy_memory_order>;28 29#if _LIBCPP_STD_VER >= 2030 31enum class memory_order : __memory_order_underlying_t {32 relaxed = __mo_relaxed,33 consume = __mo_consume,34 acquire = __mo_acquire,35 release = __mo_release,36 acq_rel = __mo_acq_rel,37 seq_cst = __mo_seq_cst38};39 40static_assert(is_same<__underlying_type_t<memory_order>, __memory_order_underlying_t>::value,41 "unexpected underlying type for std::memory_order");42 43inline constexpr auto memory_order_relaxed = memory_order::relaxed;44inline constexpr auto memory_order_consume = memory_order::consume;45inline constexpr auto memory_order_acquire = memory_order::acquire;46inline constexpr auto memory_order_release = memory_order::release;47inline constexpr auto memory_order_acq_rel = memory_order::acq_rel;48inline constexpr auto memory_order_seq_cst = memory_order::seq_cst;49 50#else51 52enum memory_order {53 memory_order_relaxed = __mo_relaxed,54 memory_order_consume = __mo_consume,55 memory_order_acquire = __mo_acquire,56 memory_order_release = __mo_release,57 memory_order_acq_rel = __mo_acq_rel,58 memory_order_seq_cst = __mo_seq_cst,59};60 61#endif // _LIBCPP_STD_VER >= 2062 63_LIBCPP_END_NAMESPACE_STD64 65#endif // _LIBCPP___ATOMIC_MEMORY_ORDER_H66