blob: dc117e93a29be4d29eabca43a3fecfcf690b1217 [file] [log] [blame]
Howard Hinnant71be7292010-09-27 21:17:38 +00001// -*- C++ -*-
2//===--------------------------- atomic -----------------------------------===//
3//
4// The LLVM Compiler Infrastructure
5//
6// This file is distributed under the University of Illinois Open Source
7// License. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_ATOMIC
12#define _LIBCPP_ATOMIC
13
14/*
15 atomic synopsis
16
17namespace std
18{
19
JF Bastienfdb42c22016-03-25 15:48:21 +000020// feature test macro
21
22#define __cpp_lib_atomic_is_always_lock_free // as specified by SG10
23
Howard Hinnant71be7292010-09-27 21:17:38 +000024// order and consistency
25
26typedef enum memory_order
27{
Howard Hinnantdca6e712010-09-28 17:13:38 +000028 memory_order_relaxed,
29 memory_order_consume, // load-consume
30 memory_order_acquire, // load-acquire
31 memory_order_release, // store-release
32 memory_order_acq_rel, // store-release load-acquire
33 memory_order_seq_cst // store-release load-acquire
Howard Hinnant71be7292010-09-27 21:17:38 +000034} memory_order;
35
Howard Hinnanteee2c142012-04-11 20:14:21 +000036template <class T> T kill_dependency(T y) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +000037
38// lock-free property
39
Howard Hinnant931e3402013-01-21 20:39:41 +000040#define ATOMIC_BOOL_LOCK_FREE unspecified
Howard Hinnant71be7292010-09-27 21:17:38 +000041#define ATOMIC_CHAR_LOCK_FREE unspecified
42#define ATOMIC_CHAR16_T_LOCK_FREE unspecified
43#define ATOMIC_CHAR32_T_LOCK_FREE unspecified
44#define ATOMIC_WCHAR_T_LOCK_FREE unspecified
45#define ATOMIC_SHORT_LOCK_FREE unspecified
46#define ATOMIC_INT_LOCK_FREE unspecified
47#define ATOMIC_LONG_LOCK_FREE unspecified
48#define ATOMIC_LLONG_LOCK_FREE unspecified
Howard Hinnant931e3402013-01-21 20:39:41 +000049#define ATOMIC_POINTER_LOCK_FREE unspecified
Howard Hinnant71be7292010-09-27 21:17:38 +000050
Howard Hinnant71be7292010-09-27 21:17:38 +000051// flag type and operations
52
53typedef struct atomic_flag
54{
Howard Hinnanteee2c142012-04-11 20:14:21 +000055 bool test_and_set(memory_order m = memory_order_seq_cst) volatile noexcept;
56 bool test_and_set(memory_order m = memory_order_seq_cst) noexcept;
57 void clear(memory_order m = memory_order_seq_cst) volatile noexcept;
58 void clear(memory_order m = memory_order_seq_cst) noexcept;
59 atomic_flag() noexcept = default;
Howard Hinnant71be7292010-09-27 21:17:38 +000060 atomic_flag(const atomic_flag&) = delete;
61 atomic_flag& operator=(const atomic_flag&) = delete;
62 atomic_flag& operator=(const atomic_flag&) volatile = delete;
63} atomic_flag;
64
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000065bool
Howard Hinnanteee2c142012-04-11 20:14:21 +000066 atomic_flag_test_and_set(volatile atomic_flag* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000067
68bool
Howard Hinnanteee2c142012-04-11 20:14:21 +000069 atomic_flag_test_and_set(atomic_flag* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000070
71bool
72 atomic_flag_test_and_set_explicit(volatile atomic_flag* obj,
Howard Hinnanteee2c142012-04-11 20:14:21 +000073 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000074
75bool
Howard Hinnanteee2c142012-04-11 20:14:21 +000076 atomic_flag_test_and_set_explicit(atomic_flag* obj, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000077
78void
Howard Hinnanteee2c142012-04-11 20:14:21 +000079 atomic_flag_clear(volatile atomic_flag* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000080
81void
Howard Hinnanteee2c142012-04-11 20:14:21 +000082 atomic_flag_clear(atomic_flag* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000083
84void
Howard Hinnanteee2c142012-04-11 20:14:21 +000085 atomic_flag_clear_explicit(volatile atomic_flag* obj, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +000086
87void
Howard Hinnanteee2c142012-04-11 20:14:21 +000088 atomic_flag_clear_explicit(atomic_flag* obj, memory_order m) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +000089
90#define ATOMIC_FLAG_INIT see below
Howard Hinnant493d1d92010-10-19 16:51:18 +000091#define ATOMIC_VAR_INIT(value) see below
Howard Hinnant71be7292010-09-27 21:17:38 +000092
Howard Hinnant71be7292010-09-27 21:17:38 +000093template <class T>
94struct atomic
95{
JF Bastienfdb42c22016-03-25 15:48:21 +000096 static constexpr bool is_always_lock_free;
Howard Hinnanteee2c142012-04-11 20:14:21 +000097 bool is_lock_free() const volatile noexcept;
98 bool is_lock_free() const noexcept;
99 void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept;
100 void store(T desr, memory_order m = memory_order_seq_cst) noexcept;
101 T load(memory_order m = memory_order_seq_cst) const volatile noexcept;
102 T load(memory_order m = memory_order_seq_cst) const noexcept;
103 operator T() const volatile noexcept;
104 operator T() const noexcept;
105 T exchange(T desr, memory_order m = memory_order_seq_cst) volatile noexcept;
106 T exchange(T desr, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000107 bool compare_exchange_weak(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000108 memory_order s, memory_order f) volatile noexcept;
109 bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000110 bool compare_exchange_strong(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000111 memory_order s, memory_order f) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000112 bool compare_exchange_strong(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000113 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000114 bool compare_exchange_weak(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000115 memory_order m = memory_order_seq_cst) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000116 bool compare_exchange_weak(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000117 memory_order m = memory_order_seq_cst) 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 m = memory_order_seq_cst) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000120 bool compare_exchange_strong(T& expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000121 memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000122
Howard Hinnanteee2c142012-04-11 20:14:21 +0000123 atomic() noexcept = default;
124 constexpr atomic(T desr) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000125 atomic(const atomic&) = delete;
126 atomic& operator=(const atomic&) = delete;
127 atomic& operator=(const atomic&) volatile = delete;
Howard Hinnanteee2c142012-04-11 20:14:21 +0000128 T operator=(T) volatile noexcept;
129 T operator=(T) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000130};
131
132template <>
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000133struct atomic<integral>
Howard Hinnant71be7292010-09-27 21:17:38 +0000134{
JF Bastienfdb42c22016-03-25 15:48:21 +0000135 static constexpr bool is_always_lock_free;
Howard Hinnanteee2c142012-04-11 20:14:21 +0000136 bool is_lock_free() const volatile noexcept;
137 bool is_lock_free() const noexcept;
138 void store(integral desr, memory_order m = memory_order_seq_cst) volatile noexcept;
139 void store(integral desr, memory_order m = memory_order_seq_cst) noexcept;
140 integral load(memory_order m = memory_order_seq_cst) const volatile noexcept;
141 integral load(memory_order m = memory_order_seq_cst) const noexcept;
142 operator integral() const volatile noexcept;
143 operator integral() const noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000144 integral exchange(integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000145 memory_order m = memory_order_seq_cst) volatile noexcept;
146 integral exchange(integral desr, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000147 bool compare_exchange_weak(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000148 memory_order s, memory_order f) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000149 bool compare_exchange_weak(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000150 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000151 bool compare_exchange_strong(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000152 memory_order s, memory_order f) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000153 bool compare_exchange_strong(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000154 memory_order s, memory_order f) 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 m = memory_order_seq_cst) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000157 bool compare_exchange_weak(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000158 memory_order m = memory_order_seq_cst) 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 m = memory_order_seq_cst) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000161 bool compare_exchange_strong(integral& expc, integral desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000162 memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000163
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000164 integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000165 fetch_add(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
166 integral fetch_add(integral op, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000167 integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000168 fetch_sub(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
169 integral fetch_sub(integral op, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000170 integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000171 fetch_and(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
172 integral fetch_and(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_or(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
175 integral fetch_or(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_xor(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
178 integral fetch_xor(integral op, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000179
Howard Hinnanteee2c142012-04-11 20:14:21 +0000180 atomic() noexcept = default;
181 constexpr atomic(integral desr) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000182 atomic(const atomic&) = delete;
183 atomic& operator=(const atomic&) = delete;
184 atomic& operator=(const atomic&) volatile = delete;
Howard Hinnanteee2c142012-04-11 20:14:21 +0000185 integral operator=(integral desr) volatile noexcept;
186 integral operator=(integral desr) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000187
Howard Hinnanteee2c142012-04-11 20:14:21 +0000188 integral operator++(int) volatile noexcept;
189 integral operator++(int) noexcept;
190 integral operator--(int) volatile noexcept;
191 integral operator--(int) noexcept;
192 integral operator++() volatile noexcept;
193 integral operator++() noexcept;
194 integral operator--() volatile noexcept;
195 integral operator--() noexcept;
196 integral operator+=(integral op) volatile noexcept;
197 integral operator+=(integral op) noexcept;
198 integral operator-=(integral op) volatile noexcept;
199 integral operator-=(integral op) noexcept;
200 integral operator&=(integral op) volatile noexcept;
201 integral operator&=(integral op) 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;
Howard Hinnant71be7292010-09-27 21:17:38 +0000206};
207
208template <class T>
209struct atomic<T*>
Howard Hinnant71be7292010-09-27 21:17:38 +0000210{
JF Bastienfdb42c22016-03-25 15:48:21 +0000211 static constexpr bool is_always_lock_free;
Howard Hinnanteee2c142012-04-11 20:14:21 +0000212 bool is_lock_free() const volatile noexcept;
213 bool is_lock_free() const noexcept;
214 void store(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept;
215 void store(T* desr, memory_order m = memory_order_seq_cst) noexcept;
216 T* load(memory_order m = memory_order_seq_cst) const volatile noexcept;
217 T* load(memory_order m = memory_order_seq_cst) const noexcept;
218 operator T*() const volatile noexcept;
219 operator T*() const noexcept;
220 T* exchange(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept;
221 T* exchange(T* desr, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000222 bool compare_exchange_weak(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000223 memory_order s, memory_order f) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000224 bool compare_exchange_weak(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000225 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000226 bool compare_exchange_strong(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000227 memory_order s, memory_order f) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000228 bool compare_exchange_strong(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000229 memory_order s, memory_order f) 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 m = memory_order_seq_cst) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000232 bool compare_exchange_weak(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000233 memory_order m = memory_order_seq_cst) 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 m = memory_order_seq_cst) volatile noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000236 bool compare_exchange_strong(T*& expc, T* desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000237 memory_order m = memory_order_seq_cst) noexcept;
238 T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile noexcept;
239 T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst) noexcept;
240 T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile noexcept;
241 T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000242
Howard Hinnanteee2c142012-04-11 20:14:21 +0000243 atomic() noexcept = default;
244 constexpr atomic(T* desr) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000245 atomic(const atomic&) = delete;
246 atomic& operator=(const atomic&) = delete;
247 atomic& operator=(const atomic&) volatile = delete;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000248
Howard Hinnanteee2c142012-04-11 20:14:21 +0000249 T* operator=(T*) volatile noexcept;
250 T* operator=(T*) noexcept;
251 T* operator++(int) volatile noexcept;
252 T* operator++(int) noexcept;
253 T* operator--(int) volatile noexcept;
254 T* operator--(int) noexcept;
255 T* operator++() volatile noexcept;
256 T* operator++() noexcept;
257 T* operator--() volatile noexcept;
258 T* operator--() noexcept;
259 T* operator+=(ptrdiff_t op) volatile noexcept;
260 T* operator+=(ptrdiff_t op) noexcept;
261 T* operator-=(ptrdiff_t op) volatile noexcept;
262 T* operator-=(ptrdiff_t op) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000263};
264
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000265
266template <class T>
267 bool
Howard Hinnanteee2c142012-04-11 20:14:21 +0000268 atomic_is_lock_free(const volatile atomic<T>* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000269
270template <class T>
271 bool
Howard Hinnanteee2c142012-04-11 20:14:21 +0000272 atomic_is_lock_free(const atomic<T>* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000273
274template <class T>
275 void
Howard Hinnanteee2c142012-04-11 20:14:21 +0000276 atomic_init(volatile atomic<T>* obj, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000277
278template <class T>
279 void
Howard Hinnanteee2c142012-04-11 20:14:21 +0000280 atomic_init(atomic<T>* obj, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000281
282template <class T>
283 void
Howard Hinnanteee2c142012-04-11 20:14:21 +0000284 atomic_store(volatile atomic<T>* obj, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000285
286template <class T>
287 void
Howard Hinnanteee2c142012-04-11 20:14:21 +0000288 atomic_store(atomic<T>* obj, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000289
290template <class T>
291 void
Howard Hinnanteee2c142012-04-11 20:14:21 +0000292 atomic_store_explicit(volatile atomic<T>* obj, T desr, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000293
294template <class T>
295 void
Howard Hinnanteee2c142012-04-11 20:14:21 +0000296 atomic_store_explicit(atomic<T>* obj, T desr, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000297
298template <class T>
299 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000300 atomic_load(const volatile atomic<T>* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000301
302template <class T>
303 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000304 atomic_load(const atomic<T>* obj) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000305
306template <class T>
307 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000308 atomic_load_explicit(const volatile atomic<T>* obj, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000309
310template <class T>
311 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000312 atomic_load_explicit(const atomic<T>* obj, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000313
314template <class T>
315 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000316 atomic_exchange(volatile atomic<T>* obj, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000317
318template <class T>
319 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000320 atomic_exchange(atomic<T>* obj, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000321
322template <class T>
323 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000324 atomic_exchange_explicit(volatile atomic<T>* obj, T desr, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000325
326template <class T>
327 T
Howard Hinnanteee2c142012-04-11 20:14:21 +0000328 atomic_exchange_explicit(atomic<T>* obj, T desr, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000329
330template <class T>
331 bool
Howard Hinnanteee2c142012-04-11 20:14:21 +0000332 atomic_compare_exchange_weak(volatile atomic<T>* obj, T* expc, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000333
334template <class T>
335 bool
Howard Hinnanteee2c142012-04-11 20:14:21 +0000336 atomic_compare_exchange_weak(atomic<T>* obj, T* expc, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000337
338template <class T>
339 bool
Howard Hinnanteee2c142012-04-11 20:14:21 +0000340 atomic_compare_exchange_strong(volatile atomic<T>* obj, T* expc, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000341
342template <class T>
343 bool
Howard Hinnanteee2c142012-04-11 20:14:21 +0000344 atomic_compare_exchange_strong(atomic<T>* obj, T* expc, T desr) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000345
346template <class T>
347 bool
348 atomic_compare_exchange_weak_explicit(volatile atomic<T>* obj, T* expc,
349 T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000350 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000351
352template <class T>
353 bool
354 atomic_compare_exchange_weak_explicit(atomic<T>* obj, T* expc, T desr,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000355 memory_order s, memory_order f) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000356
357template <class T>
358 bool
359 atomic_compare_exchange_strong_explicit(volatile atomic<T>* obj,
360 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(atomic<T>* obj, T* expc,
366 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 Integral>
370 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000371 atomic_fetch_add(volatile atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000372
373template <class Integral>
374 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000375 atomic_fetch_add(atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000376
377template <class Integral>
378 Integral
379 atomic_fetch_add_explicit(volatile atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000380 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000381template <class Integral>
382 Integral
383 atomic_fetch_add_explicit(atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000384 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000385template <class Integral>
386 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000387 atomic_fetch_sub(volatile atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000388
389template <class Integral>
390 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000391 atomic_fetch_sub(atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000392
393template <class Integral>
394 Integral
395 atomic_fetch_sub_explicit(volatile atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000396 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000397template <class Integral>
398 Integral
399 atomic_fetch_sub_explicit(atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000400 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000401template <class Integral>
402 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000403 atomic_fetch_and(volatile atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000404
405template <class Integral>
406 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000407 atomic_fetch_and(atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000408
409template <class Integral>
410 Integral
411 atomic_fetch_and_explicit(volatile atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000412 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000413template <class Integral>
414 Integral
415 atomic_fetch_and_explicit(atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000416 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000417template <class Integral>
418 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000419 atomic_fetch_or(volatile atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000420
421template <class Integral>
422 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000423 atomic_fetch_or(atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000424
425template <class Integral>
426 Integral
427 atomic_fetch_or_explicit(volatile atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000428 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000429template <class Integral>
430 Integral
431 atomic_fetch_or_explicit(atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000432 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000433template <class Integral>
434 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000435 atomic_fetch_xor(volatile atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000436
437template <class Integral>
438 Integral
Howard Hinnanteee2c142012-04-11 20:14:21 +0000439 atomic_fetch_xor(atomic<Integral>* obj, Integral op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000440
441template <class Integral>
442 Integral
443 atomic_fetch_xor_explicit(volatile atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000444 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000445template <class Integral>
446 Integral
447 atomic_fetch_xor_explicit(atomic<Integral>* obj, Integral op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000448 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000449
450template <class T>
451 T*
Howard Hinnanteee2c142012-04-11 20:14:21 +0000452 atomic_fetch_add(volatile atomic<T*>* obj, ptrdiff_t op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000453
454template <class T>
455 T*
Howard Hinnanteee2c142012-04-11 20:14:21 +0000456 atomic_fetch_add(atomic<T*>* obj, ptrdiff_t op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000457
458template <class T>
459 T*
460 atomic_fetch_add_explicit(volatile atomic<T*>* obj, ptrdiff_t op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000461 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000462template <class T>
463 T*
Howard Hinnanteee2c142012-04-11 20:14:21 +0000464 atomic_fetch_add_explicit(atomic<T*>* obj, ptrdiff_t op, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000465
466template <class T>
467 T*
Howard Hinnanteee2c142012-04-11 20:14:21 +0000468 atomic_fetch_sub(volatile atomic<T*>* obj, ptrdiff_t op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000469
470template <class T>
471 T*
Howard Hinnanteee2c142012-04-11 20:14:21 +0000472 atomic_fetch_sub(atomic<T*>* obj, ptrdiff_t op) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000473
474template <class T>
475 T*
476 atomic_fetch_sub_explicit(volatile atomic<T*>* obj, ptrdiff_t op,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000477 memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000478template <class T>
479 T*
Howard Hinnanteee2c142012-04-11 20:14:21 +0000480 atomic_fetch_sub_explicit(atomic<T*>* obj, ptrdiff_t op, memory_order m) noexcept;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000481
482// Atomics for standard typedef types
483
Howard Hinnantf0af8d92013-01-04 18:58:50 +0000484typedef atomic<bool> atomic_bool;
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000485typedef atomic<char> atomic_char;
486typedef atomic<signed char> atomic_schar;
487typedef atomic<unsigned char> atomic_uchar;
488typedef atomic<short> atomic_short;
489typedef atomic<unsigned short> atomic_ushort;
490typedef atomic<int> atomic_int;
491typedef atomic<unsigned int> atomic_uint;
492typedef atomic<long> atomic_long;
493typedef atomic<unsigned long> atomic_ulong;
494typedef atomic<long long> atomic_llong;
495typedef atomic<unsigned long long> atomic_ullong;
496typedef atomic<char16_t> atomic_char16_t;
497typedef atomic<char32_t> atomic_char32_t;
498typedef atomic<wchar_t> atomic_wchar_t;
499
500typedef atomic<int_least8_t> atomic_int_least8_t;
501typedef atomic<uint_least8_t> atomic_uint_least8_t;
502typedef atomic<int_least16_t> atomic_int_least16_t;
503typedef atomic<uint_least16_t> atomic_uint_least16_t;
504typedef atomic<int_least32_t> atomic_int_least32_t;
505typedef atomic<uint_least32_t> atomic_uint_least32_t;
506typedef atomic<int_least64_t> atomic_int_least64_t;
507typedef atomic<uint_least64_t> atomic_uint_least64_t;
508
509typedef atomic<int_fast8_t> atomic_int_fast8_t;
510typedef atomic<uint_fast8_t> atomic_uint_fast8_t;
511typedef atomic<int_fast16_t> atomic_int_fast16_t;
512typedef atomic<uint_fast16_t> atomic_uint_fast16_t;
513typedef atomic<int_fast32_t> atomic_int_fast32_t;
514typedef atomic<uint_fast32_t> atomic_uint_fast32_t;
515typedef atomic<int_fast64_t> atomic_int_fast64_t;
516typedef atomic<uint_fast64_t> atomic_uint_fast64_t;
517
518typedef atomic<intptr_t> atomic_intptr_t;
519typedef atomic<uintptr_t> atomic_uintptr_t;
520typedef atomic<size_t> atomic_size_t;
521typedef atomic<ptrdiff_t> atomic_ptrdiff_t;
522typedef atomic<intmax_t> atomic_intmax_t;
523typedef atomic<uintmax_t> atomic_uintmax_t;
524
Howard Hinnant71be7292010-09-27 21:17:38 +0000525// fences
526
Howard Hinnanteee2c142012-04-11 20:14:21 +0000527void atomic_thread_fence(memory_order m) noexcept;
528void atomic_signal_fence(memory_order m) noexcept;
Howard Hinnant71be7292010-09-27 21:17:38 +0000529
530} // std
531
532*/
533
534#include <__config>
Howard Hinnant7bfaeb82010-12-06 23:10:08 +0000535#include <cstddef>
536#include <cstdint>
537#include <type_traits>
Howard Hinnant71be7292010-09-27 21:17:38 +0000538
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000539#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnant71be7292010-09-27 21:17:38 +0000540#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000541#endif
Howard Hinnant71be7292010-09-27 21:17:38 +0000542
Jonathan Roelofs39cb6bf2014-09-05 19:45:05 +0000543#ifdef _LIBCPP_HAS_NO_THREADS
544#error <atomic> is not supported on this single threaded system
Eric Fiselier8020b6c2015-08-19 17:21:46 +0000545#endif
546#if !defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_GCC_ATOMIC_IMP)
547#error <atomic> is not implemented
548#endif
Jonathan Roelofs39cb6bf2014-09-05 19:45:05 +0000549
JF Bastienfdb42c22016-03-25 15:48:21 +0000550#if _LIBCPP_STD_VER > 14
551// FIXME: use the right feature test macro value as chose by SG10.
552# define __cpp_lib_atomic_is_always_lock_free 201603L
553#endif
554
Howard Hinnant71be7292010-09-27 21:17:38 +0000555_LIBCPP_BEGIN_NAMESPACE_STD
556
Howard Hinnantdca6e712010-09-28 17:13:38 +0000557typedef enum memory_order
558{
559 memory_order_relaxed, memory_order_consume, memory_order_acquire,
560 memory_order_release, memory_order_acq_rel, memory_order_seq_cst
561} memory_order;
562
Eric Fiselier8020b6c2015-08-19 17:21:46 +0000563#if defined(_LIBCPP_HAS_GCC_ATOMIC_IMP)
Dan Albert7b65ace2014-08-09 23:51:51 +0000564namespace __gcc_atomic {
Marshall Clow290eb3f2015-01-11 06:15:59 +0000565template <typename _Tp>
Dan Albert7b65ace2014-08-09 23:51:51 +0000566struct __gcc_atomic_t {
Eric Fiselier88f07122015-12-15 00:32:21 +0000567
568#if _GNUC_VER >= 501
569 static_assert(is_trivially_copyable<_Tp>::value,
570 "std::atomic<Tp> requires that 'Tp' be a trivially copyable type");
571#endif
572
Eric Fiselier684aaca2015-10-14 08:36:22 +0000573 _LIBCPP_INLINE_VISIBILITY
574#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
575 __gcc_atomic_t() _NOEXCEPT = default;
576#else
577 __gcc_atomic_t() _NOEXCEPT : __a_value() {}
578#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
Eric Fiselier719e0442015-07-14 17:50:27 +0000579 _LIBCPP_CONSTEXPR explicit __gcc_atomic_t(_Tp value) _NOEXCEPT
580 : __a_value(value) {}
Marshall Clow290eb3f2015-01-11 06:15:59 +0000581 _Tp __a_value;
Dan Albert7b65ace2014-08-09 23:51:51 +0000582};
583#define _Atomic(x) __gcc_atomic::__gcc_atomic_t<x>
584
Marshall Clow290eb3f2015-01-11 06:15:59 +0000585template <typename _Tp> _Tp __create();
Dan Albert7b65ace2014-08-09 23:51:51 +0000586
Marshall Clow290eb3f2015-01-11 06:15:59 +0000587template <typename _Tp, typename _Td>
588typename enable_if<sizeof(_Tp()->__a_value = __create<_Td>()), char>::type
Dan Albert7b65ace2014-08-09 23:51:51 +0000589 __test_atomic_assignable(int);
Marshall Clow290eb3f2015-01-11 06:15:59 +0000590template <typename _Tp, typename _Up>
Dan Albert7b65ace2014-08-09 23:51:51 +0000591__two __test_atomic_assignable(...);
592
Marshall Clow290eb3f2015-01-11 06:15:59 +0000593template <typename _Tp, typename _Td>
Dan Albert7b65ace2014-08-09 23:51:51 +0000594struct __can_assign {
595 static const bool value =
Marshall Clow290eb3f2015-01-11 06:15:59 +0000596 sizeof(__test_atomic_assignable<_Tp, _Td>(1)) == sizeof(char);
Dan Albert7b65ace2014-08-09 23:51:51 +0000597};
598
Eric Fiselier684aaca2015-10-14 08:36:22 +0000599static inline _LIBCPP_CONSTEXPR int __to_gcc_order(memory_order __order) {
Dan Albert7b65ace2014-08-09 23:51:51 +0000600 // Avoid switch statement to make this a constexpr.
601 return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
602 (__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
603 (__order == memory_order_release ? __ATOMIC_RELEASE:
604 (__order == memory_order_seq_cst ? __ATOMIC_SEQ_CST:
605 (__order == memory_order_acq_rel ? __ATOMIC_ACQ_REL:
606 __ATOMIC_CONSUME))));
607}
608
Eric Fiselier684aaca2015-10-14 08:36:22 +0000609static inline _LIBCPP_CONSTEXPR int __to_gcc_failure_order(memory_order __order) {
Dan Albert48815f22015-01-06 18:39:37 +0000610 // Avoid switch statement to make this a constexpr.
611 return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
612 (__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
613 (__order == memory_order_release ? __ATOMIC_RELAXED:
614 (__order == memory_order_seq_cst ? __ATOMIC_SEQ_CST:
615 (__order == memory_order_acq_rel ? __ATOMIC_ACQUIRE:
616 __ATOMIC_CONSUME))));
617}
618
Dan Albert7b65ace2014-08-09 23:51:51 +0000619} // namespace __gcc_atomic
620
621template <typename _Tp>
622static inline
623typename enable_if<
624 __gcc_atomic::__can_assign<volatile _Atomic(_Tp)*, _Tp>::value>::type
625__c11_atomic_init(volatile _Atomic(_Tp)* __a, _Tp __val) {
626 __a->__a_value = __val;
627}
628
629template <typename _Tp>
630static inline
631typename enable_if<
632 !__gcc_atomic::__can_assign<volatile _Atomic(_Tp)*, _Tp>::value &&
633 __gcc_atomic::__can_assign< _Atomic(_Tp)*, _Tp>::value>::type
634__c11_atomic_init(volatile _Atomic(_Tp)* __a, _Tp __val) {
635 // [atomics.types.generic]p1 guarantees _Tp is trivially copyable. Because
636 // the default operator= in an object is not volatile, a byte-by-byte copy
637 // is required.
638 volatile char* to = reinterpret_cast<volatile char*>(&__a->__a_value);
639 volatile char* end = to + sizeof(_Tp);
640 char* from = reinterpret_cast<char*>(&__val);
641 while (to != end) {
642 *to++ = *from++;
643 }
644}
645
646template <typename _Tp>
647static inline void __c11_atomic_init(_Atomic(_Tp)* __a, _Tp __val) {
648 __a->__a_value = __val;
649}
650
651static inline void __c11_atomic_thread_fence(memory_order __order) {
652 __atomic_thread_fence(__gcc_atomic::__to_gcc_order(__order));
653}
654
655static inline void __c11_atomic_signal_fence(memory_order __order) {
656 __atomic_signal_fence(__gcc_atomic::__to_gcc_order(__order));
657}
658
Dan Albert7b65ace2014-08-09 23:51:51 +0000659template <typename _Tp>
660static inline void __c11_atomic_store(volatile _Atomic(_Tp)* __a, _Tp __val,
661 memory_order __order) {
662 return __atomic_store(&__a->__a_value, &__val,
663 __gcc_atomic::__to_gcc_order(__order));
664}
665
666template <typename _Tp>
667static inline void __c11_atomic_store(_Atomic(_Tp)* __a, _Tp __val,
668 memory_order __order) {
Dan Albert48815f22015-01-06 18:39:37 +0000669 __atomic_store(&__a->__a_value, &__val,
670 __gcc_atomic::__to_gcc_order(__order));
Dan Albert7b65ace2014-08-09 23:51:51 +0000671}
672
673template <typename _Tp>
674static inline _Tp __c11_atomic_load(volatile _Atomic(_Tp)* __a,
675 memory_order __order) {
676 _Tp __ret;
677 __atomic_load(&__a->__a_value, &__ret,
678 __gcc_atomic::__to_gcc_order(__order));
679 return __ret;
680}
681
682template <typename _Tp>
683static inline _Tp __c11_atomic_load(_Atomic(_Tp)* __a, memory_order __order) {
684 _Tp __ret;
685 __atomic_load(&__a->__a_value, &__ret,
686 __gcc_atomic::__to_gcc_order(__order));
687 return __ret;
688}
689
690template <typename _Tp>
691static inline _Tp __c11_atomic_exchange(volatile _Atomic(_Tp)* __a,
692 _Tp __value, memory_order __order) {
693 _Tp __ret;
694 __atomic_exchange(&__a->__a_value, &__value, &__ret,
695 __gcc_atomic::__to_gcc_order(__order));
696 return __ret;
697}
698
699template <typename _Tp>
700static inline _Tp __c11_atomic_exchange(_Atomic(_Tp)* __a, _Tp __value,
701 memory_order __order) {
702 _Tp __ret;
703 __atomic_exchange(&__a->__a_value, &__value, &__ret,
704 __gcc_atomic::__to_gcc_order(__order));
705 return __ret;
706}
707
708template <typename _Tp>
709static inline bool __c11_atomic_compare_exchange_strong(
710 volatile _Atomic(_Tp)* __a, _Tp* __expected, _Tp __value,
711 memory_order __success, memory_order __failure) {
712 return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
713 false,
714 __gcc_atomic::__to_gcc_order(__success),
Dan Albert48815f22015-01-06 18:39:37 +0000715 __gcc_atomic::__to_gcc_failure_order(__failure));
Dan Albert7b65ace2014-08-09 23:51:51 +0000716}
717
718template <typename _Tp>
719static inline bool __c11_atomic_compare_exchange_strong(
720 _Atomic(_Tp)* __a, _Tp* __expected, _Tp __value, memory_order __success,
721 memory_order __failure) {
722 return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
723 false,
724 __gcc_atomic::__to_gcc_order(__success),
Dan Albert48815f22015-01-06 18:39:37 +0000725 __gcc_atomic::__to_gcc_failure_order(__failure));
Dan Albert7b65ace2014-08-09 23:51:51 +0000726}
727
728template <typename _Tp>
729static inline bool __c11_atomic_compare_exchange_weak(
730 volatile _Atomic(_Tp)* __a, _Tp* __expected, _Tp __value,
731 memory_order __success, memory_order __failure) {
732 return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
733 true,
734 __gcc_atomic::__to_gcc_order(__success),
Dan Albert48815f22015-01-06 18:39:37 +0000735 __gcc_atomic::__to_gcc_failure_order(__failure));
Dan Albert7b65ace2014-08-09 23:51:51 +0000736}
737
738template <typename _Tp>
739static inline bool __c11_atomic_compare_exchange_weak(
740 _Atomic(_Tp)* __a, _Tp* __expected, _Tp __value, memory_order __success,
741 memory_order __failure) {
742 return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
743 true,
744 __gcc_atomic::__to_gcc_order(__success),
Dan Albert48815f22015-01-06 18:39:37 +0000745 __gcc_atomic::__to_gcc_failure_order(__failure));
Dan Albert7b65ace2014-08-09 23:51:51 +0000746}
747
748template <typename _Tp>
749struct __skip_amt { enum {value = 1}; };
750
751template <typename _Tp>
752struct __skip_amt<_Tp*> { enum {value = sizeof(_Tp)}; };
753
754// FIXME: Haven't figured out what the spec says about using arrays with
755// atomic_fetch_add. Force a failure rather than creating bad behavior.
756template <typename _Tp>
757struct __skip_amt<_Tp[]> { };
758template <typename _Tp, int n>
759struct __skip_amt<_Tp[n]> { };
760
761template <typename _Tp, typename _Td>
762static inline _Tp __c11_atomic_fetch_add(volatile _Atomic(_Tp)* __a,
763 _Td __delta, memory_order __order) {
764 return __atomic_fetch_add(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
765 __gcc_atomic::__to_gcc_order(__order));
766}
767
768template <typename _Tp, typename _Td>
769static inline _Tp __c11_atomic_fetch_add(_Atomic(_Tp)* __a, _Td __delta,
770 memory_order __order) {
771 return __atomic_fetch_add(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
772 __gcc_atomic::__to_gcc_order(__order));
773}
774
775template <typename _Tp, typename _Td>
776static inline _Tp __c11_atomic_fetch_sub(volatile _Atomic(_Tp)* __a,
777 _Td __delta, memory_order __order) {
778 return __atomic_fetch_sub(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
779 __gcc_atomic::__to_gcc_order(__order));
780}
781
782template <typename _Tp, typename _Td>
783static inline _Tp __c11_atomic_fetch_sub(_Atomic(_Tp)* __a, _Td __delta,
784 memory_order __order) {
785 return __atomic_fetch_sub(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
786 __gcc_atomic::__to_gcc_order(__order));
787}
788
789template <typename _Tp>
790static inline _Tp __c11_atomic_fetch_and(volatile _Atomic(_Tp)* __a,
791 _Tp __pattern, memory_order __order) {
792 return __atomic_fetch_and(&__a->__a_value, __pattern,
793 __gcc_atomic::__to_gcc_order(__order));
794}
795
796template <typename _Tp>
797static inline _Tp __c11_atomic_fetch_and(_Atomic(_Tp)* __a,
798 _Tp __pattern, memory_order __order) {
799 return __atomic_fetch_and(&__a->__a_value, __pattern,
800 __gcc_atomic::__to_gcc_order(__order));
801}
802
803template <typename _Tp>
804static inline _Tp __c11_atomic_fetch_or(volatile _Atomic(_Tp)* __a,
805 _Tp __pattern, memory_order __order) {
806 return __atomic_fetch_or(&__a->__a_value, __pattern,
807 __gcc_atomic::__to_gcc_order(__order));
808}
809
810template <typename _Tp>
811static inline _Tp __c11_atomic_fetch_or(_Atomic(_Tp)* __a, _Tp __pattern,
812 memory_order __order) {
813 return __atomic_fetch_or(&__a->__a_value, __pattern,
814 __gcc_atomic::__to_gcc_order(__order));
815}
816
817template <typename _Tp>
818static inline _Tp __c11_atomic_fetch_xor(volatile _Atomic(_Tp)* __a,
819 _Tp __pattern, memory_order __order) {
820 return __atomic_fetch_xor(&__a->__a_value, __pattern,
821 __gcc_atomic::__to_gcc_order(__order));
822}
823
824template <typename _Tp>
825static inline _Tp __c11_atomic_fetch_xor(_Atomic(_Tp)* __a, _Tp __pattern,
826 memory_order __order) {
827 return __atomic_fetch_xor(&__a->__a_value, __pattern,
828 __gcc_atomic::__to_gcc_order(__order));
829}
Eric Fiselier8020b6c2015-08-19 17:21:46 +0000830#endif // _LIBCPP_HAS_GCC_ATOMIC_IMP
Dan Albert7b65ace2014-08-09 23:51:51 +0000831
Howard Hinnantdca6e712010-09-28 17:13:38 +0000832template <class _Tp>
833inline _LIBCPP_INLINE_VISIBILITY
834_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +0000835kill_dependency(_Tp __y) _NOEXCEPT
Howard Hinnantdca6e712010-09-28 17:13:38 +0000836{
837 return __y;
838}
Howard Hinnant71be7292010-09-27 21:17:38 +0000839
JF Bastienfdb42c22016-03-25 15:48:21 +0000840#define ATOMIC_BOOL_LOCK_FREE __GCC_ATOMIC_BOOL_LOCK_FREE
841#define ATOMIC_CHAR_LOCK_FREE __GCC_ATOMIC_CHAR_LOCK_FREE
842#define ATOMIC_CHAR16_T_LOCK_FREE __GCC_ATOMIC_CHAR16_T_LOCK_FREE
843#define ATOMIC_CHAR32_T_LOCK_FREE __GCC_ATOMIC_CHAR32_T_LOCK_FREE
844#define ATOMIC_WCHAR_T_LOCK_FREE __GCC_ATOMIC_WCHAR_T_LOCK_FREE
845#define ATOMIC_SHORT_LOCK_FREE __GCC_ATOMIC_SHORT_LOCK_FREE
846#define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE
847#define ATOMIC_LONG_LOCK_FREE __GCC_ATOMIC_LONG_LOCK_FREE
848#define ATOMIC_LLONG_LOCK_FREE __GCC_ATOMIC_LLONG_LOCK_FREE
849#define ATOMIC_POINTER_LOCK_FREE __GCC_ATOMIC_POINTER_LOCK_FREE
850
Howard Hinnant138f5922010-12-07 20:46:14 +0000851// general atomic<T>
852
853template <class _Tp, bool = is_integral<_Tp>::value && !is_same<_Tp, bool>::value>
854struct __atomic_base // false
855{
Howard Hinnantd5eebd62012-09-16 20:33:09 +0000856 mutable _Atomic(_Tp) __a_;
Howard Hinnant138f5922010-12-07 20:46:14 +0000857
JF Bastienfdb42c22016-03-25 15:48:21 +0000858#if defined(__cpp_lib_atomic_is_always_lock_free)
859 static _LIBCPP_CONSTEXPR bool is_always_lock_free = __atomic_always_lock_free(sizeof(__a_), 0);
860#endif
861
Howard Hinnant138f5922010-12-07 20:46:14 +0000862 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000863 bool is_lock_free() const volatile _NOEXCEPT
Eric Fiselier3fd22c22015-06-13 00:23:07 +0000864 {
Eric Fiselier8020b6c2015-08-19 17:21:46 +0000865#if defined(_LIBCPP_HAS_C_ATOMIC_IMP)
Eric Fiselier3fd22c22015-06-13 00:23:07 +0000866 return __c11_atomic_is_lock_free(sizeof(_Tp));
867#else
868 return __atomic_is_lock_free(sizeof(_Tp), 0);
869#endif
870 }
Howard Hinnant138f5922010-12-07 20:46:14 +0000871 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000872 bool is_lock_free() const _NOEXCEPT
Eric Fiselier3fd22c22015-06-13 00:23:07 +0000873 {return static_cast<__atomic_base const volatile*>(this)->is_lock_free();}
Howard Hinnant138f5922010-12-07 20:46:14 +0000874 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000875 void store(_Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000876 {__c11_atomic_store(&__a_, __d, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000877 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000878 void store(_Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000879 {__c11_atomic_store(&__a_, __d, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000880 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000881 _Tp load(memory_order __m = memory_order_seq_cst) const volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000882 {return __c11_atomic_load(&__a_, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000883 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000884 _Tp load(memory_order __m = memory_order_seq_cst) const _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000885 {return __c11_atomic_load(&__a_, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000886 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000887 operator _Tp() const volatile _NOEXCEPT {return load();}
Howard Hinnant138f5922010-12-07 20:46:14 +0000888 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000889 operator _Tp() const _NOEXCEPT {return load();}
Howard Hinnant138f5922010-12-07 20:46:14 +0000890 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000891 _Tp exchange(_Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000892 {return __c11_atomic_exchange(&__a_, __d, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000893 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000894 _Tp exchange(_Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000895 {return __c11_atomic_exchange(&__a_, __d, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000896 _LIBCPP_INLINE_VISIBILITY
897 bool compare_exchange_weak(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000898 memory_order __s, memory_order __f) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000899 {return __c11_atomic_compare_exchange_weak(&__a_, &__e, __d, __s, __f);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000900 _LIBCPP_INLINE_VISIBILITY
901 bool compare_exchange_weak(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000902 memory_order __s, memory_order __f) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000903 {return __c11_atomic_compare_exchange_weak(&__a_, &__e, __d, __s, __f);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000904 _LIBCPP_INLINE_VISIBILITY
905 bool compare_exchange_strong(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000906 memory_order __s, memory_order __f) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000907 {return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __s, __f);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000908 _LIBCPP_INLINE_VISIBILITY
909 bool compare_exchange_strong(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000910 memory_order __s, memory_order __f) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000911 {return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __s, __f);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000912 _LIBCPP_INLINE_VISIBILITY
913 bool compare_exchange_weak(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000914 memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000915 {return __c11_atomic_compare_exchange_weak(&__a_, &__e, __d, __m, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000916 _LIBCPP_INLINE_VISIBILITY
917 bool compare_exchange_weak(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000918 memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000919 {return __c11_atomic_compare_exchange_weak(&__a_, &__e, __d, __m, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000920 _LIBCPP_INLINE_VISIBILITY
921 bool compare_exchange_strong(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000922 memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000923 {return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000924 _LIBCPP_INLINE_VISIBILITY
925 bool compare_exchange_strong(_Tp& __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +0000926 memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000927 {return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000928
929 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3d284222013-05-02 20:18:43 +0000930#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
931 __atomic_base() _NOEXCEPT = default;
932#else
933 __atomic_base() _NOEXCEPT : __a_() {}
934#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
935
Howard Hinnant138f5922010-12-07 20:46:14 +0000936 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000937 _LIBCPP_CONSTEXPR __atomic_base(_Tp __d) _NOEXCEPT : __a_(__d) {}
Howard Hinnant6ac60f82010-12-08 17:20:28 +0000938#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
Howard Hinnant138f5922010-12-07 20:46:14 +0000939 __atomic_base(const __atomic_base&) = delete;
940 __atomic_base& operator=(const __atomic_base&) = delete;
941 __atomic_base& operator=(const __atomic_base&) volatile = delete;
Howard Hinnant6ac60f82010-12-08 17:20:28 +0000942#else // _LIBCPP_HAS_NO_DELETED_FUNCTIONS
943private:
944 __atomic_base(const __atomic_base&);
945 __atomic_base& operator=(const __atomic_base&);
946 __atomic_base& operator=(const __atomic_base&) volatile;
947#endif // _LIBCPP_HAS_NO_DELETED_FUNCTIONS
Howard Hinnant138f5922010-12-07 20:46:14 +0000948};
949
JF Bastienfdb42c22016-03-25 15:48:21 +0000950#if defined(__cpp_lib_atomic_is_always_lock_free)
951template <class _Tp, bool __b>
952_LIBCPP_CONSTEXPR bool __atomic_base<_Tp, __b>::is_always_lock_free;
953#endif
954
Howard Hinnant138f5922010-12-07 20:46:14 +0000955// atomic<Integral>
956
957template <class _Tp>
958struct __atomic_base<_Tp, true>
959 : public __atomic_base<_Tp, false>
960{
961 typedef __atomic_base<_Tp, false> __base;
962 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3d284222013-05-02 20:18:43 +0000963 __atomic_base() _NOEXCEPT _LIBCPP_DEFAULT
Howard Hinnant138f5922010-12-07 20:46:14 +0000964 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000965 _LIBCPP_CONSTEXPR __atomic_base(_Tp __d) _NOEXCEPT : __base(__d) {}
Howard Hinnant138f5922010-12-07 20:46:14 +0000966
967 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000968 _Tp fetch_add(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000969 {return __c11_atomic_fetch_add(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000970 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000971 _Tp fetch_add(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000972 {return __c11_atomic_fetch_add(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000973 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000974 _Tp fetch_sub(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000975 {return __c11_atomic_fetch_sub(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000976 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000977 _Tp fetch_sub(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000978 {return __c11_atomic_fetch_sub(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000979 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000980 _Tp fetch_and(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000981 {return __c11_atomic_fetch_and(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000982 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000983 _Tp fetch_and(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000984 {return __c11_atomic_fetch_and(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000985 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000986 _Tp fetch_or(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000987 {return __c11_atomic_fetch_or(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000988 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000989 _Tp fetch_or(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000990 {return __c11_atomic_fetch_or(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000991 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000992 _Tp fetch_xor(_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000993 {return __c11_atomic_fetch_xor(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000994 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000995 _Tp fetch_xor(_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +0000996 {return __c11_atomic_fetch_xor(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +0000997
998 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +0000999 _Tp operator++(int) volatile _NOEXCEPT {return fetch_add(_Tp(1));}
Howard Hinnant138f5922010-12-07 20:46:14 +00001000 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001001 _Tp operator++(int) _NOEXCEPT {return fetch_add(_Tp(1));}
Howard Hinnant138f5922010-12-07 20:46:14 +00001002 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001003 _Tp operator--(int) volatile _NOEXCEPT {return fetch_sub(_Tp(1));}
Howard Hinnant138f5922010-12-07 20:46:14 +00001004 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001005 _Tp operator--(int) _NOEXCEPT {return fetch_sub(_Tp(1));}
Howard Hinnant138f5922010-12-07 20:46:14 +00001006 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001007 _Tp operator++() volatile _NOEXCEPT {return fetch_add(_Tp(1)) + _Tp(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001008 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001009 _Tp operator++() _NOEXCEPT {return fetch_add(_Tp(1)) + _Tp(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001010 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001011 _Tp operator--() volatile _NOEXCEPT {return fetch_sub(_Tp(1)) - _Tp(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001012 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001013 _Tp operator--() _NOEXCEPT {return fetch_sub(_Tp(1)) - _Tp(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001014 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001015 _Tp operator+=(_Tp __op) volatile _NOEXCEPT {return fetch_add(__op) + __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001016 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001017 _Tp operator+=(_Tp __op) _NOEXCEPT {return fetch_add(__op) + __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001018 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001019 _Tp operator-=(_Tp __op) volatile _NOEXCEPT {return fetch_sub(__op) - __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001020 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001021 _Tp operator-=(_Tp __op) _NOEXCEPT {return fetch_sub(__op) - __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001022 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001023 _Tp operator&=(_Tp __op) volatile _NOEXCEPT {return fetch_and(__op) & __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001024 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001025 _Tp operator&=(_Tp __op) _NOEXCEPT {return fetch_and(__op) & __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001026 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001027 _Tp operator|=(_Tp __op) volatile _NOEXCEPT {return fetch_or(__op) | __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001028 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001029 _Tp operator|=(_Tp __op) _NOEXCEPT {return fetch_or(__op) | __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001030 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001031 _Tp operator^=(_Tp __op) volatile _NOEXCEPT {return fetch_xor(__op) ^ __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001032 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001033 _Tp operator^=(_Tp __op) _NOEXCEPT {return fetch_xor(__op) ^ __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001034};
1035
1036// atomic<T>
1037
1038template <class _Tp>
1039struct atomic
1040 : public __atomic_base<_Tp>
1041{
1042 typedef __atomic_base<_Tp> __base;
1043 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3d284222013-05-02 20:18:43 +00001044 atomic() _NOEXCEPT _LIBCPP_DEFAULT
Howard Hinnant138f5922010-12-07 20:46:14 +00001045 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001046 _LIBCPP_CONSTEXPR atomic(_Tp __d) _NOEXCEPT : __base(__d) {}
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001047
1048 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001049 _Tp operator=(_Tp __d) volatile _NOEXCEPT
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001050 {__base::store(__d); return __d;}
1051 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001052 _Tp operator=(_Tp __d) _NOEXCEPT
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001053 {__base::store(__d); return __d;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001054};
1055
1056// atomic<T*>
1057
1058template <class _Tp>
1059struct atomic<_Tp*>
1060 : public __atomic_base<_Tp*>
1061{
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001062 typedef __atomic_base<_Tp*> __base;
Howard Hinnant138f5922010-12-07 20:46:14 +00001063 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3d284222013-05-02 20:18:43 +00001064 atomic() _NOEXCEPT _LIBCPP_DEFAULT
Howard Hinnant138f5922010-12-07 20:46:14 +00001065 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001066 _LIBCPP_CONSTEXPR atomic(_Tp* __d) _NOEXCEPT : __base(__d) {}
Howard Hinnant138f5922010-12-07 20:46:14 +00001067
1068 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001069 _Tp* operator=(_Tp* __d) volatile _NOEXCEPT
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001070 {__base::store(__d); return __d;}
1071 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001072 _Tp* operator=(_Tp* __d) _NOEXCEPT
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001073 {__base::store(__d); return __d;}
1074
1075 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant138f5922010-12-07 20:46:14 +00001076 _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst)
Howard Hinnanteee2c142012-04-11 20:14:21 +00001077 volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +00001078 {return __c11_atomic_fetch_add(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001079 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001080 _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +00001081 {return __c11_atomic_fetch_add(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001082 _LIBCPP_INLINE_VISIBILITY
1083 _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst)
Howard Hinnanteee2c142012-04-11 20:14:21 +00001084 volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +00001085 {return __c11_atomic_fetch_sub(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001086 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001087 _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +00001088 {return __c11_atomic_fetch_sub(&this->__a_, __op, __m);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001089
1090 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001091 _Tp* operator++(int) volatile _NOEXCEPT {return fetch_add(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001092 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001093 _Tp* operator++(int) _NOEXCEPT {return fetch_add(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001094 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001095 _Tp* operator--(int) volatile _NOEXCEPT {return fetch_sub(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001096 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001097 _Tp* operator--(int) _NOEXCEPT {return fetch_sub(1);}
Howard Hinnant138f5922010-12-07 20:46:14 +00001098 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001099 _Tp* operator++() volatile _NOEXCEPT {return fetch_add(1) + 1;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001100 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001101 _Tp* operator++() _NOEXCEPT {return fetch_add(1) + 1;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001102 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001103 _Tp* operator--() volatile _NOEXCEPT {return fetch_sub(1) - 1;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001104 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001105 _Tp* operator--() _NOEXCEPT {return fetch_sub(1) - 1;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001106 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001107 _Tp* operator+=(ptrdiff_t __op) volatile _NOEXCEPT {return fetch_add(__op) + __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001108 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001109 _Tp* operator+=(ptrdiff_t __op) _NOEXCEPT {return fetch_add(__op) + __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001110 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001111 _Tp* operator-=(ptrdiff_t __op) volatile _NOEXCEPT {return fetch_sub(__op) - __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001112 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001113 _Tp* operator-=(ptrdiff_t __op) _NOEXCEPT {return fetch_sub(__op) - __op;}
Howard Hinnant138f5922010-12-07 20:46:14 +00001114};
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001115
1116// atomic_is_lock_free
1117
1118template <class _Tp>
1119inline _LIBCPP_INLINE_VISIBILITY
1120bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001121atomic_is_lock_free(const volatile atomic<_Tp>* __o) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001122{
Howard Hinnant138f5922010-12-07 20:46:14 +00001123 return __o->is_lock_free();
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001124}
1125
1126template <class _Tp>
1127inline _LIBCPP_INLINE_VISIBILITY
1128bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001129atomic_is_lock_free(const atomic<_Tp>* __o) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001130{
Howard Hinnant138f5922010-12-07 20:46:14 +00001131 return __o->is_lock_free();
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001132}
1133
1134// atomic_init
1135
1136template <class _Tp>
1137inline _LIBCPP_INLINE_VISIBILITY
1138void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001139atomic_init(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001140{
Richard Smith27a4a972012-04-11 18:55:46 +00001141 __c11_atomic_init(&__o->__a_, __d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001142}
1143
1144template <class _Tp>
1145inline _LIBCPP_INLINE_VISIBILITY
1146void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001147atomic_init(atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001148{
Richard Smith27a4a972012-04-11 18:55:46 +00001149 __c11_atomic_init(&__o->__a_, __d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001150}
1151
1152// atomic_store
1153
1154template <class _Tp>
1155inline _LIBCPP_INLINE_VISIBILITY
1156void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001157atomic_store(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001158{
Howard Hinnant138f5922010-12-07 20:46:14 +00001159 __o->store(__d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001160}
1161
1162template <class _Tp>
1163inline _LIBCPP_INLINE_VISIBILITY
1164void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001165atomic_store(atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001166{
Howard Hinnant138f5922010-12-07 20:46:14 +00001167 __o->store(__d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001168}
1169
1170// atomic_store_explicit
1171
1172template <class _Tp>
1173inline _LIBCPP_INLINE_VISIBILITY
1174void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001175atomic_store_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001176{
Howard Hinnant138f5922010-12-07 20:46:14 +00001177 __o->store(__d, __m);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001178}
1179
1180template <class _Tp>
1181inline _LIBCPP_INLINE_VISIBILITY
1182void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001183atomic_store_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001184{
Howard Hinnant138f5922010-12-07 20:46:14 +00001185 __o->store(__d, __m);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001186}
1187
1188// atomic_load
1189
1190template <class _Tp>
1191inline _LIBCPP_INLINE_VISIBILITY
1192_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001193atomic_load(const volatile atomic<_Tp>* __o) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001194{
Howard Hinnant138f5922010-12-07 20:46:14 +00001195 return __o->load();
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001196}
1197
1198template <class _Tp>
1199inline _LIBCPP_INLINE_VISIBILITY
1200_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001201atomic_load(const atomic<_Tp>* __o) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001202{
Howard Hinnant138f5922010-12-07 20:46:14 +00001203 return __o->load();
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001204}
1205
1206// atomic_load_explicit
1207
1208template <class _Tp>
1209inline _LIBCPP_INLINE_VISIBILITY
1210_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001211atomic_load_explicit(const volatile atomic<_Tp>* __o, memory_order __m) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001212{
Howard Hinnant138f5922010-12-07 20:46:14 +00001213 return __o->load(__m);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001214}
1215
1216template <class _Tp>
1217inline _LIBCPP_INLINE_VISIBILITY
1218_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001219atomic_load_explicit(const atomic<_Tp>* __o, memory_order __m) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001220{
Howard Hinnant138f5922010-12-07 20:46:14 +00001221 return __o->load(__m);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001222}
1223
1224// atomic_exchange
1225
1226template <class _Tp>
1227inline _LIBCPP_INLINE_VISIBILITY
1228_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001229atomic_exchange(volatile atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001230{
Howard Hinnant138f5922010-12-07 20:46:14 +00001231 return __o->exchange(__d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001232}
1233
1234template <class _Tp>
1235inline _LIBCPP_INLINE_VISIBILITY
1236_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001237atomic_exchange(atomic<_Tp>* __o, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001238{
Howard Hinnant138f5922010-12-07 20:46:14 +00001239 return __o->exchange(__d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001240}
1241
1242// atomic_exchange_explicit
1243
1244template <class _Tp>
1245inline _LIBCPP_INLINE_VISIBILITY
1246_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001247atomic_exchange_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001248{
Howard Hinnant138f5922010-12-07 20:46:14 +00001249 return __o->exchange(__d, __m);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001250}
1251
1252template <class _Tp>
1253inline _LIBCPP_INLINE_VISIBILITY
1254_Tp
Howard Hinnanteee2c142012-04-11 20:14:21 +00001255atomic_exchange_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001256{
Howard Hinnant138f5922010-12-07 20:46:14 +00001257 return __o->exchange(__d, __m);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001258}
1259
1260// atomic_compare_exchange_weak
1261
1262template <class _Tp>
1263inline _LIBCPP_INLINE_VISIBILITY
1264bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001265atomic_compare_exchange_weak(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001266{
Howard Hinnant138f5922010-12-07 20:46:14 +00001267 return __o->compare_exchange_weak(*__e, __d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001268}
1269
1270template <class _Tp>
1271inline _LIBCPP_INLINE_VISIBILITY
1272bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001273atomic_compare_exchange_weak(atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001274{
Howard Hinnant138f5922010-12-07 20:46:14 +00001275 return __o->compare_exchange_weak(*__e, __d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001276}
1277
1278// atomic_compare_exchange_strong
1279
1280template <class _Tp>
1281inline _LIBCPP_INLINE_VISIBILITY
1282bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001283atomic_compare_exchange_strong(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001284{
Howard Hinnant138f5922010-12-07 20:46:14 +00001285 return __o->compare_exchange_strong(*__e, __d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001286}
1287
1288template <class _Tp>
1289inline _LIBCPP_INLINE_VISIBILITY
1290bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001291atomic_compare_exchange_strong(atomic<_Tp>* __o, _Tp* __e, _Tp __d) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001292{
Howard Hinnant138f5922010-12-07 20:46:14 +00001293 return __o->compare_exchange_strong(*__e, __d);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001294}
1295
1296// atomic_compare_exchange_weak_explicit
1297
1298template <class _Tp>
1299inline _LIBCPP_INLINE_VISIBILITY
1300bool
1301atomic_compare_exchange_weak_explicit(volatile atomic<_Tp>* __o, _Tp* __e,
1302 _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001303 memory_order __s, memory_order __f) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001304{
Howard Hinnant138f5922010-12-07 20:46:14 +00001305 return __o->compare_exchange_weak(*__e, __d, __s, __f);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001306}
1307
1308template <class _Tp>
1309inline _LIBCPP_INLINE_VISIBILITY
1310bool
1311atomic_compare_exchange_weak_explicit(atomic<_Tp>* __o, _Tp* __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001312 memory_order __s, memory_order __f) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001313{
Howard Hinnant138f5922010-12-07 20:46:14 +00001314 return __o->compare_exchange_weak(*__e, __d, __s, __f);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001315}
1316
1317// atomic_compare_exchange_strong_explicit
1318
1319template <class _Tp>
1320inline _LIBCPP_INLINE_VISIBILITY
1321bool
1322atomic_compare_exchange_strong_explicit(volatile atomic<_Tp>* __o,
1323 _Tp* __e, _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001324 memory_order __s, memory_order __f) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001325{
Howard Hinnant138f5922010-12-07 20:46:14 +00001326 return __o->compare_exchange_strong(*__e, __d, __s, __f);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001327}
1328
1329template <class _Tp>
1330inline _LIBCPP_INLINE_VISIBILITY
1331bool
1332atomic_compare_exchange_strong_explicit(atomic<_Tp>* __o, _Tp* __e,
1333 _Tp __d,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001334 memory_order __s, memory_order __f) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001335{
Howard Hinnant138f5922010-12-07 20:46:14 +00001336 return __o->compare_exchange_strong(*__e, __d, __s, __f);
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001337}
1338
Howard Hinnant138f5922010-12-07 20:46:14 +00001339// atomic_fetch_add
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001340
1341template <class _Tp>
Howard Hinnant138f5922010-12-07 20:46:14 +00001342inline _LIBCPP_INLINE_VISIBILITY
1343typename enable_if
1344<
1345 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1346 _Tp
1347>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001348atomic_fetch_add(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001349{
Howard Hinnant138f5922010-12-07 20:46:14 +00001350 return __o->fetch_add(__op);
1351}
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001352
Howard Hinnant138f5922010-12-07 20:46:14 +00001353template <class _Tp>
1354inline _LIBCPP_INLINE_VISIBILITY
1355typename enable_if
1356<
1357 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1358 _Tp
1359>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001360atomic_fetch_add(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001361{
1362 return __o->fetch_add(__op);
1363}
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001364
Howard Hinnant138f5922010-12-07 20:46:14 +00001365template <class _Tp>
1366inline _LIBCPP_INLINE_VISIBILITY
1367_Tp*
Howard Hinnanteee2c142012-04-11 20:14:21 +00001368atomic_fetch_add(volatile atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001369{
1370 return __o->fetch_add(__op);
1371}
1372
1373template <class _Tp>
1374inline _LIBCPP_INLINE_VISIBILITY
1375_Tp*
Howard Hinnanteee2c142012-04-11 20:14:21 +00001376atomic_fetch_add(atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001377{
1378 return __o->fetch_add(__op);
1379}
1380
1381// atomic_fetch_add_explicit
1382
1383template <class _Tp>
1384inline _LIBCPP_INLINE_VISIBILITY
1385typename enable_if
1386<
1387 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1388 _Tp
1389>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001390atomic_fetch_add_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001391{
1392 return __o->fetch_add(__op, __m);
1393}
1394
1395template <class _Tp>
1396inline _LIBCPP_INLINE_VISIBILITY
1397typename enable_if
1398<
1399 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1400 _Tp
1401>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001402atomic_fetch_add_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001403{
1404 return __o->fetch_add(__op, __m);
1405}
1406
1407template <class _Tp>
1408inline _LIBCPP_INLINE_VISIBILITY
1409_Tp*
1410atomic_fetch_add_explicit(volatile atomic<_Tp*>* __o, ptrdiff_t __op,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001411 memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001412{
1413 return __o->fetch_add(__op, __m);
1414}
1415
1416template <class _Tp>
1417inline _LIBCPP_INLINE_VISIBILITY
1418_Tp*
Howard Hinnanteee2c142012-04-11 20:14:21 +00001419atomic_fetch_add_explicit(atomic<_Tp*>* __o, ptrdiff_t __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001420{
1421 return __o->fetch_add(__op, __m);
1422}
1423
1424// atomic_fetch_sub
1425
1426template <class _Tp>
1427inline _LIBCPP_INLINE_VISIBILITY
1428typename enable_if
1429<
1430 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1431 _Tp
1432>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001433atomic_fetch_sub(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001434{
1435 return __o->fetch_sub(__op);
1436}
1437
1438template <class _Tp>
1439inline _LIBCPP_INLINE_VISIBILITY
1440typename enable_if
1441<
1442 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1443 _Tp
1444>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001445atomic_fetch_sub(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001446{
1447 return __o->fetch_sub(__op);
1448}
1449
1450template <class _Tp>
1451inline _LIBCPP_INLINE_VISIBILITY
1452_Tp*
Howard Hinnanteee2c142012-04-11 20:14:21 +00001453atomic_fetch_sub(volatile atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001454{
1455 return __o->fetch_sub(__op);
1456}
1457
1458template <class _Tp>
1459inline _LIBCPP_INLINE_VISIBILITY
1460_Tp*
Howard Hinnanteee2c142012-04-11 20:14:21 +00001461atomic_fetch_sub(atomic<_Tp*>* __o, ptrdiff_t __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001462{
1463 return __o->fetch_sub(__op);
1464}
1465
1466// atomic_fetch_sub_explicit
1467
1468template <class _Tp>
1469inline _LIBCPP_INLINE_VISIBILITY
1470typename enable_if
1471<
1472 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1473 _Tp
1474>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001475atomic_fetch_sub_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001476{
1477 return __o->fetch_sub(__op, __m);
1478}
1479
1480template <class _Tp>
1481inline _LIBCPP_INLINE_VISIBILITY
1482typename enable_if
1483<
1484 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1485 _Tp
1486>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001487atomic_fetch_sub_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001488{
1489 return __o->fetch_sub(__op, __m);
1490}
1491
1492template <class _Tp>
1493inline _LIBCPP_INLINE_VISIBILITY
1494_Tp*
1495atomic_fetch_sub_explicit(volatile atomic<_Tp*>* __o, ptrdiff_t __op,
Howard Hinnanteee2c142012-04-11 20:14:21 +00001496 memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001497{
1498 return __o->fetch_sub(__op, __m);
1499}
1500
1501template <class _Tp>
1502inline _LIBCPP_INLINE_VISIBILITY
1503_Tp*
Howard Hinnanteee2c142012-04-11 20:14:21 +00001504atomic_fetch_sub_explicit(atomic<_Tp*>* __o, ptrdiff_t __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001505{
1506 return __o->fetch_sub(__op, __m);
1507}
1508
1509// atomic_fetch_and
1510
1511template <class _Tp>
1512inline _LIBCPP_INLINE_VISIBILITY
1513typename enable_if
1514<
1515 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1516 _Tp
1517>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001518atomic_fetch_and(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001519{
1520 return __o->fetch_and(__op);
1521}
1522
1523template <class _Tp>
1524inline _LIBCPP_INLINE_VISIBILITY
1525typename enable_if
1526<
1527 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1528 _Tp
1529>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001530atomic_fetch_and(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001531{
1532 return __o->fetch_and(__op);
1533}
1534
1535// atomic_fetch_and_explicit
1536
1537template <class _Tp>
1538inline _LIBCPP_INLINE_VISIBILITY
1539typename enable_if
1540<
1541 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1542 _Tp
1543>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001544atomic_fetch_and_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001545{
1546 return __o->fetch_and(__op, __m);
1547}
1548
1549template <class _Tp>
1550inline _LIBCPP_INLINE_VISIBILITY
1551typename enable_if
1552<
1553 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1554 _Tp
1555>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001556atomic_fetch_and_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001557{
1558 return __o->fetch_and(__op, __m);
1559}
1560
1561// atomic_fetch_or
1562
1563template <class _Tp>
1564inline _LIBCPP_INLINE_VISIBILITY
1565typename enable_if
1566<
1567 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1568 _Tp
1569>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001570atomic_fetch_or(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001571{
1572 return __o->fetch_or(__op);
1573}
1574
1575template <class _Tp>
1576inline _LIBCPP_INLINE_VISIBILITY
1577typename enable_if
1578<
1579 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1580 _Tp
1581>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001582atomic_fetch_or(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001583{
1584 return __o->fetch_or(__op);
1585}
1586
1587// atomic_fetch_or_explicit
1588
1589template <class _Tp>
1590inline _LIBCPP_INLINE_VISIBILITY
1591typename enable_if
1592<
1593 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1594 _Tp
1595>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001596atomic_fetch_or_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001597{
1598 return __o->fetch_or(__op, __m);
1599}
1600
1601template <class _Tp>
1602inline _LIBCPP_INLINE_VISIBILITY
1603typename enable_if
1604<
1605 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1606 _Tp
1607>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001608atomic_fetch_or_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001609{
1610 return __o->fetch_or(__op, __m);
1611}
1612
1613// atomic_fetch_xor
1614
1615template <class _Tp>
1616inline _LIBCPP_INLINE_VISIBILITY
1617typename enable_if
1618<
1619 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1620 _Tp
1621>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001622atomic_fetch_xor(volatile atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001623{
1624 return __o->fetch_xor(__op);
1625}
1626
1627template <class _Tp>
1628inline _LIBCPP_INLINE_VISIBILITY
1629typename enable_if
1630<
1631 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1632 _Tp
1633>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001634atomic_fetch_xor(atomic<_Tp>* __o, _Tp __op) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001635{
1636 return __o->fetch_xor(__op);
1637}
1638
1639// atomic_fetch_xor_explicit
1640
1641template <class _Tp>
1642inline _LIBCPP_INLINE_VISIBILITY
1643typename enable_if
1644<
1645 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1646 _Tp
1647>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001648atomic_fetch_xor_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001649{
1650 return __o->fetch_xor(__op, __m);
1651}
1652
1653template <class _Tp>
1654inline _LIBCPP_INLINE_VISIBILITY
1655typename enable_if
1656<
1657 is_integral<_Tp>::value && !is_same<_Tp, bool>::value,
1658 _Tp
1659>::type
Howard Hinnanteee2c142012-04-11 20:14:21 +00001660atomic_fetch_xor_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) _NOEXCEPT
Howard Hinnant138f5922010-12-07 20:46:14 +00001661{
1662 return __o->fetch_xor(__op, __m);
1663}
Howard Hinnant7bfaeb82010-12-06 23:10:08 +00001664
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001665// flag type and operations
1666
1667typedef struct atomic_flag
1668{
David Chisnall26ed3f42011-12-19 11:44:20 +00001669 _Atomic(bool) __a_;
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001670
1671 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001672 bool test_and_set(memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +00001673 {return __c11_atomic_exchange(&__a_, true, __m);}
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001674 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001675 bool test_and_set(memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +00001676 {return __c11_atomic_exchange(&__a_, true, __m);}
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001677 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001678 void clear(memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +00001679 {__c11_atomic_store(&__a_, false, __m);}
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001680 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001681 void clear(memory_order __m = memory_order_seq_cst) _NOEXCEPT
Richard Smith27a4a972012-04-11 18:55:46 +00001682 {__c11_atomic_store(&__a_, false, __m);}
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001683
1684 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3d284222013-05-02 20:18:43 +00001685#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
1686 atomic_flag() _NOEXCEPT = default;
1687#else
1688 atomic_flag() _NOEXCEPT : __a_() {}
1689#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
1690
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001691 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanteee2c142012-04-11 20:14:21 +00001692 atomic_flag(bool __b) _NOEXCEPT : __a_(__b) {}
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001693
1694#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
1695 atomic_flag(const atomic_flag&) = delete;
1696 atomic_flag& operator=(const atomic_flag&) = delete;
1697 atomic_flag& operator=(const atomic_flag&) volatile = delete;
1698#else // _LIBCPP_HAS_NO_DELETED_FUNCTIONS
1699private:
1700 atomic_flag(const atomic_flag&);
1701 atomic_flag& operator=(const atomic_flag&);
1702 atomic_flag& operator=(const atomic_flag&) volatile;
1703#endif // _LIBCPP_HAS_NO_DELETED_FUNCTIONS
1704} atomic_flag;
1705
1706inline _LIBCPP_INLINE_VISIBILITY
1707bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001708atomic_flag_test_and_set(volatile atomic_flag* __o) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001709{
1710 return __o->test_and_set();
1711}
1712
1713inline _LIBCPP_INLINE_VISIBILITY
1714bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001715atomic_flag_test_and_set(atomic_flag* __o) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001716{
1717 return __o->test_and_set();
1718}
1719
1720inline _LIBCPP_INLINE_VISIBILITY
1721bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001722atomic_flag_test_and_set_explicit(volatile atomic_flag* __o, memory_order __m) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001723{
1724 return __o->test_and_set(__m);
1725}
1726
1727inline _LIBCPP_INLINE_VISIBILITY
1728bool
Howard Hinnanteee2c142012-04-11 20:14:21 +00001729atomic_flag_test_and_set_explicit(atomic_flag* __o, memory_order __m) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001730{
1731 return __o->test_and_set(__m);
1732}
1733
1734inline _LIBCPP_INLINE_VISIBILITY
1735void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001736atomic_flag_clear(volatile atomic_flag* __o) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001737{
1738 __o->clear();
1739}
1740
1741inline _LIBCPP_INLINE_VISIBILITY
1742void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001743atomic_flag_clear(atomic_flag* __o) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001744{
1745 __o->clear();
1746}
1747
1748inline _LIBCPP_INLINE_VISIBILITY
1749void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001750atomic_flag_clear_explicit(volatile atomic_flag* __o, memory_order __m) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001751{
1752 __o->clear(__m);
1753}
1754
1755inline _LIBCPP_INLINE_VISIBILITY
1756void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001757atomic_flag_clear_explicit(atomic_flag* __o, memory_order __m) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001758{
1759 __o->clear(__m);
1760}
1761
1762// fences
1763
1764inline _LIBCPP_INLINE_VISIBILITY
1765void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001766atomic_thread_fence(memory_order __m) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001767{
Richard Smith27a4a972012-04-11 18:55:46 +00001768 __c11_atomic_thread_fence(__m);
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001769}
1770
1771inline _LIBCPP_INLINE_VISIBILITY
1772void
Howard Hinnanteee2c142012-04-11 20:14:21 +00001773atomic_signal_fence(memory_order __m) _NOEXCEPT
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001774{
Richard Smith27a4a972012-04-11 18:55:46 +00001775 __c11_atomic_signal_fence(__m);
Howard Hinnant6ac60f82010-12-08 17:20:28 +00001776}
1777
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001778// Atomics for standard typedef types
1779
Howard Hinnantf0af8d92013-01-04 18:58:50 +00001780typedef atomic<bool> atomic_bool;
Howard Hinnant96e4cd62010-12-07 23:24:41 +00001781typedef atomic<char> atomic_char;
1782typedef atomic<signed char> atomic_schar;
1783typedef atomic<unsigned char> atomic_uchar;
1784typedef atomic<short> atomic_short;
1785typedef atomic<unsigned short> atomic_ushort;
1786typedef atomic<int> atomic_int;
1787typedef atomic<unsigned int> atomic_uint;
1788typedef atomic<long> atomic_long;
1789typedef atomic<unsigned long> atomic_ulong;
1790typedef atomic<long long> atomic_llong;
1791typedef atomic<unsigned long long> atomic_ullong;
1792typedef atomic<char16_t> atomic_char16_t;
1793typedef atomic<char32_t> atomic_char32_t;
1794typedef atomic<wchar_t> atomic_wchar_t;
1795
1796typedef atomic<int_least8_t> atomic_int_least8_t;
1797typedef atomic<uint_least8_t> atomic_uint_least8_t;
1798typedef atomic<int_least16_t> atomic_int_least16_t;
1799typedef atomic<uint_least16_t> atomic_uint_least16_t;
1800typedef atomic<int_least32_t> atomic_int_least32_t;
1801typedef atomic<uint_least32_t> atomic_uint_least32_t;
1802typedef atomic<int_least64_t> atomic_int_least64_t;
1803typedef atomic<uint_least64_t> atomic_uint_least64_t;
1804
1805typedef atomic<int_fast8_t> atomic_int_fast8_t;
1806typedef atomic<uint_fast8_t> atomic_uint_fast8_t;
1807typedef atomic<int_fast16_t> atomic_int_fast16_t;
1808typedef atomic<uint_fast16_t> atomic_uint_fast16_t;
1809typedef atomic<int_fast32_t> atomic_int_fast32_t;
1810typedef atomic<uint_fast32_t> atomic_uint_fast32_t;
1811typedef atomic<int_fast64_t> atomic_int_fast64_t;
1812typedef atomic<uint_fast64_t> atomic_uint_fast64_t;
1813
1814typedef atomic<intptr_t> atomic_intptr_t;
1815typedef atomic<uintptr_t> atomic_uintptr_t;
1816typedef atomic<size_t> atomic_size_t;
1817typedef atomic<ptrdiff_t> atomic_ptrdiff_t;
1818typedef atomic<intmax_t> atomic_intmax_t;
1819typedef atomic<uintmax_t> atomic_uintmax_t;
1820
Howard Hinnantf1f066a2010-09-29 21:20:03 +00001821#define ATOMIC_FLAG_INIT {false}
Howard Hinnant953c31d2010-10-04 18:52:54 +00001822#define ATOMIC_VAR_INIT(__v) {__v}
1823
Howard Hinnant71be7292010-09-27 21:17:38 +00001824_LIBCPP_END_NAMESPACE_STD
1825
Howard Hinnant71be7292010-09-27 21:17:38 +00001826#endif // _LIBCPP_ATOMIC