blob: e34b8678671b53521cae4e037c35532359c682f8 [file] [log] [blame]
Howard Hinnant71be7292010-09-27 21:17:38 +00001// -*- C++ -*-
2//===--------------------------- atomic -----------------------------------===//
3//
Chandler Carruth7642bb12019-01-19 08:50:56 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnant71be7292010-09-27 21:17:38 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_ATOMIC
11#define _LIBCPP_ATOMIC
12
13/*
14 atomic synopsis
15
16namespace std
17{
18
JF Bastienfdb42c22016-03-25 15:48:21 +000019// feature test macro
20
21#define __cpp_lib_atomic_is_always_lock_free // as specified by SG10
22
Davide Italiano011f80a2019-03-05 18:40:49 +000023 // order and consistency
Howard Hinnant71be7292010-09-27 21:17:38 +000024
Davide Italiano011f80a2019-03-05 18:40:49 +000025 enum memory_order: unspecified // enum class in C++20
26 {
27 relaxed,
28 consume, // load-consume
29 acquire, // load-acquire
30 release, // store-release
31 acq_rel, // store-release load-acquire
32 seq_cst // store-release load-acquire
33 };
34
35 inline constexpr auto memory_order_relaxed = memory_order::relaxed;
36 inline constexpr auto memory_order_consume = memory_order::consume;
37 inline constexpr auto memory_order_acquire = memory_order::acquire;
38 inline constexpr auto memory_order_release = memory_order::release;
39 inline constexpr auto memory_order_acq_rel = memory_order::acq_rel;
40 inline constexpr auto memory_order_seq_cst = memory_order::seq_cst;
Howard Hinnant71be7292010-09-27 21:17:38 +000041
Howard Hinnanteee2c142012-04-11 20:14:21 +000042template <class T> T kill_dependency(T y) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +000043
44// lock-free property
45
Howard Hinnant931e3402013-01-21 20:39:41 +000046#define ATOMIC_BOOL_LOCK_FREE unspecified
Howard Hinnant71be7292010-09-27 21:17:38 +000047#define ATOMIC_CHAR_LOCK_FREE unspecified
48#define ATOMIC_CHAR16_T_LOCK_FREE unspecified
49#define ATOMIC_CHAR32_T_LOCK_FREE unspecified
50#define ATOMIC_WCHAR_T_LOCK_FREE unspecified
51#define ATOMIC_SHORT_LOCK_FREE unspecified
52#define ATOMIC_INT_LOCK_FREE unspecified
53#define ATOMIC_LONG_LOCK_FREE unspecified
54#define ATOMIC_LLONG_LOCK_FREE unspecified
Howard Hinnant931e3402013-01-21 20:39:41 +000055#define ATOMIC_POINTER_LOCK_FREE unspecified
Howard Hinnant71be7292010-09-27 21:17:38 +000056
Howard Hinnant71be7292010-09-27 21:17:38 +000057// flag type and operations
58
59typedef struct atomic_flag
60{
Howard Hinnanteee2c142012-04-11 20:14:21 +000061 bool test_and_set(memory_order m = memory_order_seq_cst) volatile noexcept;
62 bool test_and_set(memory_order m = memory_order_seq_cst) noexcept;
63 void clear(memory_order m = memory_order_seq_cst) volatile noexcept;
64 void clear(memory_order m = memory_order_seq_cst) noexcept;
65 atomic_flag() noexcept = default;
Howard Hinnant71be7292010-09-27 21:17:38 +000066 atomic_flag(const atomic_flag&) = delete;
67 atomic_flag& operator=(const atomic_flag&) = delete;
68 atomic_flag& operator=(const atomic_flag&) volatile = delete;
69} atomic_flag;
70
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000071bool
Howard Hinnanteee2c142012-04-11 20:14:21 +000072 atomic_flag_test_and_set(volatile atomic_flag* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000073
74bool
Howard Hinnanteee2c142012-04-11 20:14:21 +000075 atomic_flag_test_and_set(atomic_flag* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000076
77bool
78 atomic_flag_test_and_set_explicit(volatile atomic_flag* obj,
Howard Hinnanteee2c142012-04-11 20:14:21 +000079 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000080
81bool
Howard Hinnanteee2c142012-04-11 20:14:21 +000082 atomic_flag_test_and_set_explicit(atomic_flag* obj, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000083
84void
Howard Hinnanteee2c142012-04-11 20:14:21 +000085 atomic_flag_clear(volatile atomic_flag* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000086
87void
Howard Hinnanteee2c142012-04-11 20:14:21 +000088 atomic_flag_clear(atomic_flag* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000089
90void
Howard Hinnanteee2c142012-04-11 20:14:21 +000091 atomic_flag_clear_explicit(volatile atomic_flag* obj, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000092
93void
Howard Hinnanteee2c142012-04-11 20:14:21 +000094 atomic_flag_clear_explicit(atomic_flag* obj, memory_order m) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +000095
96#define ATOMIC_FLAG_INIT see below
Howard Hinnant493d1d92010-10-19 16:51:18 +000097#define ATOMIC_VAR_INIT(value) see below
Howard Hinnant71be7292010-09-27 21:17:38 +000098
Howard Hinnant71be7292010-09-27 21:17:38 +000099template <class T>
100struct atomic
101{
JF Bastienfdb42c22016-03-25 15:48:21 +0000102 static constexpr bool is_always_lock_free;
Howard Hinnanteee2c142012-04-11 20:14:21 +0000103 bool is_lock_free() const volatile noexcept;
104 bool is_lock_free() const noexcept;
105 void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept;
106 void store(T desr, memory_order m = memory_order_seq_cst) noexcept;
107 T load(memory_order m = memory_order_seq_cst) const volatile noexcept;
108 T load(memory_order m = memory_order_seq_cst) const noexcept;
109 operator T() const volatile noexcept;
110 operator T() const noexcept;
111 T exchange(T desr, memory_order m = memory_order_seq_cst) volatile noexcept;
112 T exchange(T desr, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000113 bool compare_exchange_weak(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000114 memory_order s, memory_order f) volatile noexcept;
115 bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000116 bool compare_exchange_strong(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000117 memory_order s, memory_order f) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000118 bool compare_exchange_strong(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000119 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000120 bool compare_exchange_weak(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000121 memory_order m = memory_order_seq_cst) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000122 bool compare_exchange_weak(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000123 memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000124 bool compare_exchange_strong(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000125 memory_order m = memory_order_seq_cst) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000126 bool compare_exchange_strong(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000127 memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000128
Howard Hinnanteee2c142012-04-11 20:14:21 +0000129 atomic() noexcept = default;
130 constexpr atomic(T desr) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000131 atomic(const atomic&) = delete;
132 atomic& operator=(const atomic&) = delete;
133 atomic& operator=(const atomic&) volatile = delete;
Howard Hinnanteee2c142012-04-11 20:14:21 +0000134 T operator=(T) volatile noexcept;
135 T operator=(T) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000136};
137
138template <>
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000139struct atomic<integral>
Howard Hinnant71be7292010-09-27 21:17:38 +0000140{
JF Bastienfdb42c22016-03-25 15:48:21 +0000141 static constexpr bool is_always_lock_free;
Howard Hinnanteee2c142012-04-11 20:14:21 +0000142 bool is_lock_free() const volatile noexcept;
143 bool is_lock_free() const noexcept;
144 void store(integral desr, memory_order m = memory_order_seq_cst) volatile noexcept;
145 void store(integral desr, memory_order m = memory_order_seq_cst) noexcept;
146 integral load(memory_order m = memory_order_seq_cst) const volatile noexcept;
147 integral load(memory_order m = memory_order_seq_cst) const noexcept;
148 operator integral() const volatile noexcept;
149 operator integral() const noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000150 integral exchange(integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000151 memory_order m = memory_order_seq_cst) volatile noexcept;
152 integral exchange(integral desr, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000153 bool compare_exchange_weak(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000154 memory_order s, memory_order f) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000155 bool compare_exchange_weak(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000156 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000157 bool compare_exchange_strong(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000158 memory_order s, memory_order f) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000159 bool compare_exchange_strong(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000160 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000161 bool compare_exchange_weak(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000162 memory_order m = memory_order_seq_cst) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000163 bool compare_exchange_weak(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000164 memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000165 bool compare_exchange_strong(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000166 memory_order m = memory_order_seq_cst) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000167 bool compare_exchange_strong(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000168 memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000169
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000170 integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000171 fetch_add(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
172 integral fetch_add(integral op, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000173 integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000174 fetch_sub(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
175 integral fetch_sub(integral op, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000176 integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000177 fetch_and(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
178 integral fetch_and(integral op, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000179 integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000180 fetch_or(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
181 integral fetch_or(integral op, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000182 integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000183 fetch_xor(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
184 integral fetch_xor(integral op, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000185
Howard Hinnanteee2c142012-04-11 20:14:21 +0000186 atomic() noexcept = default;
187 constexpr atomic(integral desr) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000188 atomic(const atomic&) = delete;
189 atomic& operator=(const atomic&) = delete;
190 atomic& operator=(const atomic&) volatile = delete;
Howard Hinnanteee2c142012-04-11 20:14:21 +0000191 integral operator=(integral desr) volatile noexcept;
192 integral operator=(integral desr) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000193
Howard Hinnanteee2c142012-04-11 20:14:21 +0000194 integral operator++(int) volatile noexcept;
195 integral operator++(int) noexcept;
196 integral operator--(int) volatile noexcept;
197 integral operator--(int) noexcept;
198 integral operator++() volatile noexcept;
199 integral operator++() noexcept;
200 integral operator--() volatile noexcept;
201 integral operator--() noexcept;
202 integral operator+=(integral op) volatile noexcept;
203 integral operator+=(integral op) noexcept;
204 integral operator-=(integral op) volatile noexcept;
205 integral operator-=(integral op) noexcept;
206 integral operator&=(integral op) volatile noexcept;
207 integral operator&=(integral op) noexcept;
208 integral operator|=(integral op) volatile noexcept;
209 integral operator|=(integral op) noexcept;
210 integral operator^=(integral op) volatile noexcept;
211 integral operator^=(integral op) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000212};
213
214template <class T>
215struct atomic<T*>
Howard Hinnant71be7292010-09-27 21:17:38 +0000216{
JF Bastienfdb42c22016-03-25 15:48:21 +0000217 static constexpr bool is_always_lock_free;
Howard Hinnanteee2c142012-04-11 20:14:21 +0000218 bool is_lock_free() const volatile noexcept;
219 bool is_lock_free() const noexcept;
220 void store(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept;
221 void store(T* desr, memory_order m = memory_order_seq_cst) noexcept;
222 T* load(memory_order m = memory_order_seq_cst) const volatile noexcept;
223 T* load(memory_order m = memory_order_seq_cst) const noexcept;
224 operator T*() const volatile noexcept;
225 operator T*() const noexcept;
226 T* exchange(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept;
227 T* exchange(T* desr, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000228 bool compare_exchange_weak(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000229 memory_order s, memory_order f) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000230 bool compare_exchange_weak(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000231 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000232 bool compare_exchange_strong(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000233 memory_order s, memory_order f) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000234 bool compare_exchange_strong(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000235 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000236 bool compare_exchange_weak(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000237 memory_order m = memory_order_seq_cst) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000238 bool compare_exchange_weak(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000239 memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000240 bool compare_exchange_strong(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000241 memory_order m = memory_order_seq_cst) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000242 bool compare_exchange_strong(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000243 memory_order m = memory_order_seq_cst) noexcept;
244 T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile noexcept;
245 T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst) noexcept;
246 T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile noexcept;
247 T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000248
Howard Hinnanteee2c142012-04-11 20:14:21 +0000249 atomic() noexcept = default;
250 constexpr atomic(T* desr) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000251 atomic(const atomic&) = delete;
252 atomic& operator=(const atomic&) = delete;
253 atomic& operator=(const atomic&) volatile = delete;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000254
Howard Hinnanteee2c142012-04-11 20:14:21 +0000255 T* operator=(T*) volatile noexcept;
256 T* operator=(T*) noexcept;
257 T* operator++(int) volatile noexcept;
258 T* operator++(int) noexcept;
259 T* operator--(int) volatile noexcept;
260 T* operator--(int) noexcept;
261 T* operator++() volatile noexcept;
262 T* operator++() noexcept;
263 T* operator--() volatile noexcept;
264 T* operator--() noexcept;
265 T* operator+=(ptrdiff_t op) volatile noexcept;
266 T* operator+=(ptrdiff_t op) noexcept;
267 T* operator-=(ptrdiff_t op) volatile noexcept;
268 T* operator-=(ptrdiff_t op) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000269};
270
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000271
272template <class T>
273 bool
Howard Hinnanteee2c142012-04-11 20:14:21 +0000274 atomic_is_lock_free(const volatile atomic<T>* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000275
276template <class T>
277 bool
Howard Hinnanteee2c142012-04-11 20:14:21 +0000278 atomic_is_lock_free(const atomic<T>* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000279
280template <class T>
281 void
Howard Hinnanteee2c142012-04-11 20:14:21 +0000282 atomic_init(volatile atomic<T>* obj, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000283
284template <class T>
285 void
Howard Hinnanteee2c142012-04-11 20:14:21 +0000286 atomic_init(atomic<T>* obj, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000287
288template <class T>
289 void
Howard Hinnanteee2c142012-04-11 20:14:21 +0000290 atomic_store(volatile atomic<T>* obj, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000291
292template <class T>
293 void
Howard Hinnanteee2c142012-04-11 20:14:21 +0000294 atomic_store(atomic<T>* obj, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000295
296template <class T>
297 void
Howard Hinnanteee2c142012-04-11 20:14:21 +0000298 atomic_store_explicit(volatile atomic<T>* obj, T desr, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000299
300template <class T>
301 void
Howard Hinnanteee2c142012-04-11 20:14:21 +0000302 atomic_store_explicit(atomic<T>* obj, T desr, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000303
304template <class T>
305 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000306 atomic_load(const volatile atomic<T>* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000307
308template <class T>
309 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000310 atomic_load(const atomic<T>* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000311
312template <class T>
313 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000314 atomic_load_explicit(const volatile atomic<T>* obj, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000315
316template <class T>
317 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000318 atomic_load_explicit(const atomic<T>* obj, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000319
320template <class T>
321 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000322 atomic_exchange(volatile atomic<T>* obj, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000323
324template <class T>
325 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000326 atomic_exchange(atomic<T>* obj, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000327
328template <class T>
329 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000330 atomic_exchange_explicit(volatile atomic<T>* obj, T desr, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000331
332template <class T>
333 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000334 atomic_exchange_explicit(atomic<T>* obj, T desr, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000335
336template <class T>
337 bool
Howard Hinnanteee2c142012-04-11 20:14:21 +0000338 atomic_compare_exchange_weak(volatile atomic<T>* obj, T* expc, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000339
340template <class T>
341 bool
Howard Hinnanteee2c142012-04-11 20:14:21 +0000342 atomic_compare_exchange_weak(atomic<T>* obj, T* expc, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000343
344template <class T>
345 bool
Howard Hinnanteee2c142012-04-11 20:14:21 +0000346 atomic_compare_exchange_strong(volatile atomic<T>* obj, T* expc, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000347
348template <class T>
349 bool
Howard Hinnanteee2c142012-04-11 20:14:21 +0000350 atomic_compare_exchange_strong(atomic<T>* obj, T* expc, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000351
352template <class T>
353 bool
354 atomic_compare_exchange_weak_explicit(volatile atomic<T>* obj, T* expc,
355 T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000356 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000357
358template <class T>
359 bool
360 atomic_compare_exchange_weak_explicit(atomic<T>* obj, T* expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000361 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000362
363template <class T>
364 bool
365 atomic_compare_exchange_strong_explicit(volatile atomic<T>* obj,
366 T* expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000367 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000368
369template <class T>
370 bool
371 atomic_compare_exchange_strong_explicit(atomic<T>* obj, T* expc,
372 T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000373 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000374
375template <class Integral>
376 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000377 atomic_fetch_add(volatile atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000378
379template <class Integral>
380 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000381 atomic_fetch_add(atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000382
383template <class Integral>
384 Integral
385 atomic_fetch_add_explicit(volatile atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000386 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000387template <class Integral>
388 Integral
389 atomic_fetch_add_explicit(atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000390 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000391template <class Integral>
392 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000393 atomic_fetch_sub(volatile atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000394
395template <class Integral>
396 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000397 atomic_fetch_sub(atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000398
399template <class Integral>
400 Integral
401 atomic_fetch_sub_explicit(volatile atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000402 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000403template <class Integral>
404 Integral
405 atomic_fetch_sub_explicit(atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000406 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000407template <class Integral>
408 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000409 atomic_fetch_and(volatile atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000410
411template <class Integral>
412 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000413 atomic_fetch_and(atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000414
415template <class Integral>
416 Integral
417 atomic_fetch_and_explicit(volatile atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000418 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000419template <class Integral>
420 Integral
421 atomic_fetch_and_explicit(atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000422 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000423template <class Integral>
424 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000425 atomic_fetch_or(volatile atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000426
427template <class Integral>
428 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000429 atomic_fetch_or(atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000430
431template <class Integral>
432 Integral
433 atomic_fetch_or_explicit(volatile atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000434 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000435template <class Integral>
436 Integral
437 atomic_fetch_or_explicit(atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000438 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000439template <class Integral>
440 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000441 atomic_fetch_xor(volatile atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000442
443template <class Integral>
444 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000445 atomic_fetch_xor(atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000446
447template <class Integral>
448 Integral
449 atomic_fetch_xor_explicit(volatile atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000450 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000451template <class Integral>
452 Integral
453 atomic_fetch_xor_explicit(atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000454 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000455
456template <class T>
457 T*
Howard Hinnanteee2c142012-04-11 20:14:21 +0000458 atomic_fetch_add(volatile atomic<T*>* obj, ptrdiff_t op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000459
460template <class T>
461 T*
Howard Hinnanteee2c142012-04-11 20:14:21 +0000462 atomic_fetch_add(atomic<T*>* obj, ptrdiff_t op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000463
464template <class T>
465 T*
466 atomic_fetch_add_explicit(volatile atomic<T*>* obj, ptrdiff_t op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000467 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000468template <class T>
469 T*
Howard Hinnanteee2c142012-04-11 20:14:21 +0000470 atomic_fetch_add_explicit(atomic<T*>* obj, ptrdiff_t op, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000471
472template <class T>
473 T*
Howard Hinnanteee2c142012-04-11 20:14:21 +0000474 atomic_fetch_sub(volatile atomic<T*>* obj, ptrdiff_t op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000475
476template <class T>
477 T*
Howard Hinnanteee2c142012-04-11 20:14:21 +0000478 atomic_fetch_sub(atomic<T*>* obj, ptrdiff_t op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000479
480template <class T>
481 T*
482 atomic_fetch_sub_explicit(volatile atomic<T*>* obj, ptrdiff_t op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000483 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000484template <class T>
485 T*
Howard Hinnanteee2c142012-04-11 20:14:21 +0000486 atomic_fetch_sub_explicit(atomic<T*>* obj, ptrdiff_t op, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000487
488// Atomics for standard typedef types
489
Howard Hinnantf0af8d92013-01-04 18:58:50 +0000490typedef atomic<bool> atomic_bool;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000491typedef atomic<char> atomic_char;
492typedef atomic<signed char> atomic_schar;
493typedef atomic<unsigned char> atomic_uchar;
494typedef atomic<short> atomic_short;
495typedef atomic<unsigned short> atomic_ushort;
496typedef atomic<int> atomic_int;
497typedef atomic<unsigned int> atomic_uint;
498typedef atomic<long> atomic_long;
499typedef atomic<unsigned long> atomic_ulong;
500typedef atomic<long long> atomic_llong;
501typedef atomic<unsigned long long> atomic_ullong;
502typedef atomic<char16_t> atomic_char16_t;
503typedef atomic<char32_t> atomic_char32_t;
504typedef atomic<wchar_t> atomic_wchar_t;
505
506typedef atomic<int_least8_t> atomic_int_least8_t;
507typedef atomic<uint_least8_t> atomic_uint_least8_t;
508typedef atomic<int_least16_t> atomic_int_least16_t;
509typedef atomic<uint_least16_t> atomic_uint_least16_t;
510typedef atomic<int_least32_t> atomic_int_least32_t;
511typedef atomic<uint_least32_t> atomic_uint_least32_t;
512typedef atomic<int_least64_t> atomic_int_least64_t;
513typedef atomic<uint_least64_t> atomic_uint_least64_t;
514
515typedef atomic<int_fast8_t> atomic_int_fast8_t;
516typedef atomic<uint_fast8_t> atomic_uint_fast8_t;
517typedef atomic<int_fast16_t> atomic_int_fast16_t;
518typedef atomic<uint_fast16_t> atomic_uint_fast16_t;
519typedef atomic<int_fast32_t> atomic_int_fast32_t;
520typedef atomic<uint_fast32_t> atomic_uint_fast32_t;
521typedef atomic<int_fast64_t> atomic_int_fast64_t;
522typedef atomic<uint_fast64_t> atomic_uint_fast64_t;
523
Marshall Clowf710afc2016-06-30 15:28:38 +0000524typedef atomic<int8_t> atomic_int8_t;
525typedef atomic<uint8_t> atomic_uint8_t;
526typedef atomic<int16_t> atomic_int16_t;
527typedef atomic<uint16_t> atomic_uint16_t;
528typedef atomic<int32_t> atomic_int32_t;
529typedef atomic<uint32_t> atomic_uint32_t;
530typedef atomic<int64_t> atomic_int64_t;
531typedef atomic<uint64_t> atomic_uint64_t;
532
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000533typedef atomic<intptr_t> atomic_intptr_t;
534typedef atomic<uintptr_t> atomic_uintptr_t;
535typedef atomic<size_t> atomic_size_t;
536typedef atomic<ptrdiff_t> atomic_ptrdiff_t;
537typedef atomic<intmax_t> atomic_intmax_t;
538typedef atomic<uintmax_t> atomic_uintmax_t;
539
Howard Hinnant71be7292010-09-27 21:17:38 +0000540// fences
541
Howard Hinnanteee2c142012-04-11 20:14:21 +0000542void atomic_thread_fence(memory_order m) noexcept;
543void atomic_signal_fence(memory_order m) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000544
545} // std
546
547*/
548
549#include <__config>
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000550#include <cstddef>
551#include <cstdint>
552#include <type_traits>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000553#include <version>
Howard Hinnant71be7292010-09-27 21:17:38 +0000554
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000555#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnant71be7292010-09-27 21:17:38 +0000556#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000557#endif
Howard Hinnant71be7292010-09-27 21:17:38 +0000558
Jonathan Roelofs39cb6bf2014-09-05 19:45:05 +0000559#ifdef _LIBCPP_HAS_NO_THREADS
Davide Italiano011f80a2019-03-05 18:40:49 +0000560# error <atomic> is not supported on this single threaded system
Eric Fiselier8020b6c2015-08-19 17:21:46 +0000561#endif
Davide Italiano011f80a2019-03-05 18:40:49 +0000562#ifdef _LIBCPP_HAS_NO_ATOMIC_HEADER
563# error <atomic> is not implemented
Eric Fiselier8020b6c2015-08-19 17:21:46 +0000564#endif
Volodymyr Sapsaif3ed1fd2018-05-15 22:38:31 +0000565#ifdef kill_dependency
Davide Italiano011f80a2019-03-05 18:40:49 +0000566# error C++ standard library is incompatible with <stdatomic.h>
Volodymyr Sapsaif3ed1fd2018-05-15 22:38:31 +0000567#endif
Jonathan Roelofs39cb6bf2014-09-05 19:45:05 +0000568
Eric Fiselierb5ab51d2017-01-13 23:45:39 +0000569#define _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m) \
570 _LIBCPP_DIAGNOSE_WARNING(__m == memory_order_consume || \
571 __m == memory_order_acquire || \
572 __m == memory_order_acq_rel, \
573 "memory order argument to atomic operation is invalid")
574
575#define _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m) \
576 _LIBCPP_DIAGNOSE_WARNING(__m == memory_order_release || \
577 __m == memory_order_acq_rel, \
578 "memory order argument to atomic operation is invalid")
579
580#define _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__m, __f) \
581 _LIBCPP_DIAGNOSE_WARNING(__f == memory_order_release || \
582 __f == memory_order_acq_rel, \
583 "memory order argument to atomic operation is invalid")
584
Howard Hinnant71be7292010-09-27 21:17:38 +0000585_LIBCPP_BEGIN_NAMESPACE_STD
586
Davide Italiano011f80a2019-03-05 18:40:49 +0000587#if _LIBCPP_STD_VER > 17
588
589enum class memory_order: unsigned {
590 relaxed, consume, acquire, release, acq_rel, seq_cst
591};
592
593inline constexpr auto memory_order_relaxed = memory_order::relaxed;
594inline constexpr auto memory_order_consume = memory_order::consume;
595inline constexpr auto memory_order_acquire = memory_order::acquire;
596inline constexpr auto memory_order_release = memory_order::release;
597inline constexpr auto memory_order_acq_rel = memory_order::acq_rel;
598inline constexpr auto memory_order_seq_cst = memory_order::seq_cst;
599
600static_assert((is_same<underlying_type<memory_order>::type,
601 unsigned>::value), "Underlying type differs from unsigned unexpectedly");
602
603#else
604
605typedef enum memory_order {
606 memory_order_relaxed, memory_order_consume, memory_order_acquire,
607 memory_order_release, memory_order_acq_rel, memory_order_seq_cst
Howard Hinnantdca6e712010-09-28 17:13:38 +0000608} memory_order;
609
Davide Italiano011f80a2019-03-05 18:40:49 +0000610static_assert((is_same<underlying_type<memory_order>::type,
611 unsigned>::value), "Underlying type differs from unsigned unexpectedly");
Davide Italiano31f218a2019-03-05 17:38:33 +0000612
Davide Italiano011f80a2019-03-05 18:40:49 +0000613#endif // _LIBCPP_STD_VER > 17
614
615typedef underlying_type<memory_order>::type __memory_order_underlying_t; // unsigned
616
617
618#if defined(_LIBCPP_HAS_GCC_ATOMIC_IMP) || \
619 defined(_LIBCPP_ATOMIC_ONLY_USE_BUILTINS)
620
621// [atomics.types.generic]p1 guarantees _Tp is trivially copyable. Because
622// the default operator= in an object is not volatile, a byte-by-byte copy
623// is required.
624template <typename _Tp, typename _Tv> _LIBCPP_INLINE_VISIBILITY
625typename enable_if<is_assignable<_Tp&, _Tv>::value>::type
626__cxx_atomic_assign_volatile(_Tp& __a_value, _Tv const& __val) {
627 __a_value = __val;
628}
629template <typename _Tp, typename _Tv> _LIBCPP_INLINE_VISIBILITY
630typename enable_if<is_assignable<_Tp&, _Tv>::value>::type
631__cxx_atomic_assign_volatile(_Tp volatile& __a_value, _Tv volatile const& __val) {
632 volatile char* __to = reinterpret_cast<volatile char*>(&__a_value);
633 volatile char* __end = __to + sizeof(_Tp);
634 volatile const char* __from = reinterpret_cast<volatile const char*>(&__val);
635 while (__to != __end)
636 *__to++ = *__from++;
637}
638
Davide Italiano31f218a2019-03-05 17:38:33 +0000639#endif
Louis Dionnea1ae0032019-03-04 15:26:27 +0000640
Davide Italiano011f80a2019-03-05 18:40:49 +0000641#if defined(_LIBCPP_HAS_GCC_ATOMIC_IMP)
642
643template <typename _Tp>
644struct __cxx_atomic_base_impl {
645
Eric Fiselier684aaca2015-10-14 08:36:22 +0000646 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier07b2b552016-11-18 06:42:17 +0000647#ifndef _LIBCPP_CXX03_LANG
Davide Italiano011f80a2019-03-05 18:40:49 +0000648 __cxx_atomic_base_impl() _NOEXCEPT = default;
Eric Fiselier684aaca2015-10-14 08:36:22 +0000649#else
Davide Italiano011f80a2019-03-05 18:40:49 +0000650 __cxx_atomic_base_impl() _NOEXCEPT : __a_value() {}
Eric Fiselier07b2b552016-11-18 06:42:17 +0000651#endif // _LIBCPP_CXX03_LANG
Davide Italiano011f80a2019-03-05 18:40:49 +0000652 _LIBCPP_CONSTEXPR explicit __cxx_atomic_base_impl(_Tp value) _NOEXCEPT
Eric Fiselier719e0442015-07-14 17:50:27 +0000653 : __a_value(value) {}
Marshall Clow290eb3f2015-01-11 06:15:59 +0000654 _Tp __a_value;
Dan Albert7b65ace2014-08-09 23:51:51 +0000655};
Dan Albert7b65ace2014-08-09 23:51:51 +0000656
Davide Italiano011f80a2019-03-05 18:40:49 +0000657_LIBCPP_INLINE_VISIBILITY inline _LIBCPP_CONSTEXPR int __to_gcc_order(memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000658 // Avoid switch statement to make this a constexpr.
659 return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
660 (__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
661 (__order == memory_order_release ? __ATOMIC_RELEASE:
662 (__order == memory_order_seq_cst ? __ATOMIC_SEQ_CST:
663 (__order == memory_order_acq_rel ? __ATOMIC_ACQ_REL:
664 __ATOMIC_CONSUME))));
665}
666
Davide Italiano011f80a2019-03-05 18:40:49 +0000667_LIBCPP_INLINE_VISIBILITY inline _LIBCPP_CONSTEXPR int __to_gcc_failure_order(memory_order __order) {
Dan Albert48815f22015-01-06 18:39:37 +0000668 // Avoid switch statement to make this a constexpr.
669 return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
670 (__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
671 (__order == memory_order_release ? __ATOMIC_RELAXED:
672 (__order == memory_order_seq_cst ? __ATOMIC_SEQ_CST:
673 (__order == memory_order_acq_rel ? __ATOMIC_ACQUIRE:
674 __ATOMIC_CONSUME))));
675}
676
Davide Italiano011f80a2019-03-05 18:40:49 +0000677template <typename _Tp>
678_LIBCPP_INLINE_VISIBILITY
679void __cxx_atomic_init(volatile __cxx_atomic_base_impl<_Tp>* __a, _Tp __val) {
680 __cxx_atomic_assign_volatile(__a->__a_value, __val);
681}
Dan Albert7b65ace2014-08-09 23:51:51 +0000682
683template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000684_LIBCPP_INLINE_VISIBILITY
685void __cxx_atomic_init(__cxx_atomic_base_impl<_Tp>* __a, _Tp __val) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000686 __a->__a_value = __val;
687}
688
Davide Italiano011f80a2019-03-05 18:40:49 +0000689_LIBCPP_INLINE_VISIBILITY inline
690void __cxx_atomic_thread_fence(memory_order __order) {
691 __atomic_thread_fence(__to_gcc_order(__order));
692}
693
694_LIBCPP_INLINE_VISIBILITY inline
695void __cxx_atomic_signal_fence(memory_order __order) {
696 __atomic_signal_fence(__to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000697}
698
699template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000700_LIBCPP_INLINE_VISIBILITY
701void __cxx_atomic_store(volatile __cxx_atomic_base_impl<_Tp>* __a, _Tp __val,
702 memory_order __order) {
Dan Albert48815f22015-01-06 18:39:37 +0000703 __atomic_store(&__a->__a_value, &__val,
Davide Italiano011f80a2019-03-05 18:40:49 +0000704 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000705}
706
707template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000708_LIBCPP_INLINE_VISIBILITY
709void __cxx_atomic_store(__cxx_atomic_base_impl<_Tp>* __a, _Tp __val,
710 memory_order __order) {
711 __atomic_store(&__a->__a_value, &__val,
712 __to_gcc_order(__order));
713}
714
715template <typename _Tp>
716_LIBCPP_INLINE_VISIBILITY
717_Tp __cxx_atomic_load(const volatile __cxx_atomic_base_impl<_Tp>* __a,
718 memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000719 _Tp __ret;
720 __atomic_load(&__a->__a_value, &__ret,
Davide Italiano011f80a2019-03-05 18:40:49 +0000721 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000722 return __ret;
723}
724
725template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000726_LIBCPP_INLINE_VISIBILITY
727_Tp __cxx_atomic_load(const __cxx_atomic_base_impl<_Tp>* __a, memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000728 _Tp __ret;
729 __atomic_load(&__a->__a_value, &__ret,
Davide Italiano011f80a2019-03-05 18:40:49 +0000730 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000731 return __ret;
732}
733
734template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000735_LIBCPP_INLINE_VISIBILITY
736_Tp __cxx_atomic_exchange(volatile __cxx_atomic_base_impl<_Tp>* __a,
737 _Tp __value, memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000738 _Tp __ret;
739 __atomic_exchange(&__a->__a_value, &__value, &__ret,
Davide Italiano011f80a2019-03-05 18:40:49 +0000740 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000741 return __ret;
742}
743
744template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000745_LIBCPP_INLINE_VISIBILITY
746_Tp __cxx_atomic_exchange(__cxx_atomic_base_impl<_Tp>* __a, _Tp __value,
747 memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000748 _Tp __ret;
749 __atomic_exchange(&__a->__a_value, &__value, &__ret,
Davide Italiano011f80a2019-03-05 18:40:49 +0000750 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000751 return __ret;
752}
753
754template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000755_LIBCPP_INLINE_VISIBILITY
756bool __cxx_atomic_compare_exchange_strong(
757 volatile __cxx_atomic_base_impl<_Tp>* __a, _Tp* __expected, _Tp __value,
JF Bastien6e412d92018-05-26 19:44:45 +0000758 memory_order __success, memory_order __failure) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000759 return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
760 false,
Davide Italiano011f80a2019-03-05 18:40:49 +0000761 __to_gcc_order(__success),
762 __to_gcc_failure_order(__failure));
Dan Albert7b65ace2014-08-09 23:51:51 +0000763}
764
765template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000766_LIBCPP_INLINE_VISIBILITY
767bool __cxx_atomic_compare_exchange_strong(
768 __cxx_atomic_base_impl<_Tp>* __a, _Tp* __expected, _Tp __value, memory_order __success,
JF Bastien6e412d92018-05-26 19:44:45 +0000769 memory_order __failure) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000770 return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
771 false,
Davide Italiano011f80a2019-03-05 18:40:49 +0000772 __to_gcc_order(__success),
773 __to_gcc_failure_order(__failure));
Dan Albert7b65ace2014-08-09 23:51:51 +0000774}
775
776template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000777_LIBCPP_INLINE_VISIBILITY
778bool __cxx_atomic_compare_exchange_weak(
779 volatile __cxx_atomic_base_impl<_Tp>* __a, _Tp* __expected, _Tp __value,
JF Bastien6e412d92018-05-26 19:44:45 +0000780 memory_order __success, memory_order __failure) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000781 return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
782 true,
Davide Italiano011f80a2019-03-05 18:40:49 +0000783 __to_gcc_order(__success),
784 __to_gcc_failure_order(__failure));
Dan Albert7b65ace2014-08-09 23:51:51 +0000785}
786
787template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000788_LIBCPP_INLINE_VISIBILITY
789bool __cxx_atomic_compare_exchange_weak(
790 __cxx_atomic_base_impl<_Tp>* __a, _Tp* __expected, _Tp __value, memory_order __success,
JF Bastien6e412d92018-05-26 19:44:45 +0000791 memory_order __failure) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000792 return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
793 true,
Davide Italiano011f80a2019-03-05 18:40:49 +0000794 __to_gcc_order(__success),
795 __to_gcc_failure_order(__failure));
Dan Albert7b65ace2014-08-09 23:51:51 +0000796}
797
798template <typename _Tp>
799struct __skip_amt { enum {value = 1}; };
800
801template <typename _Tp>
802struct __skip_amt<_Tp*> { enum {value = sizeof(_Tp)}; };
803
804// FIXME: Haven't figured out what the spec says about using arrays with
805// atomic_fetch_add. Force a failure rather than creating bad behavior.
806template <typename _Tp>
807struct __skip_amt<_Tp[]> { };
808template <typename _Tp, int n>
809struct __skip_amt<_Tp[n]> { };
810
811template <typename _Tp, typename _Td>
Davide Italiano011f80a2019-03-05 18:40:49 +0000812_LIBCPP_INLINE_VISIBILITY
813_Tp __cxx_atomic_fetch_add(volatile __cxx_atomic_base_impl<_Tp>* __a,
814 _Td __delta, memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000815 return __atomic_fetch_add(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
Davide Italiano011f80a2019-03-05 18:40:49 +0000816 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000817}
818
819template <typename _Tp, typename _Td>
Davide Italiano011f80a2019-03-05 18:40:49 +0000820_LIBCPP_INLINE_VISIBILITY
821_Tp __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp>* __a, _Td __delta,
822 memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000823 return __atomic_fetch_add(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
Davide Italiano011f80a2019-03-05 18:40:49 +0000824 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000825}
826
827template <typename _Tp, typename _Td>
Davide Italiano011f80a2019-03-05 18:40:49 +0000828_LIBCPP_INLINE_VISIBILITY
829_Tp __cxx_atomic_fetch_sub(volatile __cxx_atomic_base_impl<_Tp>* __a,
830 _Td __delta, memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000831 return __atomic_fetch_sub(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
Davide Italiano011f80a2019-03-05 18:40:49 +0000832 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000833}
834
835template <typename _Tp, typename _Td>
Davide Italiano011f80a2019-03-05 18:40:49 +0000836_LIBCPP_INLINE_VISIBILITY
837_Tp __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp>* __a, _Td __delta,
838 memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000839 return __atomic_fetch_sub(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
Davide Italiano011f80a2019-03-05 18:40:49 +0000840 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000841}
842
843template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000844_LIBCPP_INLINE_VISIBILITY
845_Tp __cxx_atomic_fetch_and(volatile __cxx_atomic_base_impl<_Tp>* __a,
846 _Tp __pattern, memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000847 return __atomic_fetch_and(&__a->__a_value, __pattern,
Davide Italiano011f80a2019-03-05 18:40:49 +0000848 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000849}
850
851template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000852_LIBCPP_INLINE_VISIBILITY
853_Tp __cxx_atomic_fetch_and(__cxx_atomic_base_impl<_Tp>* __a,
854 _Tp __pattern, memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000855 return __atomic_fetch_and(&__a->__a_value, __pattern,
Davide Italiano011f80a2019-03-05 18:40:49 +0000856 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000857}
858
859template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000860_LIBCPP_INLINE_VISIBILITY
861_Tp __cxx_atomic_fetch_or(volatile __cxx_atomic_base_impl<_Tp>* __a,
862 _Tp __pattern, memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000863 return __atomic_fetch_or(&__a->__a_value, __pattern,
Davide Italiano011f80a2019-03-05 18:40:49 +0000864 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000865}
866
867template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000868_LIBCPP_INLINE_VISIBILITY
869_Tp __cxx_atomic_fetch_or(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern,
870 memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000871 return __atomic_fetch_or(&__a->__a_value, __pattern,
Davide Italiano011f80a2019-03-05 18:40:49 +0000872 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000873}
874
875template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000876_LIBCPP_INLINE_VISIBILITY
877_Tp __cxx_atomic_fetch_xor(volatile __cxx_atomic_base_impl<_Tp>* __a,
878 _Tp __pattern, memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000879 return __atomic_fetch_xor(&__a->__a_value, __pattern,
Davide Italiano011f80a2019-03-05 18:40:49 +0000880 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000881}
882
883template <typename _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +0000884_LIBCPP_INLINE_VISIBILITY
885_Tp __cxx_atomic_fetch_xor(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern,
886 memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000887 return __atomic_fetch_xor(&__a->__a_value, __pattern,
Davide Italiano011f80a2019-03-05 18:40:49 +0000888 __to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000889}
Davide Italiano011f80a2019-03-05 18:40:49 +0000890
891#define __cxx_atomic_is_lock_free(__s) __atomic_is_lock_free(__s, 0)
892
893#elif defined(_LIBCPP_HAS_C_ATOMIC_IMP)
894
895template <typename _Tp>
896struct __cxx_atomic_base_impl {
897
898 _LIBCPP_INLINE_VISIBILITY
899#ifndef _LIBCPP_CXX03_LANG
900 __cxx_atomic_base_impl() _NOEXCEPT = default;
901#else
902 __cxx_atomic_base_impl() _NOEXCEPT : __a_value() {}
903#endif // _LIBCPP_CXX03_LANG
904 _LIBCPP_CONSTEXPR explicit __cxx_atomic_base_impl(_Tp value) _NOEXCEPT
905 : __a_value(value) {}
906 _Atomic(_Tp) __a_value;
907};
908
909#define __cxx_atomic_is_lock_free(__s) __c11_atomic_is_lock_free(__s)
910
911_LIBCPP_INLINE_VISIBILITY inline
912void __cxx_atomic_thread_fence(memory_order __order) {
913 __c11_atomic_thread_fence(static_cast<__memory_order_underlying_t>(__order));
914}
915
916_LIBCPP_INLINE_VISIBILITY inline
917void __cxx_atomic_signal_fence(memory_order __order) {
918 __c11_atomic_signal_fence(static_cast<__memory_order_underlying_t>(__order));
919}
920
921template<class _Tp>
922_LIBCPP_INLINE_VISIBILITY
923void __cxx_atomic_init(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __val) {
924 __c11_atomic_init(&__a->__a_value, __val);
925}
926template<class _Tp>
927_LIBCPP_INLINE_VISIBILITY
928void __cxx_atomic_init(__cxx_atomic_base_impl<_Tp> * __a, _Tp __val) {
929 __c11_atomic_init(&__a->__a_value, __val);
930}
931
932template<class _Tp>
933_LIBCPP_INLINE_VISIBILITY
934void __cxx_atomic_store(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __val, memory_order __order) {
935 __c11_atomic_store(&__a->__a_value, __val, static_cast<__memory_order_underlying_t>(__order));
936}
937template<class _Tp>
938_LIBCPP_INLINE_VISIBILITY
939void __cxx_atomic_store(__cxx_atomic_base_impl<_Tp> * __a, _Tp __val, memory_order __order) {
940 __c11_atomic_store(&__a->__a_value, __val, static_cast<__memory_order_underlying_t>(__order));
941}
942
943template<class _Tp>
944_LIBCPP_INLINE_VISIBILITY
945_Tp __cxx_atomic_load(__cxx_atomic_base_impl<_Tp> const volatile* __a, memory_order __order) {
946 using __ptr_type = typename remove_const<decltype(__a->__a_value)>::type*;
947 return __c11_atomic_load(const_cast<__ptr_type>(&__a->__a_value), static_cast<__memory_order_underlying_t>(__order));
948}
949template<class _Tp>
950_LIBCPP_INLINE_VISIBILITY
951_Tp __cxx_atomic_load(__cxx_atomic_base_impl<_Tp> const* __a, memory_order __order) {
952 using __ptr_type = typename remove_const<decltype(__a->__a_value)>::type*;
953 return __c11_atomic_load(const_cast<__ptr_type>(&__a->__a_value), static_cast<__memory_order_underlying_t>(__order));
954}
955
956template<class _Tp>
957_LIBCPP_INLINE_VISIBILITY
958_Tp __cxx_atomic_exchange(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __value, memory_order __order) {
959 return __c11_atomic_exchange(&__a->__a_value, __value, static_cast<__memory_order_underlying_t>(__order));
960}
961template<class _Tp>
962_LIBCPP_INLINE_VISIBILITY
963_Tp __cxx_atomic_exchange(__cxx_atomic_base_impl<_Tp> * __a, _Tp __value, memory_order __order) {
964 return __c11_atomic_exchange(&__a->__a_value, __value, static_cast<__memory_order_underlying_t>(__order));
965}
966
967template<class _Tp>
968_LIBCPP_INLINE_VISIBILITY
969bool __cxx_atomic_compare_exchange_strong(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure) {
970 return __c11_atomic_compare_exchange_strong(&__a->__a_value, __expected, __value, static_cast<__memory_order_underlying_t>(__success), static_cast<__memory_order_underlying_t>(__failure));
971}
972template<class _Tp>
973_LIBCPP_INLINE_VISIBILITY
974bool __cxx_atomic_compare_exchange_strong(__cxx_atomic_base_impl<_Tp> * __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure) {
975 return __c11_atomic_compare_exchange_strong(&__a->__a_value, __expected, __value, static_cast<__memory_order_underlying_t>(__success), static_cast<__memory_order_underlying_t>(__failure));
976}
977
978template<class _Tp>
979_LIBCPP_INLINE_VISIBILITY
980bool __cxx_atomic_compare_exchange_weak(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure) {
981 return __c11_atomic_compare_exchange_weak(&__a->__a_value, __expected, __value, static_cast<__memory_order_underlying_t>(__success), static_cast<__memory_order_underlying_t>(__failure));
982}
983template<class _Tp>
984_LIBCPP_INLINE_VISIBILITY
985bool __cxx_atomic_compare_exchange_weak(__cxx_atomic_base_impl<_Tp> * __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure) {
986 return __c11_atomic_compare_exchange_weak(&__a->__a_value, __expected, __value, static_cast<__memory_order_underlying_t>(__success), static_cast<__memory_order_underlying_t>(__failure));
987}
988
989template<class _Tp>
990_LIBCPP_INLINE_VISIBILITY
991_Tp __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __delta, memory_order __order) {
992 return __c11_atomic_fetch_add(&__a->__a_value, __delta, static_cast<__memory_order_underlying_t>(__order));
993}
994template<class _Tp>
995_LIBCPP_INLINE_VISIBILITY
996_Tp __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp> * __a, _Tp __delta, memory_order __order) {
997 return __c11_atomic_fetch_add(&__a->__a_value, __delta, static_cast<__memory_order_underlying_t>(__order));
998}
999
1000template<class _Tp>
1001_LIBCPP_INLINE_VISIBILITY
1002_Tp* __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp*> volatile* __a, ptrdiff_t __delta, memory_order __order) {
1003 return __c11_atomic_fetch_add(&__a->__a_value, __delta, static_cast<__memory_order_underlying_t>(__order));
1004}
1005template<class _Tp>
1006_LIBCPP_INLINE_VISIBILITY
1007_Tp* __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp*> * __a, ptrdiff_t __delta, memory_order __order) {
1008 return __c11_atomic_fetch_add(&__a->__a_value, __delta, static_cast<__memory_order_underlying_t>(__order));
1009}
1010
1011template<class _Tp>
1012_LIBCPP_INLINE_VISIBILITY
1013_Tp __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __delta, memory_order __order) {
1014 return __c11_atomic_fetch_sub(&__a->__a_value, __delta, static_cast<__memory_order_underlying_t>(__order));
1015}
1016template<class _Tp>
1017_LIBCPP_INLINE_VISIBILITY
1018_Tp __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp> * __a, _Tp __delta, memory_order __order) {
1019 return __c11_atomic_fetch_sub(&__a->__a_value, __delta, static_cast<__memory_order_underlying_t>(__order));
1020}
1021template<class _Tp>
1022_LIBCPP_INLINE_VISIBILITY
1023_Tp* __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp*> volatile* __a, ptrdiff_t __delta, memory_order __order) {
1024 return __c11_atomic_fetch_sub(&__a->__a_value, __delta, static_cast<__memory_order_underlying_t>(__order));
1025}
1026template<class _Tp>
1027_LIBCPP_INLINE_VISIBILITY
1028_Tp* __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp*> * __a, ptrdiff_t __delta, memory_order __order) {
1029 return __c11_atomic_fetch_sub(&__a->__a_value, __delta, static_cast<__memory_order_underlying_t>(__order));
1030}
1031
1032template<class _Tp>
1033_LIBCPP_INLINE_VISIBILITY
1034_Tp __cxx_atomic_fetch_and(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) {
1035 return __c11_atomic_fetch_and(&__a->__a_value, __pattern, static_cast<__memory_order_underlying_t>(__order));
1036}
1037template<class _Tp>
1038_LIBCPP_INLINE_VISIBILITY
1039_Tp __cxx_atomic_fetch_and(__cxx_atomic_base_impl<_Tp> * __a, _Tp __pattern, memory_order __order) {
1040 return __c11_atomic_fetch_and(&__a->__a_value, __pattern, static_cast<__memory_order_underlying_t>(__order));
1041}
1042
1043template<class _Tp>
1044_LIBCPP_INLINE_VISIBILITY
1045_Tp __cxx_atomic_fetch_or(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) {
1046 return __c11_atomic_fetch_or(&__a->__a_value, __pattern, static_cast<__memory_order_underlying_t>(__order));
1047}
1048template<class _Tp>
1049_LIBCPP_INLINE_VISIBILITY
1050_Tp __cxx_atomic_fetch_or(__cxx_atomic_base_impl<_Tp> * __a, _Tp __pattern, memory_order __order) {
1051 return __c11_atomic_fetch_or(&__a->__a_value, __pattern, static_cast<__memory_order_underlying_t>(__order));
1052}
1053
1054template<class _Tp>
1055_LIBCPP_INLINE_VISIBILITY
1056_Tp __cxx_atomic_fetch_xor(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) {
1057 return __c11_atomic_fetch_xor(&__a->__a_value, __pattern, static_cast<__memory_order_underlying_t>(__order));
1058}
1059template<class _Tp>
1060_LIBCPP_INLINE_VISIBILITY
1061_Tp __cxx_atomic_fetch_xor(__cxx_atomic_base_impl<_Tp> * __a, _Tp __pattern, memory_order __order) {
1062 return __c11_atomic_fetch_xor(&__a->__a_value, __pattern, static_cast<__memory_order_underlying_t>(__order));
1063}
1064
1065#endif // _LIBCPP_HAS_GCC_ATOMIC_IMP, _LIBCPP_HAS_C_ATOMIC_IMP
Dan Albert7b65ace2014-08-09 23:51:51 +00001066
Howard Hinnantdca6e712010-09-28 17:13:38 +00001067template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001068_LIBCPP_INLINE_VISIBILITY
1069_Tp kill_dependency(_Tp __y) _NOEXCEPT
Howard Hinnantdca6e712010-09-28 17:13:38 +00001070{
1071 return __y;
1072}
Howard Hinnant71be7292010-09-27 21:17:38 +00001073
Eric Fiselierbed42df2017-04-20 23:22:46 +00001074#if defined(__CLANG_ATOMIC_BOOL_LOCK_FREE)
1075# define ATOMIC_BOOL_LOCK_FREE __CLANG_ATOMIC_BOOL_LOCK_FREE
1076# define ATOMIC_CHAR_LOCK_FREE __CLANG_ATOMIC_CHAR_LOCK_FREE
1077# define ATOMIC_CHAR16_T_LOCK_FREE __CLANG_ATOMIC_CHAR16_T_LOCK_FREE
1078# define ATOMIC_CHAR32_T_LOCK_FREE __CLANG_ATOMIC_CHAR32_T_LOCK_FREE
1079# define ATOMIC_WCHAR_T_LOCK_FREE __CLANG_ATOMIC_WCHAR_T_LOCK_FREE
1080# define ATOMIC_SHORT_LOCK_FREE __CLANG_ATOMIC_SHORT_LOCK_FREE
1081# define ATOMIC_INT_LOCK_FREE __CLANG_ATOMIC_INT_LOCK_FREE
1082# define ATOMIC_LONG_LOCK_FREE __CLANG_ATOMIC_LONG_LOCK_FREE
1083# define ATOMIC_LLONG_LOCK_FREE __CLANG_ATOMIC_LLONG_LOCK_FREE
1084# define ATOMIC_POINTER_LOCK_FREE __CLANG_ATOMIC_POINTER_LOCK_FREE
Davide Italiano011f80a2019-03-05 18:40:49 +00001085#elif defined(__GCC_ATOMIC_BOOL_LOCK_FREE)
Eric Fiselierbed42df2017-04-20 23:22:46 +00001086# define ATOMIC_BOOL_LOCK_FREE __GCC_ATOMIC_BOOL_LOCK_FREE
1087# define ATOMIC_CHAR_LOCK_FREE __GCC_ATOMIC_CHAR_LOCK_FREE
1088# define ATOMIC_CHAR16_T_LOCK_FREE __GCC_ATOMIC_CHAR16_T_LOCK_FREE
1089# define ATOMIC_CHAR32_T_LOCK_FREE __GCC_ATOMIC_CHAR32_T_LOCK_FREE
1090# define ATOMIC_WCHAR_T_LOCK_FREE __GCC_ATOMIC_WCHAR_T_LOCK_FREE
1091# define ATOMIC_SHORT_LOCK_FREE __GCC_ATOMIC_SHORT_LOCK_FREE
1092# define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE
1093# define ATOMIC_LONG_LOCK_FREE __GCC_ATOMIC_LONG_LOCK_FREE
1094# define ATOMIC_LLONG_LOCK_FREE __GCC_ATOMIC_LLONG_LOCK_FREE
1095# define ATOMIC_POINTER_LOCK_FREE __GCC_ATOMIC_POINTER_LOCK_FREE
1096#endif
JF Bastienfdb42c22016-03-25 15:48:21 +00001097
Davide Italiano011f80a2019-03-05 18:40:49 +00001098#ifdef _LIBCPP_ATOMIC_ONLY_USE_BUILTINS
1099
1100template<typename _Tp>
1101struct __cxx_atomic_lock_impl {
1102
1103 _LIBCPP_INLINE_VISIBILITY
1104 __cxx_atomic_lock_impl() _NOEXCEPT
1105 : __a_value(), __a_lock(0) {}
1106 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR explicit
1107 __cxx_atomic_lock_impl(_Tp value) _NOEXCEPT
1108 : __a_value(value), __a_lock(0) {}
1109
1110 _Tp __a_value;
1111 mutable __cxx_atomic_base_impl<_LIBCPP_ATOMIC_FLAG_TYPE> __a_lock;
1112
1113 _LIBCPP_INLINE_VISIBILITY void __lock() const volatile {
1114 while(1 == __cxx_atomic_exchange(&__a_lock, _LIBCPP_ATOMIC_FLAG_TYPE(true), memory_order_acquire))
1115 /*spin*/;
1116 }
1117 _LIBCPP_INLINE_VISIBILITY void __lock() const {
1118 while(1 == __cxx_atomic_exchange(&__a_lock, _LIBCPP_ATOMIC_FLAG_TYPE(true), memory_order_acquire))
1119 /*spin*/;
1120 }
1121 _LIBCPP_INLINE_VISIBILITY void __unlock() const volatile {
1122 __cxx_atomic_store(&__a_lock, _LIBCPP_ATOMIC_FLAG_TYPE(false), memory_order_release);
1123 }
1124 _LIBCPP_INLINE_VISIBILITY void __unlock() const {
1125 __cxx_atomic_store(&__a_lock, _LIBCPP_ATOMIC_FLAG_TYPE(false), memory_order_release);
1126 }
1127 _LIBCPP_INLINE_VISIBILITY _Tp __read() const volatile {
1128 __lock();
1129 _Tp __old;
1130 __cxx_atomic_assign_volatile(__old, __a_value);
1131 __unlock();
1132 return __old;
1133 }
1134 _LIBCPP_INLINE_VISIBILITY _Tp __read() const {
1135 __lock();
1136 _Tp __old = __a_value;
1137 __unlock();
1138 return __old;
1139 }
1140};
1141
1142template <typename _Tp>
1143_LIBCPP_INLINE_VISIBILITY
1144void __cxx_atomic_init(volatile __cxx_atomic_lock_impl<_Tp>* __a, _Tp __val) {
1145 __cxx_atomic_assign_volatile(__a->__a_value, __val);
1146}
1147template <typename _Tp>
1148_LIBCPP_INLINE_VISIBILITY
1149void __cxx_atomic_init(__cxx_atomic_lock_impl<_Tp>* __a, _Tp __val) {
1150 __a->__a_value = __val;
1151}
1152
1153template <typename _Tp>
1154_LIBCPP_INLINE_VISIBILITY
1155void __cxx_atomic_store(volatile __cxx_atomic_lock_impl<_Tp>* __a, _Tp __val, memory_order) {
1156 __a->__lock();
1157 __cxx_atomic_assign_volatile(__a->__a_value, __val);
1158 __a->__unlock();
1159}
1160template <typename _Tp>
1161_LIBCPP_INLINE_VISIBILITY
1162void __cxx_atomic_store(__cxx_atomic_lock_impl<_Tp>* __a, _Tp __val, memory_order) {
1163 __a->__lock();
1164 __a->__a_value = __val;
1165 __a->__unlock();
1166}
1167
1168template <typename _Tp>
1169_LIBCPP_INLINE_VISIBILITY
1170_Tp __cxx_atomic_load(const volatile __cxx_atomic_lock_impl<_Tp>* __a, memory_order) {
1171 return __a->__read();
1172}
1173template <typename _Tp>
1174_LIBCPP_INLINE_VISIBILITY
1175_Tp __cxx_atomic_load(const __cxx_atomic_lock_impl<_Tp>* __a, memory_order) {
1176 return __a->__read();
1177}
1178
1179template <typename _Tp>
1180_LIBCPP_INLINE_VISIBILITY
1181_Tp __cxx_atomic_exchange(volatile __cxx_atomic_lock_impl<_Tp>* __a, _Tp __value, memory_order) {
1182 __a->__lock();
1183 _Tp __old;
1184 __cxx_atomic_assign_volatile(__old, __a->__a_value);
1185 __cxx_atomic_assign_volatile(__a->__a_value, __value);
1186 __a->__unlock();
1187 return __old;
1188}
1189template <typename _Tp>
1190_LIBCPP_INLINE_VISIBILITY
1191_Tp __cxx_atomic_exchange(__cxx_atomic_lock_impl<_Tp>* __a, _Tp __value, memory_order) {
1192 __a->__lock();
1193 _Tp __old = __a->__a_value;
1194 __a->__a_value = __value;
1195 __a->__unlock();
1196 return __old;
1197}
1198
1199template <typename _Tp>
1200_LIBCPP_INLINE_VISIBILITY
1201bool __cxx_atomic_compare_exchange_strong(volatile __cxx_atomic_lock_impl<_Tp>* __a,
1202 _Tp* __expected, _Tp __value, memory_order, memory_order) {
1203 __a->__lock();
1204 _Tp temp;
1205 __cxx_atomic_assign_volatile(temp, __a->__a_value);
1206 bool __ret = temp == *__expected;
1207 if(__ret)
1208 __cxx_atomic_assign_volatile(__a->__a_value, __value);
1209 else
1210 __cxx_atomic_assign_volatile(*__expected, __a->__a_value);
1211 __a->__unlock();
1212 return __ret;
1213}
1214template <typename _Tp>
1215_LIBCPP_INLINE_VISIBILITY
1216bool __cxx_atomic_compare_exchange_strong(__cxx_atomic_lock_impl<_Tp>* __a,
1217 _Tp* __expected, _Tp __value, memory_order, memory_order) {
1218 __a->__lock();
1219 bool __ret = __a->__a_value == *__expected;
1220 if(__ret)
1221 __a->__a_value = __value;
1222 else
1223 *__expected = __a->__a_value;
1224 __a->__unlock();
1225 return __ret;
1226}
1227
1228template <typename _Tp>
1229_LIBCPP_INLINE_VISIBILITY
1230bool __cxx_atomic_compare_exchange_weak(volatile __cxx_atomic_lock_impl<_Tp>* __a,
1231 _Tp* __expected, _Tp __value, memory_order, memory_order) {
1232 __a->__lock();
1233 _Tp temp;
1234 __cxx_atomic_assign_volatile(temp, __a->__a_value);
1235 bool __ret = temp == *__expected;
1236 if(__ret)
1237 __cxx_atomic_assign_volatile(__a->__a_value, __value);
1238 else
1239 __cxx_atomic_assign_volatile(*__expected, __a->__a_value);
1240 __a->__unlock();
1241 return __ret;
1242}
1243template <typename _Tp>
1244_LIBCPP_INLINE_VISIBILITY
1245bool __cxx_atomic_compare_exchange_weak(__cxx_atomic_lock_impl<_Tp>* __a,
1246 _Tp* __expected, _Tp __value, memory_order, memory_order) {
1247 __a->__lock();
1248 bool __ret = __a->__a_value == *__expected;
1249 if(__ret)
1250 __a->__a_value = __value;
1251 else
1252 *__expected = __a->__a_value;
1253 __a->__unlock();
1254 return __ret;
1255}
1256
1257template <typename _Tp, typename _Td>
1258_LIBCPP_INLINE_VISIBILITY
1259_Tp __cxx_atomic_fetch_add(volatile __cxx_atomic_lock_impl<_Tp>* __a,
1260 _Td __delta, memory_order) {
1261 __a->__lock();
1262 _Tp __old;
1263 __cxx_atomic_assign_volatile(__old, __a->__a_value);
1264 __cxx_atomic_assign_volatile(__a->__a_value, _Tp(__old + __delta));
1265 __a->__unlock();
1266 return __old;
1267}
1268template <typename _Tp, typename _Td>
1269_LIBCPP_INLINE_VISIBILITY
1270_Tp __cxx_atomic_fetch_add(__cxx_atomic_lock_impl<_Tp>* __a,
1271 _Td __delta, memory_order) {
1272 __a->__lock();
1273 _Tp __old = __a->__a_value;
1274 __a->__a_value += __delta;
1275 __a->__unlock();
1276 return __old;
1277}
1278
1279template <typename _Tp, typename _Td>
1280_LIBCPP_INLINE_VISIBILITY
1281_Tp* __cxx_atomic_fetch_add(volatile __cxx_atomic_lock_impl<_Tp*>* __a,
1282 ptrdiff_t __delta, memory_order) {
1283 __a->__lock();
1284 _Tp* __old;
1285 __cxx_atomic_assign_volatile(__old, __a->__a_value);
1286 __cxx_atomic_assign_volatile(__a->__a_value, __old + __delta);
1287 __a->__unlock();
1288 return __old;
1289}
1290template <typename _Tp, typename _Td>
1291_LIBCPP_INLINE_VISIBILITY
1292_Tp* __cxx_atomic_fetch_add(__cxx_atomic_lock_impl<_Tp*>* __a,
1293 ptrdiff_t __delta, memory_order) {
1294 __a->__lock();
1295 _Tp* __old = __a->__a_value;
1296 __a->__a_value += __delta;
1297 __a->__unlock();
1298 return __old;
1299}
1300
1301template <typename _Tp, typename _Td>
1302_LIBCPP_INLINE_VISIBILITY
1303_Tp __cxx_atomic_fetch_sub(volatile __cxx_atomic_lock_impl<_Tp>* __a,
1304 _Td __delta, memory_order) {
1305 __a->__lock();
1306 _Tp __old;
1307 __cxx_atomic_assign_volatile(__old, __a->__a_value);
1308 __cxx_atomic_assign_volatile(__a->__a_value, _Tp(__old - __delta));
1309 __a->__unlock();
1310 return __old;
1311}
1312template <typename _Tp, typename _Td>
1313_LIBCPP_INLINE_VISIBILITY
1314_Tp __cxx_atomic_fetch_sub(__cxx_atomic_lock_impl<_Tp>* __a,
1315 _Td __delta, memory_order) {
1316 __a->__lock();
1317 _Tp __old = __a->__a_value;
1318 __a->__a_value -= __delta;
1319 __a->__unlock();
1320 return __old;
1321}
1322
1323template <typename _Tp>
1324_LIBCPP_INLINE_VISIBILITY
1325_Tp __cxx_atomic_fetch_and(volatile __cxx_atomic_lock_impl<_Tp>* __a,
1326 _Tp __pattern, memory_order) {
1327 __a->__lock();
1328 _Tp __old;
1329 __cxx_atomic_assign_volatile(__old, __a->__a_value);
1330 __cxx_atomic_assign_volatile(__a->__a_value, _Tp(__old & __pattern));
1331 __a->__unlock();
1332 return __old;
1333}
1334template <typename _Tp>
1335_LIBCPP_INLINE_VISIBILITY
1336_Tp __cxx_atomic_fetch_and(__cxx_atomic_lock_impl<_Tp>* __a,
1337 _Tp __pattern, memory_order) {
1338 __a->__lock();
1339 _Tp __old = __a->__a_value;
1340 __a->__a_value &= __pattern;
1341 __a->__unlock();
1342 return __old;
1343}
1344
1345template <typename _Tp>
1346_LIBCPP_INLINE_VISIBILITY
1347_Tp __cxx_atomic_fetch_or(volatile __cxx_atomic_lock_impl<_Tp>* __a,
1348 _Tp __pattern, memory_order) {
1349 __a->__lock();
1350 _Tp __old;
1351 __cxx_atomic_assign_volatile(__old, __a->__a_value);
1352 __cxx_atomic_assign_volatile(__a->__a_value, _Tp(__old | __pattern));
1353 __a->__unlock();
1354 return __old;
1355}
1356template <typename _Tp>
1357_LIBCPP_INLINE_VISIBILITY
1358_Tp __cxx_atomic_fetch_or(__cxx_atomic_lock_impl<_Tp>* __a,
1359 _Tp __pattern, memory_order) {
1360 __a->__lock();
1361 _Tp __old = __a->__a_value;
1362 __a->__a_value |= __pattern;
1363 __a->__unlock();
1364 return __old;
1365}
1366
1367template <typename _Tp>
1368_LIBCPP_INLINE_VISIBILITY
1369_Tp __cxx_atomic_fetch_xor(volatile __cxx_atomic_lock_impl<_Tp>* __a,
1370 _Tp __pattern, memory_order) {
1371 __a->__lock();
1372 _Tp __old;
1373 __cxx_atomic_assign_volatile(__old, __a->__a_value);
1374 __cxx_atomic_assign_volatile(__a->__a_value, _Tp(__old ^ __pattern));
1375 __a->__unlock();
1376 return __old;
1377}
1378template <typename _Tp>
1379_LIBCPP_INLINE_VISIBILITY
1380_Tp __cxx_atomic_fetch_xor(__cxx_atomic_lock_impl<_Tp>* __a,
1381 _Tp __pattern, memory_order) {
1382 __a->__lock();
1383 _Tp __old = __a->__a_value;
1384 __a->__a_value ^= __pattern;
1385 __a->__unlock();
1386 return __old;
1387}
1388
1389#ifdef __cpp_lib_atomic_is_always_lock_free
1390
1391template<typename _Tp> struct __cxx_is_always_lock_free {
1392 enum { __value = __atomic_always_lock_free(sizeof(_Tp), 0) }; };
1393
1394#else
1395
1396template<typename _Tp> struct __cxx_is_always_lock_free { enum { __value = false }; };
1397// Implementations must match the C ATOMIC_*_LOCK_FREE macro values.
1398template<> struct __cxx_is_always_lock_free<bool> { enum { __value = 2 == ATOMIC_BOOL_LOCK_FREE }; };
1399template<> struct __cxx_is_always_lock_free<char> { enum { __value = 2 == ATOMIC_CHAR_LOCK_FREE }; };
1400template<> struct __cxx_is_always_lock_free<signed char> { enum { __value = 2 == ATOMIC_CHAR_LOCK_FREE }; };
1401template<> struct __cxx_is_always_lock_free<unsigned char> { enum { __value = 2 == ATOMIC_CHAR_LOCK_FREE }; };
1402template<> struct __cxx_is_always_lock_free<char16_t> { enum { __value = 2 == ATOMIC_CHAR16_T_LOCK_FREE }; };
1403template<> struct __cxx_is_always_lock_free<char32_t> { enum { __value = 2 == ATOMIC_CHAR32_T_LOCK_FREE }; };
1404template<> struct __cxx_is_always_lock_free<wchar_t> { enum { __value = 2 == ATOMIC_WCHAR_T_LOCK_FREE }; };
1405template<> struct __cxx_is_always_lock_free<short> { enum { __value = 2 == ATOMIC_SHORT_LOCK_FREE }; };
1406template<> struct __cxx_is_always_lock_free<unsigned short> { enum { __value = 2 == ATOMIC_SHORT_LOCK_FREE }; };
1407template<> struct __cxx_is_always_lock_free<int> { enum { __value = 2 == ATOMIC_INT_LOCK_FREE }; };
1408template<> struct __cxx_is_always_lock_free<unsigned int> { enum { __value = 2 == ATOMIC_INT_LOCK_FREE }; };
1409template<> struct __cxx_is_always_lock_free<long> { enum { __value = 2 == ATOMIC_LONG_LOCK_FREE }; };
1410template<> struct __cxx_is_always_lock_free<unsigned long> { enum { __value = 2 == ATOMIC_LONG_LOCK_FREE }; };
1411template<> struct __cxx_is_always_lock_free<long long> { enum { __value = 2 == ATOMIC_LLONG_LOCK_FREE }; };
1412template<> struct __cxx_is_always_lock_free<unsigned long long> { enum { __value = 2 == ATOMIC_LLONG_LOCK_FREE }; };
1413template<typename _Tp> struct __cxx_is_always_lock_free<_Tp*> { enum { __value = 2 == ATOMIC_POINTER_LOCK_FREE }; };
1414template<> struct __cxx_is_always_lock_free<std::nullptr_t> { enum { __value = 2 == ATOMIC_POINTER_LOCK_FREE }; };
1415
1416#endif //__cpp_lib_atomic_is_always_lock_free
1417
1418template <typename _Tp,
1419 typename _Base = typename conditional<__cxx_is_always_lock_free<_Tp>::__value,
1420 __cxx_atomic_base_impl<_Tp>,
1421 __cxx_atomic_lock_impl<_Tp> >::type>
1422#else
1423template <typename _Tp,
1424 typename _Base = __cxx_atomic_base_impl<_Tp> >
1425#endif //_LIBCPP_ATOMIC_ONLY_USE_BUILTINS
1426struct __cxx_atomic_impl : public _Base {
1427
1428#if _GNUC_VER >= 501
1429 static_assert(is_trivially_copyable<_Tp>::value,
1430 "std::atomic<Tp> requires that 'Tp' be a trivially copyable type");
1431#endif
1432
1433 _LIBCPP_INLINE_VISIBILITY __cxx_atomic_impl() _NOEXCEPT _LIBCPP_DEFAULT
1434 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR explicit __cxx_atomic_impl(_Tp value) _NOEXCEPT
1435 : _Base(value) {}
1436};
1437
Howard Hinnant138f5922010-12-07 20:46:14 +00001438// general atomic<T>
1439
1440template <class _Tp, bool = is_integral<_Tp>::value && !is_same<_Tp, bool>::value>
1441struct __atomic_base // false
1442{
Davide Italiano011f80a2019-03-05 18:40:49 +00001443 mutable __cxx_atomic_impl<_Tp> __a_;
Howard Hinnant138f5922010-12-07 20:46:14 +00001444
JF Bastienfdb42c22016-03-25 15:48:21 +00001445#if defined(__cpp_lib_atomic_is_always_lock_free)
1446 static _LIBCPP_CONSTEXPR bool is_always_lock_free = __atomic_always_lock_free(sizeof(__a_), 0);
1447#endif
1448
Howard Hinnant138f5922010-12-07 20:46:14 +00001449 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001450 bool is_lock_free() const volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001451 {return __cxx_atomic_is_lock_free(sizeof(_Tp));}
Howard Hinnant138f5922010-12-07 20:46:14 +00001452 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001453 bool is_lock_free() const _NOEXCEPT
Eric Fiselier3fd22c22015-06-13 00:23:07 +00001454 {return static_cast<__atomic_base const volatile*>(this)->is_lock_free();}
Howard Hinnant138f5922010-12-07 20:46:14 +00001455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001456 void store(_Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001457 _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m)
Davide Italiano011f80a2019-03-05 18:40:49 +00001458 {__cxx_atomic_store(&__a_, __d, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001459 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001460 void store(_Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001461 _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m)
Davide Italiano011f80a2019-03-05 18:40:49 +00001462 {__cxx_atomic_store(&__a_, __d, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001463 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001464 _Tp load(memory_order __m = memory_order_seq_cst) const volatile _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001465 _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m)
Davide Italiano011f80a2019-03-05 18:40:49 +00001466 {return __cxx_atomic_load(&__a_, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001467 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001468 _Tp load(memory_order __m = memory_order_seq_cst) const _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001469 _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m)
Davide Italiano011f80a2019-03-05 18:40:49 +00001470 {return __cxx_atomic_load(&__a_, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001471 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001472 operator _Tp() const volatile _NOEXCEPT {return load();}
Howard Hinnant138f5922010-12-07 20:46:14 +00001473 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001474 operator _Tp() const _NOEXCEPT {return load();}
Howard Hinnant138f5922010-12-07 20:46:14 +00001475 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001476 _Tp exchange(_Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001477 {return __cxx_atomic_exchange(&__a_, __d, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001478 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001479 _Tp exchange(_Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001480 {return __cxx_atomic_exchange(&__a_, __d, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001481 _LIBCPP_INLINE_VISIBILITY
1482 bool compare_exchange_weak(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001483 memory_order __s, memory_order __f) volatile _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001484 _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
Davide Italiano011f80a2019-03-05 18:40:49 +00001485 {return __cxx_atomic_compare_exchange_weak(&__a_, &__e, __d, __s, __f);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001486 _LIBCPP_INLINE_VISIBILITY
1487 bool compare_exchange_weak(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001488 memory_order __s, memory_order __f) _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001489 _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
Davide Italiano011f80a2019-03-05 18:40:49 +00001490 {return __cxx_atomic_compare_exchange_weak(&__a_, &__e, __d, __s, __f);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001491 _LIBCPP_INLINE_VISIBILITY
1492 bool compare_exchange_strong(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001493 memory_order __s, memory_order __f) volatile _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001494 _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
Davide Italiano011f80a2019-03-05 18:40:49 +00001495 {return __cxx_atomic_compare_exchange_strong(&__a_, &__e, __d, __s, __f);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001496 _LIBCPP_INLINE_VISIBILITY
1497 bool compare_exchange_strong(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001498 memory_order __s, memory_order __f) _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001499 _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
Davide Italiano011f80a2019-03-05 18:40:49 +00001500 {return __cxx_atomic_compare_exchange_strong(&__a_, &__e, __d, __s, __f);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001501 _LIBCPP_INLINE_VISIBILITY
1502 bool compare_exchange_weak(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001503 memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001504 {return __cxx_atomic_compare_exchange_weak(&__a_, &__e, __d, __m, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001505 _LIBCPP_INLINE_VISIBILITY
1506 bool compare_exchange_weak(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001507 memory_order __m = memory_order_seq_cst) _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001508 {return __cxx_atomic_compare_exchange_weak(&__a_, &__e, __d, __m, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001509 _LIBCPP_INLINE_VISIBILITY
1510 bool compare_exchange_strong(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001511 memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001512 {return __cxx_atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001513 _LIBCPP_INLINE_VISIBILITY
1514 bool compare_exchange_strong(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001515 memory_order __m = memory_order_seq_cst) _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001516 {return __cxx_atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001517
1518 _LIBCPP_INLINE_VISIBILITY
Davide Italiano011f80a2019-03-05 18:40:49 +00001519 __atomic_base() _NOEXCEPT _LIBCPP_DEFAULT
Howard Hinnant3d284222013-05-02 20:18:43 +00001520
Davide Italiano011f80a2019-03-05 18:40:49 +00001521 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1522 __atomic_base(_Tp __d) _NOEXCEPT : __a_(__d) {}
1523
Eric Fiselier2d8515f2017-01-06 20:58:25 +00001524#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant138f5922010-12-07 20:46:14 +00001525 __atomic_base(const __atomic_base&) = delete;
1526 __atomic_base& operator=(const __atomic_base&) = delete;
1527 __atomic_base& operator=(const __atomic_base&) volatile = delete;
Eric Fiselier2d8515f2017-01-06 20:58:25 +00001528#else
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001529private:
1530 __atomic_base(const __atomic_base&);
1531 __atomic_base& operator=(const __atomic_base&);
1532 __atomic_base& operator=(const __atomic_base&) volatile;
Eric Fiselier2d8515f2017-01-06 20:58:25 +00001533#endif
Howard Hinnant138f5922010-12-07 20:46:14 +00001534};
1535
JF Bastienfdb42c22016-03-25 15:48:21 +00001536#if defined(__cpp_lib_atomic_is_always_lock_free)
1537template <class _Tp, bool __b>
1538_LIBCPP_CONSTEXPR bool __atomic_base<_Tp, __b>::is_always_lock_free;
1539#endif
1540
Howard Hinnant138f5922010-12-07 20:46:14 +00001541// atomic<Integral>
1542
1543template <class _Tp>
1544struct __atomic_base<_Tp, true>
1545 : public __atomic_base<_Tp, false>
1546{
1547 typedef __atomic_base<_Tp, false> __base;
1548 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3d284222013-05-02 20:18:43 +00001549 __atomic_base() _NOEXCEPT _LIBCPP_DEFAULT
Howard Hinnant138f5922010-12-07 20:46:14 +00001550 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001551 _LIBCPP_CONSTEXPR __atomic_base(_Tp __d) _NOEXCEPT : __base(__d) {}
Howard Hinnant138f5922010-12-07 20:46:14 +00001552
1553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001554 _Tp fetch_add(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001555 {return __cxx_atomic_fetch_add(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001556 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001557 _Tp fetch_add(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001558 {return __cxx_atomic_fetch_add(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001559 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001560 _Tp fetch_sub(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001561 {return __cxx_atomic_fetch_sub(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001562 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001563 _Tp fetch_sub(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001564 {return __cxx_atomic_fetch_sub(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001565 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001566 _Tp fetch_and(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001567 {return __cxx_atomic_fetch_and(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001568 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001569 _Tp fetch_and(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001570 {return __cxx_atomic_fetch_and(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001572 _Tp fetch_or(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001573 {return __cxx_atomic_fetch_or(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001574 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001575 _Tp fetch_or(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001576 {return __cxx_atomic_fetch_or(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001578 _Tp fetch_xor(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001579 {return __cxx_atomic_fetch_xor(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001580 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001581 _Tp fetch_xor(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001582 {return __cxx_atomic_fetch_xor(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001583
1584 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001585 _Tp operator++(int) volatile _NOEXCEPT {return fetch_add(_Tp(1));}
Howard Hinnant138f5922010-12-07 20:46:14 +00001586 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001587 _Tp operator++(int) _NOEXCEPT {return fetch_add(_Tp(1));}
Howard Hinnant138f5922010-12-07 20:46:14 +00001588 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001589 _Tp operator--(int) volatile _NOEXCEPT {return fetch_sub(_Tp(1));}
Howard Hinnant138f5922010-12-07 20:46:14 +00001590 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001591 _Tp operator--(int) _NOEXCEPT {return fetch_sub(_Tp(1));}
Howard Hinnant138f5922010-12-07 20:46:14 +00001592 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001593 _Tp operator++() volatile _NOEXCEPT {return fetch_add(_Tp(1)) + _Tp(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001594 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001595 _Tp operator++() _NOEXCEPT {return fetch_add(_Tp(1)) + _Tp(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001596 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001597 _Tp operator--() volatile _NOEXCEPT {return fetch_sub(_Tp(1)) - _Tp(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001598 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001599 _Tp operator--() _NOEXCEPT {return fetch_sub(_Tp(1)) - _Tp(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001600 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001601 _Tp operator+=(_Tp __op) volatile _NOEXCEPT {return fetch_add(__op) + __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001602 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001603 _Tp operator+=(_Tp __op) _NOEXCEPT {return fetch_add(__op) + __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001604 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001605 _Tp operator-=(_Tp __op) volatile _NOEXCEPT {return fetch_sub(__op) - __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001606 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001607 _Tp operator-=(_Tp __op) _NOEXCEPT {return fetch_sub(__op) - __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001608 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001609 _Tp operator&=(_Tp __op) volatile _NOEXCEPT {return fetch_and(__op) & __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001610 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001611 _Tp operator&=(_Tp __op) _NOEXCEPT {return fetch_and(__op) & __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001612 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001613 _Tp operator|=(_Tp __op) volatile _NOEXCEPT {return fetch_or(__op) | __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001614 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001615 _Tp operator|=(_Tp __op) _NOEXCEPT {return fetch_or(__op) | __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001616 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001617 _Tp operator^=(_Tp __op) volatile _NOEXCEPT {return fetch_xor(__op) ^ __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001618 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001619 _Tp operator^=(_Tp __op) _NOEXCEPT {return fetch_xor(__op) ^ __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001620};
1621
1622// atomic<T>
1623
1624template <class _Tp>
1625struct atomic
1626 : public __atomic_base<_Tp>
1627{
1628 typedef __atomic_base<_Tp> __base;
1629 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3d284222013-05-02 20:18:43 +00001630 atomic() _NOEXCEPT _LIBCPP_DEFAULT
Howard Hinnant138f5922010-12-07 20:46:14 +00001631 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001632 _LIBCPP_CONSTEXPR atomic(_Tp __d) _NOEXCEPT : __base(__d) {}
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001633
1634 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001635 _Tp operator=(_Tp __d) volatile _NOEXCEPT
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001636 {__base::store(__d); return __d;}
1637 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001638 _Tp operator=(_Tp __d) _NOEXCEPT
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001639 {__base::store(__d); return __d;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001640};
1641
1642// atomic<T*>
1643
1644template <class _Tp>
1645struct atomic<_Tp*>
1646 : public __atomic_base<_Tp*>
1647{
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001648 typedef __atomic_base<_Tp*> __base;
Howard Hinnant138f5922010-12-07 20:46:14 +00001649 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3d284222013-05-02 20:18:43 +00001650 atomic() _NOEXCEPT _LIBCPP_DEFAULT
Howard Hinnant138f5922010-12-07 20:46:14 +00001651 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001652 _LIBCPP_CONSTEXPR atomic(_Tp* __d) _NOEXCEPT : __base(__d) {}
Howard Hinnant138f5922010-12-07 20:46:14 +00001653
1654 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001655 _Tp* operator=(_Tp* __d) volatile _NOEXCEPT
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001656 {__base::store(__d); return __d;}
1657 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001658 _Tp* operator=(_Tp* __d) _NOEXCEPT
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001659 {__base::store(__d); return __d;}
1660
1661 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00001662 _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst)
Howard Hinnanteee2c142012-04-11 20:14:21 +00001663 volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001664 {return __cxx_atomic_fetch_add(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001665 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001666 _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001667 {return __cxx_atomic_fetch_add(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001668 _LIBCPP_INLINE_VISIBILITY
1669 _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst)
Howard Hinnanteee2c142012-04-11 20:14:21 +00001670 volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001671 {return __cxx_atomic_fetch_sub(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001672 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001673 _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00001674 {return __cxx_atomic_fetch_sub(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001675
1676 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001677 _Tp* operator++(int) volatile _NOEXCEPT {return fetch_add(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001678 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001679 _Tp* operator++(int) _NOEXCEPT {return fetch_add(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001680 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001681 _Tp* operator--(int) volatile _NOEXCEPT {return fetch_sub(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001682 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001683 _Tp* operator--(int) _NOEXCEPT {return fetch_sub(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001684 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001685 _Tp* operator++() volatile _NOEXCEPT {return fetch_add(1) + 1;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001686 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001687 _Tp* operator++() _NOEXCEPT {return fetch_add(1) + 1;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001688 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001689 _Tp* operator--() volatile _NOEXCEPT {return fetch_sub(1) - 1;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001690 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001691 _Tp* operator--() _NOEXCEPT {return fetch_sub(1) - 1;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001692 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001693 _Tp* operator+=(ptrdiff_t __op) volatile _NOEXCEPT {return fetch_add(__op) + __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001694 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001695 _Tp* operator+=(ptrdiff_t __op) _NOEXCEPT {return fetch_add(__op) + __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001696 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001697 _Tp* operator-=(ptrdiff_t __op) volatile _NOEXCEPT {return fetch_sub(__op) - __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001698 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001699 _Tp* operator-=(ptrdiff_t __op) _NOEXCEPT {return fetch_sub(__op) - __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001700};
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001701
1702// atomic_is_lock_free
1703
1704template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001705_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001706bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001707atomic_is_lock_free(const volatile atomic<_Tp>* __o) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001708{
Howard Hinnant138f5922010-12-07 20:46:14 +00001709 return __o->is_lock_free();
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001710}
1711
1712template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001713_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001714bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001715atomic_is_lock_free(const atomic<_Tp>* __o) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001716{
Howard Hinnant138f5922010-12-07 20:46:14 +00001717 return __o->is_lock_free();
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001718}
1719
1720// atomic_init
1721
1722template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001723_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001724void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001725atomic_init(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001726{
Davide Italiano011f80a2019-03-05 18:40:49 +00001727 __cxx_atomic_init(&__o->__a_, __d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001728}
1729
1730template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001731_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001732void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001733atomic_init(atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001734{
Davide Italiano011f80a2019-03-05 18:40:49 +00001735 __cxx_atomic_init(&__o->__a_, __d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001736}
1737
1738// atomic_store
1739
1740template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001741_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001742void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001743atomic_store(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001744{
Howard Hinnant138f5922010-12-07 20:46:14 +00001745 __o->store(__d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001746}
1747
1748template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001749_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001750void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001751atomic_store(atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001752{
Howard Hinnant138f5922010-12-07 20:46:14 +00001753 __o->store(__d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001754}
1755
1756// atomic_store_explicit
1757
1758template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001759_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001760void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001761atomic_store_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001762 _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m)
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001763{
Howard Hinnant138f5922010-12-07 20:46:14 +00001764 __o->store(__d, __m);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001765}
1766
1767template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001768_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001769void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001770atomic_store_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001771 _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m)
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001772{
Howard Hinnant138f5922010-12-07 20:46:14 +00001773 __o->store(__d, __m);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001774}
1775
1776// atomic_load
1777
1778template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001779_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001780_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001781atomic_load(const volatile atomic<_Tp>* __o) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001782{
Howard Hinnant138f5922010-12-07 20:46:14 +00001783 return __o->load();
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001784}
1785
1786template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001787_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001788_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001789atomic_load(const atomic<_Tp>* __o) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001790{
Howard Hinnant138f5922010-12-07 20:46:14 +00001791 return __o->load();
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001792}
1793
1794// atomic_load_explicit
1795
1796template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001797_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001798_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001799atomic_load_explicit(const volatile atomic<_Tp>* __o, memory_order __m) _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001800 _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m)
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001801{
Howard Hinnant138f5922010-12-07 20:46:14 +00001802 return __o->load(__m);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001803}
1804
1805template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001806_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001807_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001808atomic_load_explicit(const atomic<_Tp>* __o, memory_order __m) _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001809 _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m)
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001810{
Howard Hinnant138f5922010-12-07 20:46:14 +00001811 return __o->load(__m);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001812}
1813
1814// atomic_exchange
1815
1816template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001817_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001818_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001819atomic_exchange(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001820{
Howard Hinnant138f5922010-12-07 20:46:14 +00001821 return __o->exchange(__d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001822}
1823
1824template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001825_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001826_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001827atomic_exchange(atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001828{
Howard Hinnant138f5922010-12-07 20:46:14 +00001829 return __o->exchange(__d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001830}
1831
1832// atomic_exchange_explicit
1833
1834template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001835_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001836_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001837atomic_exchange_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001838{
Howard Hinnant138f5922010-12-07 20:46:14 +00001839 return __o->exchange(__d, __m);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001840}
1841
1842template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001843_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001844_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001845atomic_exchange_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001846{
Howard Hinnant138f5922010-12-07 20:46:14 +00001847 return __o->exchange(__d, __m);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001848}
1849
1850// atomic_compare_exchange_weak
1851
1852template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001853_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001854bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001855atomic_compare_exchange_weak(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001856{
Howard Hinnant138f5922010-12-07 20:46:14 +00001857 return __o->compare_exchange_weak(*__e, __d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001858}
1859
1860template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001861_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001862bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001863atomic_compare_exchange_weak(atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001864{
Howard Hinnant138f5922010-12-07 20:46:14 +00001865 return __o->compare_exchange_weak(*__e, __d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001866}
1867
1868// atomic_compare_exchange_strong
1869
1870template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001871_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001872bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001873atomic_compare_exchange_strong(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001874{
Howard Hinnant138f5922010-12-07 20:46:14 +00001875 return __o->compare_exchange_strong(*__e, __d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001876}
1877
1878template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001879_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001880bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001881atomic_compare_exchange_strong(atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001882{
Howard Hinnant138f5922010-12-07 20:46:14 +00001883 return __o->compare_exchange_strong(*__e, __d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001884}
1885
1886// atomic_compare_exchange_weak_explicit
1887
1888template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001889_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001890bool
1891atomic_compare_exchange_weak_explicit(volatile atomic<_Tp>* __o, _Tp* __e,
1892 _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001893 memory_order __s, memory_order __f) _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001894 _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001895{
Howard Hinnant138f5922010-12-07 20:46:14 +00001896 return __o->compare_exchange_weak(*__e, __d, __s, __f);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001897}
1898
1899template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001900_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001901bool
1902atomic_compare_exchange_weak_explicit(atomic<_Tp>* __o, _Tp* __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001903 memory_order __s, memory_order __f) _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001904 _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001905{
Howard Hinnant138f5922010-12-07 20:46:14 +00001906 return __o->compare_exchange_weak(*__e, __d, __s, __f);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001907}
1908
1909// atomic_compare_exchange_strong_explicit
1910
1911template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001912_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001913bool
1914atomic_compare_exchange_strong_explicit(volatile atomic<_Tp>* __o,
1915 _Tp* __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001916 memory_order __s, memory_order __f) _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001917 _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001918{
Howard Hinnant138f5922010-12-07 20:46:14 +00001919 return __o->compare_exchange_strong(*__e, __d, __s, __f);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001920}
1921
1922template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001923_LIBCPP_INLINE_VISIBILITY
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001924bool
1925atomic_compare_exchange_strong_explicit(atomic<_Tp>* __o, _Tp* __e,
1926 _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001927 memory_order __s, memory_order __f) _NOEXCEPT
Eric Fiselierb5ab51d2017-01-13 23:45:39 +00001928 _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f)
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001929{
Howard Hinnant138f5922010-12-07 20:46:14 +00001930 return __o->compare_exchange_strong(*__e, __d, __s, __f);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001931}
1932
Howard Hinnant138f5922010-12-07 20:46:14 +00001933// atomic_fetch_add
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001934
1935template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001936_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00001937typename enable_if
1938<
1939 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1940 _Tp
1941>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001942atomic_fetch_add(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001943{
Howard Hinnant138f5922010-12-07 20:46:14 +00001944 return __o->fetch_add(__op);
1945}
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001946
Howard Hinnant138f5922010-12-07 20:46:14 +00001947template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001948_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00001949typename enable_if
1950<
1951 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1952 _Tp
1953>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001954atomic_fetch_add(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001955{
1956 return __o->fetch_add(__op);
1957}
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001958
Howard Hinnant138f5922010-12-07 20:46:14 +00001959template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001960_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00001961_Tp*
Howard Hinnanteee2c142012-04-11 20:14:21 +00001962atomic_fetch_add(volatile atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001963{
1964 return __o->fetch_add(__op);
1965}
1966
1967template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001968_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00001969_Tp*
Howard Hinnanteee2c142012-04-11 20:14:21 +00001970atomic_fetch_add(atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001971{
1972 return __o->fetch_add(__op);
1973}
1974
1975// atomic_fetch_add_explicit
1976
1977template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001978_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00001979typename enable_if
1980<
1981 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1982 _Tp
1983>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001984atomic_fetch_add_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001985{
1986 return __o->fetch_add(__op, __m);
1987}
1988
1989template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00001990_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00001991typename enable_if
1992<
1993 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1994 _Tp
1995>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001996atomic_fetch_add_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001997{
1998 return __o->fetch_add(__op, __m);
1999}
2000
2001template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002002_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002003_Tp*
2004atomic_fetch_add_explicit(volatile atomic<_Tp*>* __o, ptrdiff_t __op,
Howard Hinnanteee2c142012-04-11 20:14:21 +00002005 memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002006{
2007 return __o->fetch_add(__op, __m);
2008}
2009
2010template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002011_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002012_Tp*
Howard Hinnanteee2c142012-04-11 20:14:21 +00002013atomic_fetch_add_explicit(atomic<_Tp*>* __o, ptrdiff_t __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002014{
2015 return __o->fetch_add(__op, __m);
2016}
2017
2018// atomic_fetch_sub
2019
2020template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002021_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002022typename enable_if
2023<
2024 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2025 _Tp
2026>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002027atomic_fetch_sub(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002028{
2029 return __o->fetch_sub(__op);
2030}
2031
2032template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002033_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002034typename enable_if
2035<
2036 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2037 _Tp
2038>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002039atomic_fetch_sub(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002040{
2041 return __o->fetch_sub(__op);
2042}
2043
2044template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002045_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002046_Tp*
Howard Hinnanteee2c142012-04-11 20:14:21 +00002047atomic_fetch_sub(volatile atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002048{
2049 return __o->fetch_sub(__op);
2050}
2051
2052template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002053_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002054_Tp*
Howard Hinnanteee2c142012-04-11 20:14:21 +00002055atomic_fetch_sub(atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002056{
2057 return __o->fetch_sub(__op);
2058}
2059
2060// atomic_fetch_sub_explicit
2061
2062template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002063_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002064typename enable_if
2065<
2066 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2067 _Tp
2068>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002069atomic_fetch_sub_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002070{
2071 return __o->fetch_sub(__op, __m);
2072}
2073
2074template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002075_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002076typename enable_if
2077<
2078 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2079 _Tp
2080>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002081atomic_fetch_sub_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002082{
2083 return __o->fetch_sub(__op, __m);
2084}
2085
2086template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002087_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002088_Tp*
2089atomic_fetch_sub_explicit(volatile atomic<_Tp*>* __o, ptrdiff_t __op,
Howard Hinnanteee2c142012-04-11 20:14:21 +00002090 memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002091{
2092 return __o->fetch_sub(__op, __m);
2093}
2094
2095template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002096_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002097_Tp*
Howard Hinnanteee2c142012-04-11 20:14:21 +00002098atomic_fetch_sub_explicit(atomic<_Tp*>* __o, ptrdiff_t __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002099{
2100 return __o->fetch_sub(__op, __m);
2101}
2102
2103// atomic_fetch_and
2104
2105template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002106_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002107typename enable_if
2108<
2109 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2110 _Tp
2111>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002112atomic_fetch_and(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002113{
2114 return __o->fetch_and(__op);
2115}
2116
2117template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002118_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002119typename enable_if
2120<
2121 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2122 _Tp
2123>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002124atomic_fetch_and(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002125{
2126 return __o->fetch_and(__op);
2127}
2128
2129// atomic_fetch_and_explicit
2130
2131template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002132_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002133typename enable_if
2134<
2135 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2136 _Tp
2137>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002138atomic_fetch_and_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002139{
2140 return __o->fetch_and(__op, __m);
2141}
2142
2143template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002144_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002145typename enable_if
2146<
2147 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2148 _Tp
2149>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002150atomic_fetch_and_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002151{
2152 return __o->fetch_and(__op, __m);
2153}
2154
2155// atomic_fetch_or
2156
2157template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002158_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002159typename enable_if
2160<
2161 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2162 _Tp
2163>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002164atomic_fetch_or(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002165{
2166 return __o->fetch_or(__op);
2167}
2168
2169template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002170_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002171typename enable_if
2172<
2173 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2174 _Tp
2175>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002176atomic_fetch_or(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002177{
2178 return __o->fetch_or(__op);
2179}
2180
2181// atomic_fetch_or_explicit
2182
2183template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002184_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002185typename enable_if
2186<
2187 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2188 _Tp
2189>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002190atomic_fetch_or_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002191{
2192 return __o->fetch_or(__op, __m);
2193}
2194
2195template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002196_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002197typename enable_if
2198<
2199 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2200 _Tp
2201>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002202atomic_fetch_or_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002203{
2204 return __o->fetch_or(__op, __m);
2205}
2206
2207// atomic_fetch_xor
2208
2209template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002210_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002211typename enable_if
2212<
2213 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2214 _Tp
2215>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002216atomic_fetch_xor(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002217{
2218 return __o->fetch_xor(__op);
2219}
2220
2221template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002222_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002223typename enable_if
2224<
2225 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2226 _Tp
2227>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002228atomic_fetch_xor(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002229{
2230 return __o->fetch_xor(__op);
2231}
2232
2233// atomic_fetch_xor_explicit
2234
2235template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002236_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002237typename enable_if
2238<
2239 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2240 _Tp
2241>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002242atomic_fetch_xor_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002243{
2244 return __o->fetch_xor(__op, __m);
2245}
2246
2247template <class _Tp>
Davide Italiano011f80a2019-03-05 18:40:49 +00002248_LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00002249typename enable_if
2250<
2251 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
2252 _Tp
2253>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00002254atomic_fetch_xor_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00002255{
2256 return __o->fetch_xor(__op, __m);
2257}
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00002258
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002259// flag type and operations
2260
2261typedef struct atomic_flag
2262{
Davide Italiano011f80a2019-03-05 18:40:49 +00002263 __cxx_atomic_impl<_LIBCPP_ATOMIC_FLAG_TYPE> __a_;
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002264
2265 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00002266 bool test_and_set(memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00002267 {return __cxx_atomic_exchange(&__a_, _LIBCPP_ATOMIC_FLAG_TYPE(true), __m);}
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002268 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00002269 bool test_and_set(memory_order __m = memory_order_seq_cst) _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00002270 {return __cxx_atomic_exchange(&__a_, _LIBCPP_ATOMIC_FLAG_TYPE(true), __m);}
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002271 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00002272 void clear(memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00002273 {__cxx_atomic_store(&__a_, _LIBCPP_ATOMIC_FLAG_TYPE(false), __m);}
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002274 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00002275 void clear(memory_order __m = memory_order_seq_cst) _NOEXCEPT
Davide Italiano011f80a2019-03-05 18:40:49 +00002276 {__cxx_atomic_store(&__a_, _LIBCPP_ATOMIC_FLAG_TYPE(false), __m);}
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002277
2278 _LIBCPP_INLINE_VISIBILITY
Davide Italiano011f80a2019-03-05 18:40:49 +00002279 atomic_flag() _NOEXCEPT _LIBCPP_DEFAULT
Howard Hinnant3d284222013-05-02 20:18:43 +00002280
Marshall Clowcf990752018-04-25 14:27:29 +00002281 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Eric Fiselierfec26a92016-05-03 02:12:26 +00002282 atomic_flag(bool __b) _NOEXCEPT : __a_(__b) {} // EXTENSION
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002283
Eric Fiselier2d8515f2017-01-06 20:58:25 +00002284#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002285 atomic_flag(const atomic_flag&) = delete;
2286 atomic_flag& operator=(const atomic_flag&) = delete;
2287 atomic_flag& operator=(const atomic_flag&) volatile = delete;
Eric Fiselier2d8515f2017-01-06 20:58:25 +00002288#else
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002289private:
2290 atomic_flag(const atomic_flag&);
2291 atomic_flag& operator=(const atomic_flag&);
2292 atomic_flag& operator=(const atomic_flag&) volatile;
Eric Fiselier2d8515f2017-01-06 20:58:25 +00002293#endif
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002294} atomic_flag;
2295
2296inline _LIBCPP_INLINE_VISIBILITY
2297bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00002298atomic_flag_test_and_set(volatile atomic_flag* __o) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002299{
2300 return __o->test_and_set();
2301}
2302
2303inline _LIBCPP_INLINE_VISIBILITY
2304bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00002305atomic_flag_test_and_set(atomic_flag* __o) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002306{
2307 return __o->test_and_set();
2308}
2309
2310inline _LIBCPP_INLINE_VISIBILITY
2311bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00002312atomic_flag_test_and_set_explicit(volatile atomic_flag* __o, memory_order __m) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002313{
2314 return __o->test_and_set(__m);
2315}
2316
2317inline _LIBCPP_INLINE_VISIBILITY
2318bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00002319atomic_flag_test_and_set_explicit(atomic_flag* __o, memory_order __m) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002320{
2321 return __o->test_and_set(__m);
2322}
2323
2324inline _LIBCPP_INLINE_VISIBILITY
2325void
Howard Hinnanteee2c142012-04-11 20:14:21 +00002326atomic_flag_clear(volatile atomic_flag* __o) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002327{
2328 __o->clear();
2329}
2330
2331inline _LIBCPP_INLINE_VISIBILITY
2332void
Howard Hinnanteee2c142012-04-11 20:14:21 +00002333atomic_flag_clear(atomic_flag* __o) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002334{
2335 __o->clear();
2336}
2337
2338inline _LIBCPP_INLINE_VISIBILITY
2339void
Howard Hinnanteee2c142012-04-11 20:14:21 +00002340atomic_flag_clear_explicit(volatile atomic_flag* __o, memory_order __m) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002341{
2342 __o->clear(__m);
2343}
2344
2345inline _LIBCPP_INLINE_VISIBILITY
2346void
Howard Hinnanteee2c142012-04-11 20:14:21 +00002347atomic_flag_clear_explicit(atomic_flag* __o, memory_order __m) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002348{
2349 __o->clear(__m);
2350}
2351
2352// fences
2353
2354inline _LIBCPP_INLINE_VISIBILITY
2355void
Howard Hinnanteee2c142012-04-11 20:14:21 +00002356atomic_thread_fence(memory_order __m) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002357{
Davide Italiano011f80a2019-03-05 18:40:49 +00002358 __cxx_atomic_thread_fence(__m);
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002359}
2360
2361inline _LIBCPP_INLINE_VISIBILITY
2362void
Howard Hinnanteee2c142012-04-11 20:14:21 +00002363atomic_signal_fence(memory_order __m) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002364{
Davide Italiano011f80a2019-03-05 18:40:49 +00002365 __cxx_atomic_signal_fence(__m);
Howard Hinnant6ac60f82010-12-08 17:20:28 +00002366}
2367
Howard Hinnant96e4cd62010-12-07 23:24:41 +00002368// Atomics for standard typedef types
2369
Howard Hinnantf0af8d92013-01-04 18:58:50 +00002370typedef atomic<bool> atomic_bool;
Howard Hinnant96e4cd62010-12-07 23:24:41 +00002371typedef atomic<char> atomic_char;
2372typedef atomic<signed char> atomic_schar;
2373typedef atomic<unsigned char> atomic_uchar;
2374typedef atomic<short> atomic_short;
2375typedef atomic<unsigned short> atomic_ushort;
2376typedef atomic<int> atomic_int;
2377typedef atomic<unsigned int> atomic_uint;
2378typedef atomic<long> atomic_long;
2379typedef atomic<unsigned long> atomic_ulong;
2380typedef atomic<long long> atomic_llong;
2381typedef atomic<unsigned long long> atomic_ullong;
2382typedef atomic<char16_t> atomic_char16_t;
2383typedef atomic<char32_t> atomic_char32_t;
2384typedef atomic<wchar_t> atomic_wchar_t;
2385
2386typedef atomic<int_least8_t> atomic_int_least8_t;
2387typedef atomic<uint_least8_t> atomic_uint_least8_t;
2388typedef atomic<int_least16_t> atomic_int_least16_t;
2389typedef atomic<uint_least16_t> atomic_uint_least16_t;
2390typedef atomic<int_least32_t> atomic_int_least32_t;
2391typedef atomic<uint_least32_t> atomic_uint_least32_t;
2392typedef atomic<int_least64_t> atomic_int_least64_t;
2393typedef atomic<uint_least64_t> atomic_uint_least64_t;
2394
2395typedef atomic<int_fast8_t> atomic_int_fast8_t;
2396typedef atomic<uint_fast8_t> atomic_uint_fast8_t;
2397typedef atomic<int_fast16_t> atomic_int_fast16_t;
2398typedef atomic<uint_fast16_t> atomic_uint_fast16_t;
2399typedef atomic<int_fast32_t> atomic_int_fast32_t;
2400typedef atomic<uint_fast32_t> atomic_uint_fast32_t;
2401typedef atomic<int_fast64_t> atomic_int_fast64_t;
2402typedef atomic<uint_fast64_t> atomic_uint_fast64_t;
2403
Marshall Clowf710afc2016-06-30 15:28:38 +00002404typedef atomic< int8_t> atomic_int8_t;
2405typedef atomic<uint8_t> atomic_uint8_t;
2406typedef atomic< int16_t> atomic_int16_t;
2407typedef atomic<uint16_t> atomic_uint16_t;
2408typedef atomic< int32_t> atomic_int32_t;
2409typedef atomic<uint32_t> atomic_uint32_t;
2410typedef atomic< int64_t> atomic_int64_t;
2411typedef atomic<uint64_t> atomic_uint64_t;
2412
Howard Hinnant96e4cd62010-12-07 23:24:41 +00002413typedef atomic<intptr_t> atomic_intptr_t;
2414typedef atomic<uintptr_t> atomic_uintptr_t;
2415typedef atomic<size_t> atomic_size_t;
2416typedef atomic<ptrdiff_t> atomic_ptrdiff_t;
2417typedef atomic<intmax_t> atomic_intmax_t;
2418typedef atomic<uintmax_t> atomic_uintmax_t;
2419
Howard Hinnantf1f066a2010-09-29 21:20:03 +00002420#define ATOMIC_FLAG_INIT {false}
Howard Hinnant953c31d2010-10-04 18:52:54 +00002421#define ATOMIC_VAR_INIT(__v) {__v}
2422
Howard Hinnant71be7292010-09-27 21:17:38 +00002423_LIBCPP_END_NAMESPACE_STD
2424
Howard Hinnant71be7292010-09-27 21:17:38 +00002425#endif // _LIBCPP_ATOMIC