blob: a2881205353458134ef0b5d15a4e46743b99c1c2 [file] [log] [blame]
Howard Hinnant8f73c632010-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
20// order and consistency
21
22typedef enum memory_order
23{
Howard Hinnantd1176e22010-09-28 17:13:38 +000024 memory_order_relaxed,
25 memory_order_consume, // load-consume
26 memory_order_acquire, // load-acquire
27 memory_order_release, // store-release
28 memory_order_acq_rel, // store-release load-acquire
29 memory_order_seq_cst // store-release load-acquire
Howard Hinnant8f73c632010-09-27 21:17:38 +000030} memory_order;
31
32template <class T> T kill_dependency(T y);
33
34// lock-free property
35
36#define ATOMIC_CHAR_LOCK_FREE unspecified
37#define ATOMIC_CHAR16_T_LOCK_FREE unspecified
38#define ATOMIC_CHAR32_T_LOCK_FREE unspecified
39#define ATOMIC_WCHAR_T_LOCK_FREE unspecified
40#define ATOMIC_SHORT_LOCK_FREE unspecified
41#define ATOMIC_INT_LOCK_FREE unspecified
42#define ATOMIC_LONG_LOCK_FREE unspecified
43#define ATOMIC_LLONG_LOCK_FREE unspecified
44#define ATOMIC_ADDRESS_LOCK_FREE unspecified
45
46// operations on atomic types
47
48#define ATOMIC_VAR_INIT(value) see below
49
50// flag type and operations
51
52typedef struct atomic_flag
53{
54 bool test_and_set(memory_order = memory_order_seq_cst) volatile;
55 bool test_and_set(memory_order = memory_order_seq_cst);
56 void clear(memory_order = memory_order_seq_cst) volatile;
57 void clear(memory_order = memory_order_seq_cst);
58 atomic_flag() = default;
59 atomic_flag(const atomic_flag&) = delete;
60 atomic_flag& operator=(const atomic_flag&) = delete;
61 atomic_flag& operator=(const atomic_flag&) volatile = delete;
62} atomic_flag;
63
64bool atomic_flag_test_and_set(volatile atomic_flag*);
65bool atomic_flag_test_and_set(atomic_flag*);
66bool atomic_flag_test_and_set_explicit(volatile atomic_flag*, memory_order);
67bool atomic_flag_test_and_set_explicit(atomic_flag*, memory_order);
68void atomic_flag_clear(volatile atomic_flag*);
69void atomic_flag_clear(atomic_flag*);
70void atomic_flag_clear_explicit(volatile atomic_flag*, memory_order);
71void atomic_flag_clear_explicit(atomic_flag*, memory_order);
72
73#define ATOMIC_FLAG_INIT see below
74
75// atomic_bool
76
77typedef struct atomic_bool
78{
79 bool is_lock_free() const volatile;
80 bool is_lock_free() const;
81 void store(bool, memory_order = memory_order_seq_cst) volatile;
82 void store(bool, memory_order = memory_order_seq_cst);
83 bool load(memory_order = memory_order_seq_cst) const volatile;
84 bool load(memory_order = memory_order_seq_cst) const;
85 operator bool() const volatile;
86 operator bool() const;
87 bool exchange(bool, memory_order = memory_order_seq_cst) volatile;
88 bool exchange(bool, memory_order = memory_order_seq_cst);
89 bool compare_exchange_weak(bool&, bool, memory_order,
90 memory_order) volatile;
91 bool compare_exchange_weak(bool&, bool, memory_order, memory_order);
92 bool compare_exchange_strong(bool&, bool, memory_order,
93 memory_order) volatile;
94 bool compare_exchange_strong(bool&, bool, memory_order, memory_order);
95 bool compare_exchange_weak(bool&, bool,
96 memory_order = memory_order_seq_cst) volatile;
97 bool compare_exchange_weak(bool&, bool,
98 memory_order = memory_order_seq_cst);
99 bool compare_exchange_strong(bool&, bool,
100 memory_order = memory_order_seq_cst) volatile;
101 bool compare_exchange_strong(bool&, bool,
102 memory_order = memory_order_seq_cst);
103 atomic_bool() = default;
104 constexpr atomic_bool(bool);
105 atomic_bool(const atomic_bool&) = delete;
106 atomic_bool& operator=(const atomic_bool&) = delete;
107 atomic_bool& operator=(const atomic_bool&) volatile = delete;
108 bool operator=(bool) volatile;
109} atomic_bool;
110
111bool atomic_is_lock_free(const volatile atomic_bool*);
112bool atomic_is_lock_free(const atomic_bool*);
113void atomic_init(volatile atomic_bool*, bool);
114void atomic_init(atomic_bool*, bool);
115void atomic_store(volatile atomic_bool*, bool);
116void atomic_store(atomic_bool*, bool);
117void atomic_store_explicit(volatile atomic_bool*, bool, memory_order);
118void atomic_store_explicit(atomic_bool*, bool, memory_order);
119bool atomic_load(const volatile atomic_bool*);
120bool atomic_load(const atomic_bool*);
121bool atomic_load_explicit(const volatile atomic_bool*, memory_order);
122bool atomic_load_explicit(const atomic_bool*, memory_order);
123bool atomic_exchange(volatile atomic_bool*, bool);
124bool atomic_exchange(atomic_bool*, bool);
125bool atomic_exchange_explicit(volatile atomic_bool*, bool, memory_order);
126bool atomic_exchange_explicit(atomic_bool*, bool, memory_order);
127bool atomic_compare_exchange_weak(volatile atomic_bool*, bool*, bool);
128bool atomic_compare_exchange_weak(atomic_bool*, bool*, bool);
129bool atomic_compare_exchange_strong(volatile atomic_bool*, bool*, bool);
130bool atomic_compare_exchange_strong(atomic_bool*, bool*, bool);
131bool atomic_compare_exchange_weak_explicit(volatile atomic_bool*, bool*, bool,
132 memory_order, memory_order);
133bool atomic_compare_exchange_weak_explicit(atomic_bool*, bool*, bool,
134 memory_order, memory_order);
135bool atomic_compare_exchange_strong_explicit(volatile atomic_bool*, bool*, bool,
136 memory_order, memory_order);
137bool atomic_compare_exchange_strong_explicit(atomic_bool*, bool*, bool,
138 memory_order, memory_order);
139
140// atomic_char
141
142typedef struct atomic_char
143{
144 bool is_lock_free() const volatile;
145 bool is_lock_free() const;
146 void store(char, memory_order = memory_order_seq_cst) volatile;
147 void store(char, memory_order = memory_order_seq_cst);
148 char load(memory_order = memory_order_seq_cst) const volatile;
149 char load(memory_order = memory_order_seq_cst) const;
150 operator char() const volatile;
151 operator char() const;
152 char exchange(char,
153 memory_order = memory_order_seq_cst) volatile;
154 char exchange(char, memory_order = memory_order_seq_cst);
155 bool compare_exchange_weak(char&, char, memory_order,
156 memory_order) volatile;
157 bool compare_exchange_weak(char&, char, memory_order, memory_order);
158 bool compare_exchange_strong(char&, char, memory_order,
159 memory_order) volatile;
160 bool compare_exchange_strong(char&, char, memory_order, memory_order);
161 bool compare_exchange_weak(char&, char,
162 memory_order = memory_order_seq_cst) volatile;
163 bool compare_exchange_weak(char&, char,
164 memory_order = memory_order_seq_cst);
165 bool compare_exchange_strong(char&, char,
166 memory_order = memory_order_seq_cst) volatile;
167 bool compare_exchange_strong(char&, char,
168 memory_order = memory_order_seq_cst);
169 char fetch_add(char, memory_order = memory_order_seq_cst) volatile;
170 char fetch_add(char, memory_order = memory_order_seq_cst);
171 char fetch_sub(char, memory_order = memory_order_seq_cst) volatile;
172 char fetch_sub(char, memory_order = memory_order_seq_cst);
173 char fetch_and(char, memory_order = memory_order_seq_cst) volatile;
174 char fetch_and(char, memory_order = memory_order_seq_cst);
175 char fetch_or(char, memory_order = memory_order_seq_cst) volatile;
176 char fetch_or(char, memory_order = memory_order_seq_cst);
177 char fetch_xor(char, memory_order = memory_order_seq_cst) volatile;
178 char fetch_xor(char, memory_order = memory_order_seq_cst);
179 atomic_char() = default;
180 constexpr atomic_char(char);
181 atomic_char(const atomic_char&) = delete;
182 atomic_char& operator=(const atomic_char&) = delete;
183 atomic_char& operator=(const atomic_char&) volatile = delete;
184 char operator=(char) volatile;
185 char operator=(char);
186 char operator++(int) volatile;
187 char operator++(int);
188 char operator--(int) volatile;
189 char operator--(int);
190 char operator++() volatile;
191 char operator++();
192 char operator--() volatile;
193 char operator--();
194 char operator+=(char) volatile;
195 char operator+=(char);
196 char operator-=(char) volatile;
197 char operator-=(char);
198 char operator&=(char) volatile;
199 char operator&=(char);
200 char operator|=(char) volatile;
201 char operator|=(char);
202 char operator^=(char) volatile;
203 char operator^=(char);
204} atomic_char;
205
206bool atomic_is_lock_free(const volatile atomic_char*);
207bool atomic_is_lock_free(const atomic_char*);
208void atomic_init(volatile atomic_char*, itype);
209void atomic_init(atomic_char*, itype);
210void atomic_store(volatile atomic_char*, char);
211void atomic_store(atomic_char*, char);
212void atomic_store_explicit(volatile atomic_char*, char, memory_order);
213void atomic_store_explicit(atomic_char*, char, memory_order);
214char atomic_load(const volatile atomic_char*);
215char atomic_load(const atomic_char*);
216char atomic_load_explicit(const volatile atomic_char*, memory_order);
217char atomic_load_explicit(const atomic_char*, memory_order);
218char atomic_exchange(volatile atomic_char*, char);
219char atomic_exchange(atomic_char*, char);
220char atomic_exchange_explicit(volatile atomic_char*, char, memory_order);
221char atomic_exchange_explicit(atomic_char*, char, memory_order);
222bool atomic_compare_exchange_weak(volatile atomic_char*, char*, char);
223bool atomic_compare_exchange_weak(atomic_char*, char*, char);
224bool atomic_compare_exchange_strong(volatile atomic_char*, char*, char);
225bool atomic_compare_exchange_strong(atomic_char*, char*, char);
226bool atomic_compare_exchange_weak_explicit(volatile atomic_char*, char*, char,
227 memory_order, memory_order);
228bool atomic_compare_exchange_weak_explicit(atomic_char*, char*, char,
229 memory_order, memory_order);
230bool atomic_compare_exchange_strong_explicit(volatile atomic_char*, char*, char,
231 memory_order, memory_order);
232bool atomic_compare_exchange_strong_explicit(atomic_char*, char*, char,
233 memory_order, memory_order);
234char atomic_fetch_add(volatile atomic_char*, char);
235char atomic_fetch_add(atomic_char*, char);
236char atomic_fetch_add_explicit(volatile atomic_char*, char, memory_order);
237char atomic_fetch_add_explicit(atomic_char*, char, memory_order);
238char atomic_fetch_sub(volatile atomic_char*, char);
239char atomic_fetch_sub(atomic_char*, char);
240char atomic_fetch_sub_explicit(volatile atomic_char*, char, memory_order);
241char atomic_fetch_sub_explicit(atomic_char*, char, memory_order);
242char atomic_fetch_and(volatile atomic_char*, char);
243char atomic_fetch_and(atomic_char*, char);
244char atomic_fetch_and_explicit(volatile atomic_char*, char, memory_order);
245char atomic_fetch_and_explicit(atomic_char*, char, memory_order);
246char atomic_fetch_or(volatile atomic_char*, char);
247char atomic_fetch_or(atomic_char*, char);
248char atomic_fetch_or_explicit(volatile atomic_char*, char, memory_order);
249char atomic_fetch_or_explicit(atomic_char*, char, memory_order);
250char atomic_fetch_xor(volatile atomic_char*, char);
251char atomic_fetch_xor(atomic_char*, char);
252char atomic_fetch_xor_explicit(volatile atomic_char*, char, memory_order);
253char atomic_fetch_xor_explicit(atomic_char*, char, memory_order);
254
255// atomic_schar
256
257typedef struct atomic_schar
258{
259 bool is_lock_free() const volatile;
260 bool is_lock_free() const;
261 void store(signed char, memory_order = memory_order_seq_cst) volatile;
262 void store(signed char, memory_order = memory_order_seq_cst);
263 signed char load(memory_order = memory_order_seq_cst) const volatile;
264 signed char load(memory_order = memory_order_seq_cst) const;
265 operator signed char() const volatile;
266 operator signed char() const;
267 signed char exchange(signed char,
268 memory_order = memory_order_seq_cst) volatile;
269 signed char exchange(signed char, memory_order = memory_order_seq_cst);
270 bool compare_exchange_weak(signed char&, signed char, memory_order,
271 memory_order) volatile;
272 bool compare_exchange_weak(signed char&, signed char, memory_order,
273 memory_order);
274 bool compare_exchange_strong(signed char&, signed char, memory_order,
275 memory_order) volatile;
276 bool compare_exchange_strong(signed char&, signed char, memory_order,
277 memory_order);
278 bool compare_exchange_weak(signed char&, signed char,
279 memory_order = memory_order_seq_cst) volatile;
280 bool compare_exchange_weak(signed char&, signed char,
281 memory_order = memory_order_seq_cst);
282 bool compare_exchange_strong(signed char&, signed char,
283 memory_order = memory_order_seq_cst) volatile;
284 bool compare_exchange_strong(signed char&, signed char,
285 memory_order = memory_order_seq_cst);
286 signed char fetch_add(signed char,
287 memory_order = memory_order_seq_cst) volatile;
288 signed char fetch_add(signed char, memory_order = memory_order_seq_cst);
289 signed char fetch_sub(signed char,
290 memory_order = memory_order_seq_cst) volatile;
291 signed char fetch_sub(signed char, memory_order = memory_order_seq_cst);
292 signed char fetch_and(signed char,
293 memory_order = memory_order_seq_cst) volatile;
294 signed char fetch_and(signed char, memory_order = memory_order_seq_cst);
295 signed char fetch_or(signed char,
296 memory_order = memory_order_seq_cst) volatile;
297 signed char fetch_or(signed char, memory_order = memory_order_seq_cst);
298 signed char fetch_xor(signed char,
299 memory_order = memory_order_seq_cst) volatile;
300 signed char fetch_xor(signed char, memory_order = memory_order_seq_cst);
301 atomic_schar() = default;
302 constexpr atomic_schar(signed char);
303 atomic_schar(const atomic_schar&) = delete;
304 atomic_schar& operator=(const atomic_schar&) = delete;
305 atomic_schar& operator=(const atomic_schar&) volatile = delete;
306 signed char operator=(signed char) volatile;
307 signed char operator=(signed char);
308 signed char operator++(int) volatile;
309 signed char operator++(int);
310 signed char operator--(int) volatile;
311 signed char operator--(int);
312 signed char operator++() volatile;
313 signed char operator++();
314 signed char operator--() volatile;
315 signed char operator--();
316 signed char operator+=(signed char) volatile;
317 signed char operator+=(signed char);
318 signed char operator-=(signed char) volatile;
319 signed char operator-=(signed char);
320 signed char operator&=(signed char) volatile;
321 signed char operator&=(signed char);
322 signed char operator|=(signed char) volatile;
323 signed char operator|=(signed char);
324 signed char operator^=(signed char) volatile;
325 signed char operator^=(signed char);
326} atomic_schar;
327
328bool atomic_is_lock_free(const volatile atomic_schar*);
329bool atomic_is_lock_free(const atomic_schar*);
330void atomic_init(volatile atomic_schar*, itype);
331void atomic_init(atomic_schar*, itype);
332void atomic_store(volatile atomic_schar*, signed char);
333void atomic_store(atomic_schar*, signed char);
334void atomic_store_explicit(volatile atomic_schar*, signed char, memory_order);
335void atomic_store_explicit(atomic_schar*, signed char, memory_order);
336signed char atomic_load(const volatile atomic_schar*);
337signed char atomic_load(const atomic_schar*);
338signed char atomic_load_explicit(const volatile atomic_schar*, memory_order);
339signed char atomic_load_explicit(const atomic_schar*, memory_order);
340signed char atomic_exchange(volatile atomic_schar*, signed char);
341signed char atomic_exchange(atomic_schar*, signed char);
342signed char atomic_exchange_explicit(volatile atomic_schar*, signed char,
343 memory_order);
344signed char atomic_exchange_explicit(atomic_schar*, signed char, memory_order);
345bool atomic_compare_exchange_weak(volatile atomic_schar*, signed char*,
346 signed char);
347bool atomic_compare_exchange_weak(atomic_schar*, signed char*, signed char);
348bool atomic_compare_exchange_strong(volatile atomic_schar*, signed char*,
349 signed char);
350bool atomic_compare_exchange_strong(atomic_schar*, signed char*, signed char);
351bool atomic_compare_exchange_weak_explicit(volatile atomic_schar*, signed char*,
352 signed char, memory_order,
353 memory_order);
354bool atomic_compare_exchange_weak_explicit(atomic_schar*, signed char*,
355 signed char, memory_order,
356 memory_order);
357bool atomic_compare_exchange_strong_explicit(volatile atomic_schar*,
358 signed char*, signed char,
359 memory_order, memory_order);
360bool atomic_compare_exchange_strong_explicit(atomic_schar*, signed char*,
361 signed char, memory_order, memory_order);
362signed char atomic_fetch_add(volatile atomic_schar*, signed char);
363signed char atomic_fetch_add(atomic_schar*, signed char);
364signed char atomic_fetch_add_explicit(volatile atomic_schar*, signed char,
365 memory_order);
366signed char atomic_fetch_add_explicit(atomic_schar*, signed char, memory_order);
367signed char atomic_fetch_sub(volatile atomic_schar*, signed char);
368signed char atomic_fetch_sub(atomic_schar*, signed char);
369signed char atomic_fetch_sub_explicit(volatile atomic_schar*, signed char,
370 memory_order);
371signed char atomic_fetch_sub_explicit(atomic_schar*, signed char, memory_order);
372signed char atomic_fetch_and(volatile atomic_schar*, signed char);
373signed char atomic_fetch_and(atomic_schar*, signed char);
374signed char atomic_fetch_and_explicit(volatile atomic_schar*, signed char,
375 memory_order);
376signed char atomic_fetch_and_explicit(atomic_schar*, signed char, memory_order);
377signed char atomic_fetch_or(volatile atomic_schar*, signed char);
378signed char atomic_fetch_or(atomic_schar*, signed char);
379signed char atomic_fetch_or_explicit(volatile atomic_schar*, signed char,
380 memory_order);
381signed char atomic_fetch_or_explicit(atomic_schar*, signed char, memory_order);
382signed char atomic_fetch_xor(volatile atomic_schar*, signed char);
383signed char atomic_fetch_xor(atomic_schar*, signed char);
384signed char atomic_fetch_xor_explicit(volatile atomic_schar*, signed char,
385 memory_order);
386signed char atomic_fetch_xor_explicit(atomic_schar*, signed char, memory_order);
387
388// atomic_uchar
389
390typedef struct atomic_uchar
391{
392 bool is_lock_free() const volatile;
393 bool is_lock_free() const;
394 void store(unsigned char, memory_order = memory_order_seq_cst) volatile;
395 void store(unsigned char, memory_order = memory_order_seq_cst);
396 unsigned char load(memory_order = memory_order_seq_cst) const volatile;
397 unsigned char load(memory_order = memory_order_seq_cst) const;
398 operator unsigned char() const volatile;
399 operator unsigned char() const;
400 unsigned char exchange(unsigned char,
401 memory_order = memory_order_seq_cst) volatile;
402 unsigned char exchange(unsigned char, memory_order = memory_order_seq_cst);
403 bool compare_exchange_weak(unsigned char&, unsigned char, memory_order,
404 memory_order) volatile;
405 bool compare_exchange_weak(unsigned char&, unsigned char, memory_order,
406 memory_order);
407 bool compare_exchange_strong(unsigned char&, unsigned char, memory_order,
408 memory_order) volatile;
409 bool compare_exchange_strong(unsigned char&, unsigned char, memory_order,
410 memory_order);
411 bool compare_exchange_weak(unsigned char&, unsigned char,
412 memory_order = memory_order_seq_cst) volatile;
413 bool compare_exchange_weak(unsigned char&, unsigned char,
414 memory_order = memory_order_seq_cst);
415 bool compare_exchange_strong(unsigned char&, unsigned char,
416 memory_order = memory_order_seq_cst) volatile;
417 bool compare_exchange_strong(unsigned char&, unsigned char,
418 memory_order = memory_order_seq_cst);
419 unsigned char fetch_add(unsigned char,
420 memory_order = memory_order_seq_cst) volatile;
421 unsigned char fetch_add(unsigned char, memory_order = memory_order_seq_cst);
422 unsigned char fetch_sub(unsigned char,
423 memory_order = memory_order_seq_cst) volatile;
424 unsigned char fetch_sub(unsigned char, memory_order = memory_order_seq_cst);
425 unsigned char fetch_and(unsigned char,
426 memory_order = memory_order_seq_cst) volatile;
427 unsigned char fetch_and(unsigned char, memory_order = memory_order_seq_cst);
428 unsigned char fetch_or(unsigned char,
429 memory_order = memory_order_seq_cst) volatile;
430 unsigned char fetch_or(unsigned char, memory_order = memory_order_seq_cst);
431 unsigned char fetch_xor(unsigned char,
432 memory_order = memory_order_seq_cst) volatile;
433 unsigned char fetch_xor(unsigned char, memory_order = memory_order_seq_cst);
434 atomic_uchar() = default;
435 constexpr atomic_uchar(unsigned char);
436 atomic_uchar(const atomic_uchar&) = delete;
437 atomic_uchar& operator=(const atomic_uchar&) = delete;
438 atomic_uchar& operator=(const atomic_uchar&) volatile = delete;
439 unsigned char operator=(unsigned char) volatile;
440 unsigned char operator=(unsigned char);
441 unsigned char operator++(int) volatile;
442 unsigned char operator++(int);
443 unsigned char operator--(int) volatile;
444 unsigned char operator--(int);
445 unsigned char operator++() volatile;
446 unsigned char operator++();
447 unsigned char operator--() volatile;
448 unsigned char operator--();
449 unsigned char operator+=(unsigned char) volatile;
450 unsigned char operator+=(unsigned char);
451 unsigned char operator-=(unsigned char) volatile;
452 unsigned char operator-=(unsigned char);
453 unsigned char operator&=(unsigned char) volatile;
454 unsigned char operator&=(unsigned char);
455 unsigned char operator|=(unsigned char) volatile;
456 unsigned char operator|=(unsigned char);
457 unsigned char operator^=(unsigned char) volatile;
458 unsigned char operator^=(unsigned char);
459} atomic_uchar;
460
461bool atomic_is_lock_free(const volatile atomic_uchar*);
462bool atomic_is_lock_free(const atomic_uchar*);
463void atomic_init(volatile atomic_uchar*, itype);
464void atomic_init(atomic_uchar*, itype);
465void atomic_store(volatile atomic_uchar*, unsigned char);
466void atomic_store(atomic_uchar*, unsigned char);
467void atomic_store_explicit(volatile atomic_uchar*, unsigned char, memory_order);
468void atomic_store_explicit(atomic_uchar*, unsigned char, memory_order);
469unsigned char atomic_load(const volatile atomic_uchar*);
470unsigned char atomic_load(const atomic_uchar*);
471unsigned char atomic_load_explicit(const volatile atomic_uchar*, memory_order);
472unsigned char atomic_load_explicit(const atomic_uchar*, memory_order);
473unsigned char atomic_exchange(volatile atomic_uchar*, unsigned char);
474unsigned char atomic_exchange(atomic_uchar*, unsigned char);
475unsigned char atomic_exchange_explicit(volatile atomic_uchar*, unsigned char,
476 memory_order);
477unsigned char atomic_exchange_explicit(atomic_uchar*, unsigned char,
478 memory_order);
479bool atomic_compare_exchange_weak(volatile atomic_uchar*, unsigned char*,
480 unsigned char);
481bool atomic_compare_exchange_weak(atomic_uchar*, unsigned char*, unsigned char);
482bool atomic_compare_exchange_strong(volatile atomic_uchar*, unsigned char*,
483 unsigned char);
484bool atomic_compare_exchange_strong(atomic_uchar*, unsigned char*,
485 unsigned char);
486bool atomic_compare_exchange_weak_explicit(volatile atomic_uchar*,
487 unsigned char*, unsigned char,
488 memory_order, memory_order);
489bool atomic_compare_exchange_weak_explicit(atomic_uchar*, unsigned char*,
490 unsigned char, memory_order,
491 memory_order);
492bool atomic_compare_exchange_strong_explicit(volatile atomic_uchar*,
493 unsigned char*, unsigned char,
494 memory_order, memory_order);
495bool atomic_compare_exchange_strong_explicit(atomic_uchar*, unsigned char*,
496 unsigned char, memory_order,
497 memory_order);
498unsigned char atomic_fetch_add(volatile atomic_uchar*, unsigned char);
499unsigned char atomic_fetch_add(atomic_uchar*, unsigned char);
500unsigned char atomic_fetch_add_explicit(volatile atomic_uchar*, unsigned char,
501 memory_order);
502unsigned char atomic_fetch_add_explicit(atomic_uchar*, unsigned char,
503 memory_order);
504unsigned char atomic_fetch_sub(volatile atomic_uchar*, unsigned char);
505unsigned char atomic_fetch_sub(atomic_uchar*, unsigned char);
506unsigned char atomic_fetch_sub_explicit(volatile atomic_uchar*, unsigned char,
507 memory_order);
508unsigned char atomic_fetch_sub_explicit(atomic_uchar*, unsigned char,
509 memory_order);
510unsigned char atomic_fetch_and(volatile atomic_uchar*, unsigned char);
511unsigned char atomic_fetch_and(atomic_uchar*, unsigned char);
512unsigned char atomic_fetch_and_explicit(volatile atomic_uchar*, unsigned char,
513 memory_order);
514unsigned char atomic_fetch_and_explicit(atomic_uchar*, unsigned char,
515 memory_order);
516unsigned char atomic_fetch_or(volatile atomic_uchar*, unsigned char);
517unsigned char atomic_fetch_or(atomic_uchar*, unsigned char);
518unsigned char atomic_fetch_or_explicit(volatile atomic_uchar*, unsigned char,
519 memory_order);
520unsigned char atomic_fetch_or_explicit(atomic_uchar*, unsigned char,
521 memory_order);
522unsigned char atomic_fetch_xor(volatile atomic_uchar*, unsigned char);
523unsigned char atomic_fetch_xor(atomic_uchar*, unsigned char);
524unsigned char atomic_fetch_xor_explicit(volatile atomic_uchar*, unsigned char,
525 memory_order);
526unsigned char atomic_fetch_xor_explicit(atomic_uchar*, unsigned char,
527 memory_order);
528
529// atomic_short
530
531typedef struct atomic_short
532{
533 bool is_lock_free() const volatile;
534 bool is_lock_free() const;
535 void store(short, memory_order = memory_order_seq_cst) volatile;
536 void store(short, memory_order = memory_order_seq_cst);
537 short load(memory_order = memory_order_seq_cst) const volatile;
538 short load(memory_order = memory_order_seq_cst) const;
539 operator short() const volatile;
540 operator short() const;
541 short exchange(short,
542 memory_order = memory_order_seq_cst) volatile;
543 short exchange(short, memory_order = memory_order_seq_cst);
544 bool compare_exchange_weak(short&, short, memory_order,
545 memory_order) volatile;
546 bool compare_exchange_weak(short&, short, memory_order, memory_order);
547 bool compare_exchange_strong(short&, short, memory_order,
548 memory_order) volatile;
549 bool compare_exchange_strong(short&, short, memory_order, memory_order);
550 bool compare_exchange_weak(short&, short,
551 memory_order = memory_order_seq_cst) volatile;
552 bool compare_exchange_weak(short&, short,
553 memory_order = memory_order_seq_cst);
554 bool compare_exchange_strong(short&, short,
555 memory_order = memory_order_seq_cst) volatile;
556 bool compare_exchange_strong(short&, short,
557 memory_order = memory_order_seq_cst);
558 short fetch_add(short, memory_order = memory_order_seq_cst) volatile;
559 short fetch_add(short, memory_order = memory_order_seq_cst);
560 short fetch_sub(short, memory_order = memory_order_seq_cst) volatile;
561 short fetch_sub(short, memory_order = memory_order_seq_cst);
562 short fetch_and(short, memory_order = memory_order_seq_cst) volatile;
563 short fetch_and(short, memory_order = memory_order_seq_cst);
564 short fetch_or(short, memory_order = memory_order_seq_cst) volatile;
565 short fetch_or(short, memory_order = memory_order_seq_cst);
566 short fetch_xor(short, memory_order = memory_order_seq_cst) volatile;
567 short fetch_xor(short, memory_order = memory_order_seq_cst);
568 atomic_short() = default;
569 constexpr atomic_short(short);
570 atomic_short(const atomic_short&) = delete;
571 atomic_short& operator=(const atomic_short&) = delete;
572 atomic_short& operator=(const atomic_short&) volatile = delete;
573 short operator=(short) volatile;
574 short operator=(short);
575 short operator++(int) volatile;
576 short operator++(int);
577 short operator--(int) volatile;
578 short operator--(int);
579 short operator++() volatile;
580 short operator++();
581 short operator--() volatile;
582 short operator--();
583 short operator+=(short) volatile;
584 short operator+=(short);
585 short operator-=(short) volatile;
586 short operator-=(short);
587 short operator&=(short) volatile;
588 short operator&=(short);
589 short operator|=(short) volatile;
590 short operator|=(short);
591 short operator^=(short) volatile;
592 short operator^=(short);
593} atomic_short;
594
595bool atomic_is_lock_free(const volatile atomic_short*);
596bool atomic_is_lock_free(const atomic_short*);
597void atomic_init(volatile atomic_short*, itype);
598void atomic_init(atomic_short*, itype);
599void atomic_store(volatile atomic_short*, short);
600void atomic_store(atomic_short*, short);
601void atomic_store_explicit(volatile atomic_short*, short, memory_order);
602void atomic_store_explicit(atomic_short*, short, memory_order);
603short atomic_load(const volatile atomic_short*);
604short atomic_load(const atomic_short*);
605short atomic_load_explicit(const volatile atomic_short*, memory_order);
606short atomic_load_explicit(const atomic_short*, memory_order);
607short atomic_exchange(volatile atomic_short*, short);
608short atomic_exchange(atomic_short*, short);
609short atomic_exchange_explicit(volatile atomic_short*, short, memory_order);
610short atomic_exchange_explicit(atomic_short*, short, memory_order);
611bool atomic_compare_exchange_weak(volatile atomic_short*, short*, short);
612bool atomic_compare_exchange_weak(atomic_short*, short*, short);
613bool atomic_compare_exchange_strong(volatile atomic_short*, short*, short);
614bool atomic_compare_exchange_strong(atomic_short*, short*, short);
615bool atomic_compare_exchange_weak_explicit(volatile atomic_short*, short*,
616 short, memory_order, memory_order);
617bool atomic_compare_exchange_weak_explicit(atomic_short*, short*, short,
618 memory_order, memory_order);
619bool atomic_compare_exchange_strong_explicit(volatile atomic_short*, short*,
620 short, memory_order, memory_order);
621bool atomic_compare_exchange_strong_explicit(atomic_short*, short*, short,
622 memory_order, memory_order);
623short atomic_fetch_add(volatile atomic_short*, short);
624short atomic_fetch_add(atomic_short*, short);
625short atomic_fetch_add_explicit(volatile atomic_short*, short, memory_order);
626short atomic_fetch_add_explicit(atomic_short*, short, memory_order);
627short atomic_fetch_sub(volatile atomic_short*, short);
628short atomic_fetch_sub(atomic_short*, short);
629short atomic_fetch_sub_explicit(volatile atomic_short*, short, memory_order);
630short atomic_fetch_sub_explicit(atomic_short*, short, memory_order);
631short atomic_fetch_and(volatile atomic_short*, short);
632short atomic_fetch_and(atomic_short*, short);
633short atomic_fetch_and_explicit(volatile atomic_short*, short, memory_order);
634short atomic_fetch_and_explicit(atomic_short*, short, memory_order);
635short atomic_fetch_or(volatile atomic_short*, short);
636short atomic_fetch_or(atomic_short*, short);
637short atomic_fetch_or_explicit(volatile atomic_short*, short, memory_order);
638short atomic_fetch_or_explicit(atomic_short*, short, memory_order);
639short atomic_fetch_xor(volatile atomic_short*, short);
640short atomic_fetch_xor(atomic_short*, short);
641short atomic_fetch_xor_explicit(volatile atomic_short*, short, memory_order);
642short atomic_fetch_xor_explicit(atomic_short*, short, memory_order);
643
644// atomic_ushort
645
646typedef struct atomic_ushort
647{
648 bool is_lock_free() const volatile;
649 bool is_lock_free() const;
650 void store(unsigned short, memory_order = memory_order_seq_cst) volatile;
651 void store(unsigned short, memory_order = memory_order_seq_cst);
652 unsigned short load(memory_order = memory_order_seq_cst) const volatile;
653 unsigned short load(memory_order = memory_order_seq_cst) const;
654 operator unsigned short() const volatile;
655 operator unsigned short() const;
656 unsigned short exchange(unsigned short,
657 memory_order = memory_order_seq_cst) volatile;
658 unsigned short exchange(unsigned short,
659 memory_order = memory_order_seq_cst);
660 bool compare_exchange_weak(unsigned short&, unsigned short, memory_order,
661 memory_order) volatile;
662 bool compare_exchange_weak(unsigned short&, unsigned short, memory_order,
663 memory_order);
664 bool compare_exchange_strong(unsigned short&, unsigned short, memory_order,
665 memory_order) volatile;
666 bool compare_exchange_strong(unsigned short&, unsigned short, memory_order,
667 memory_order);
668 bool compare_exchange_weak(unsigned short&, unsigned short,
669 memory_order = memory_order_seq_cst) volatile;
670 bool compare_exchange_weak(unsigned short&, unsigned short,
671 memory_order = memory_order_seq_cst);
672 bool compare_exchange_strong(unsigned short&, unsigned short,
673 memory_order = memory_order_seq_cst) volatile;
674 bool compare_exchange_strong(unsigned short&, unsigned short,
675 memory_order = memory_order_seq_cst);
676 unsigned short fetch_add(unsigned short,
677 memory_order = memory_order_seq_cst) volatile;
678 unsigned short fetch_add(unsigned short,
679 memory_order = memory_order_seq_cst);
680 unsigned short fetch_sub(unsigned short,
681 memory_order = memory_order_seq_cst) volatile;
682 unsigned short fetch_sub(unsigned short,
683 memory_order = memory_order_seq_cst);
684 unsigned short fetch_and(unsigned short,
685 memory_order = memory_order_seq_cst) volatile;
686 unsigned short fetch_and(unsigned short,
687 memory_order = memory_order_seq_cst);
688 unsigned short fetch_or(unsigned short,
689 memory_order = memory_order_seq_cst) volatile;
690 unsigned short fetch_or(unsigned short,
691 memory_order = memory_order_seq_cst);
692 unsigned short fetch_xor(unsigned short,
693 memory_order = memory_order_seq_cst) volatile;
694 unsigned short fetch_xor(unsigned short,
695 memory_order = memory_order_seq_cst);
696 atomic_ushort() = default;
697 constexpr atomic_ushort(unsigned short);
698 atomic_ushort(const atomic_ushort&) = delete;
699 atomic_ushort& operator=(const atomic_ushort&) = delete;
700 atomic_ushort& operator=(const atomic_ushort&) volatile = delete;
701 unsigned short operator=(unsigned short) volatile;
702 unsigned short operator=(unsigned short);
703 unsigned short operator++(int) volatile;
704 unsigned short operator++(int);
705 unsigned short operator--(int) volatile;
706 unsigned short operator--(int);
707 unsigned short operator++() volatile;
708 unsigned short operator++();
709 unsigned short operator--() volatile;
710 unsigned short operator--();
711 unsigned short operator+=(unsigned short) volatile;
712 unsigned short operator+=(unsigned short);
713 unsigned short operator-=(unsigned short) volatile;
714 unsigned short operator-=(unsigned short);
715 unsigned short operator&=(unsigned short) volatile;
716 unsigned short operator&=(unsigned short);
717 unsigned short operator|=(unsigned short) volatile;
718 unsigned short operator|=(unsigned short);
719 unsigned short operator^=(unsigned short) volatile;
720 unsigned short operator^=(unsigned short);
721} atomic_ushort;
722
723bool atomic_is_lock_free(const volatile atomic_ushort*);
724bool atomic_is_lock_free(const atomic_ushort*);
725void atomic_init(volatile atomic_ushort*, itype);
726void atomic_init(atomic_ushort*, itype);
727void atomic_store(volatile atomic_ushort*, unsigned short);
728void atomic_store(atomic_ushort*, unsigned short);
729void atomic_store_explicit(volatile atomic_ushort*, unsigned short,
730 memory_order);
731void atomic_store_explicit(atomic_ushort*, unsigned short, memory_order);
732unsigned short atomic_load(const volatile atomic_ushort*);
733unsigned short atomic_load(const atomic_ushort*);
734unsigned short atomic_load_explicit(const volatile atomic_ushort*,
735 memory_order);
736unsigned short atomic_load_explicit(const atomic_ushort*, memory_order);
737unsigned short atomic_exchange(volatile atomic_ushort*, unsigned short);
738unsigned short atomic_exchange(atomic_ushort*, unsigned short);
739unsigned short atomic_exchange_explicit(volatile atomic_ushort*, unsigned short,
740 memory_order);
741unsigned short atomic_exchange_explicit(atomic_ushort*, unsigned short,
742 memory_order);
743bool atomic_compare_exchange_weak(volatile atomic_ushort*, unsigned short*,
744 unsigned short);
745bool atomic_compare_exchange_weak(atomic_ushort*, unsigned short*,
746 unsigned short);
747bool atomic_compare_exchange_strong(volatile atomic_ushort*, unsigned short*,
748 unsigned short);
749bool atomic_compare_exchange_strong(atomic_ushort*, unsigned short*,
750 unsigned short);
751bool atomic_compare_exchange_weak_explicit(volatile atomic_ushort*,
752 unsigned short*, unsigned short,
753 memory_order, memory_order);
754bool atomic_compare_exchange_weak_explicit(atomic_ushort*, unsigned short*,
755 unsigned short, memory_order,
756 memory_order);
757bool atomic_compare_exchange_strong_explicit(volatile atomic_ushort*,
758 unsigned short*, unsigned short,
759 memory_order, memory_order);
760bool atomic_compare_exchange_strong_explicit(atomic_ushort*, unsigned short*,
761 unsigned short, memory_order,
762 memory_order);
763unsigned short atomic_fetch_add(volatile atomic_ushort*, unsigned short);
764unsigned short atomic_fetch_add(atomic_ushort*, unsigned short);
765unsigned short atomic_fetch_add_explicit(volatile atomic_ushort*,
766 unsigned short, memory_order);
767unsigned short atomic_fetch_add_explicit(atomic_ushort*, unsigned short,
768 memory_order);
769unsigned short atomic_fetch_sub(volatile atomic_ushort*, unsigned short);
770unsigned short atomic_fetch_sub(atomic_ushort*, unsigned short);
771unsigned short atomic_fetch_sub_explicit(volatile atomic_ushort*,
772 unsigned short, memory_order);
773unsigned short atomic_fetch_sub_explicit(atomic_ushort*, unsigned short,
774 memory_order);
775unsigned short atomic_fetch_and(volatile atomic_ushort*, unsigned short);
776unsigned short atomic_fetch_and(atomic_ushort*, unsigned short);
777unsigned short atomic_fetch_and_explicit(volatile atomic_ushort*,
778 unsigned short, memory_order);
779unsigned short atomic_fetch_and_explicit(atomic_ushort*, unsigned short,
780 memory_order);
781unsigned short atomic_fetch_or(volatile atomic_ushort*, unsigned short);
782unsigned short atomic_fetch_or(atomic_ushort*, unsigned short);
783unsigned short atomic_fetch_or_explicit(volatile atomic_ushort*, unsigned short,
784 memory_order);
785unsigned short atomic_fetch_or_explicit(atomic_ushort*, unsigned short,
786 memory_order);
787unsigned short atomic_fetch_xor(volatile atomic_ushort*, unsigned short);
788unsigned short atomic_fetch_xor(atomic_ushort*, unsigned short);
789unsigned short atomic_fetch_xor_explicit(volatile atomic_ushort*,
790 unsigned short, memory_order);
791unsigned short atomic_fetch_xor_explicit(atomic_ushort*, unsigned short,
792 memory_order);
793
794// atomic_int
795
796typedef struct atomic_int
797{
798 bool is_lock_free() const volatile;
799 bool is_lock_free() const;
800 void store(int, memory_order = memory_order_seq_cst) volatile;
801 void store(int, memory_order = memory_order_seq_cst);
802 int load(memory_order = memory_order_seq_cst) const volatile;
803 int load(memory_order = memory_order_seq_cst) const;
804 operator int() const volatile;
805 operator int() const;
806 int exchange(int,
807 memory_order = memory_order_seq_cst) volatile;
808 int exchange(int, memory_order = memory_order_seq_cst);
809 bool compare_exchange_weak(int&, int, memory_order, memory_order) volatile;
810 bool compare_exchange_weak(int&, int, memory_order, memory_order);
811 bool compare_exchange_strong(int&, int, memory_order,
812 memory_order) volatile;
813 bool compare_exchange_strong(int&, int, memory_order, memory_order);
814 bool compare_exchange_weak(int&, int,
815 memory_order = memory_order_seq_cst) volatile;
816 bool compare_exchange_weak(int&, int, memory_order = memory_order_seq_cst);
817 bool compare_exchange_strong(int&, int,
818 memory_order = memory_order_seq_cst) volatile;
819 bool compare_exchange_strong(int&, int,
820 memory_order = memory_order_seq_cst);
821 int fetch_add(int, memory_order = memory_order_seq_cst) volatile;
822 int fetch_add(int, memory_order = memory_order_seq_cst);
823 int fetch_sub(int, memory_order = memory_order_seq_cst) volatile;
824 int fetch_sub(int, memory_order = memory_order_seq_cst);
825 int fetch_and(int, memory_order = memory_order_seq_cst) volatile;
826 int fetch_and(int, memory_order = memory_order_seq_cst);
827 int fetch_or(int, memory_order = memory_order_seq_cst) volatile;
828 int fetch_or(int, memory_order = memory_order_seq_cst);
829 int fetch_xor(int, memory_order = memory_order_seq_cst) volatile;
830 int fetch_xor(int, memory_order = memory_order_seq_cst);
831 atomic_int() = default;
832 constexpr atomic_int(int);
833 atomic_int(const atomic_int&) = delete;
834 atomic_int& operator=(const atomic_int&) = delete;
835 atomic_int& operator=(const atomic_int&) volatile = delete;
836 int operator=(int) volatile;
837 int operator=(int);
838 int operator++(int) volatile;
839 int operator++(int);
840 int operator--(int) volatile;
841 int operator--(int);
842 int operator++() volatile;
843 int operator++();
844 int operator--() volatile;
845 int operator--();
846 int operator+=(int) volatile;
847 int operator+=(int);
848 int operator-=(int) volatile;
849 int operator-=(int);
850 int operator&=(int) volatile;
851 int operator&=(int);
852 int operator|=(int) volatile;
853 int operator|=(int);
854 int operator^=(int) volatile;
855 int operator^=(int);
856} atomic_int;
857
858bool atomic_is_lock_free(const volatile atomic_int*);
859bool atomic_is_lock_free(const atomic_int*);
860void atomic_init(volatile atomic_int*, itype);
861void atomic_init(atomic_int*, itype);
862void atomic_store(volatile atomic_int*, int);
863void atomic_store(atomic_int*, int);
864void atomic_store_explicit(volatile atomic_int*, int, memory_order);
865void atomic_store_explicit(atomic_int*, int, memory_order);
866int atomic_load(const volatile atomic_int*);
867int atomic_load(const atomic_int*);
868int atomic_load_explicit(const volatile atomic_int*, memory_order);
869int atomic_load_explicit(const atomic_int*, memory_order);
870int atomic_exchange(volatile atomic_int*, int);
871int atomic_exchange(atomic_int*, int);
872int atomic_exchange_explicit(volatile atomic_int*, int, memory_order);
873int atomic_exchange_explicit(atomic_int*, int, memory_order);
874bool atomic_compare_exchange_weak(volatile atomic_int*, int*, int);
875bool atomic_compare_exchange_weak(atomic_int*, int*, int);
876bool atomic_compare_exchange_strong(volatile atomic_int*, int*, int);
877bool atomic_compare_exchange_strong(atomic_int*, int*, int);
878bool atomic_compare_exchange_weak_explicit(volatile atomic_int*, int*, int,
879 memory_order, memory_order);
880bool atomic_compare_exchange_weak_explicit(atomic_int*, int*, int, memory_order,
881 memory_order);
882bool atomic_compare_exchange_strong_explicit(volatile atomic_int*, int*, int,
883 memory_order, memory_order);
884bool atomic_compare_exchange_strong_explicit(atomic_int*, int*, int,
885 memory_order, memory_order);
886int atomic_fetch_add(volatile atomic_int*, int);
887int atomic_fetch_add(atomic_int*, int);
888int atomic_fetch_add_explicit(volatile atomic_int*, int, memory_order);
889int atomic_fetch_add_explicit(atomic_int*, int, memory_order);
890int atomic_fetch_sub(volatile atomic_int*, int);
891int atomic_fetch_sub(atomic_int*, int);
892int atomic_fetch_sub_explicit(volatile atomic_int*, int, memory_order);
893int atomic_fetch_sub_explicit(atomic_int*, int, memory_order);
894int atomic_fetch_and(volatile atomic_int*, int);
895int atomic_fetch_and(atomic_int*, int);
896int atomic_fetch_and_explicit(volatile atomic_int*, int, memory_order);
897int atomic_fetch_and_explicit(atomic_int*, int, memory_order);
898int atomic_fetch_or(volatile atomic_int*, int);
899int atomic_fetch_or(atomic_int*, int);
900int atomic_fetch_or_explicit(volatile atomic_int*, int, memory_order);
901int atomic_fetch_or_explicit(atomic_int*, int, memory_order);
902int atomic_fetch_xor(volatile atomic_int*, int);
903int atomic_fetch_xor(atomic_int*, int);
904int atomic_fetch_xor_explicit(volatile atomic_int*, int, memory_order);
905int atomic_fetch_xor_explicit(atomic_int*, int, memory_order);
906
907// atomic_uint
908
909typedef struct atomic_uint
910{
911 bool is_lock_free() const volatile;
912 bool is_lock_free() const;
913 void store(unsigned int, memory_order = memory_order_seq_cst) volatile;
914 void store(unsigned int, memory_order = memory_order_seq_cst);
915 unsigned int load(memory_order = memory_order_seq_cst) const volatile;
916 unsigned int load(memory_order = memory_order_seq_cst) const;
917 operator unsigned int() const volatile;
918 operator unsigned int() const;
919 unsigned int exchange(unsigned int,
920 memory_order = memory_order_seq_cst) volatile;
921 unsigned int exchange(unsigned int, memory_order = memory_order_seq_cst);
922 bool compare_exchange_weak(unsigned int&, unsigned int, memory_order,
923 memory_order) volatile;
924 bool compare_exchange_weak(unsigned int&, unsigned int, memory_order,
925 memory_order);
926 bool compare_exchange_strong(unsigned int&, unsigned int, memory_order,
927 memory_order) volatile;
928 bool compare_exchange_strong(unsigned int&, unsigned int, memory_order,
929 memory_order);
930 bool compare_exchange_weak(unsigned int&, unsigned int,
931 memory_order = memory_order_seq_cst) volatile;
932 bool compare_exchange_weak(unsigned int&, unsigned int,
933 memory_order = memory_order_seq_cst);
934 bool compare_exchange_strong(unsigned int&, unsigned int,
935 memory_order = memory_order_seq_cst) volatile;
936 bool compare_exchange_strong(unsigned int&, unsigned int,
937 memory_order = memory_order_seq_cst);
938 unsigned int fetch_add(unsigned int,
939 memory_order = memory_order_seq_cst) volatile;
940 unsigned int fetch_add(unsigned int, memory_order = memory_order_seq_cst);
941 unsigned int fetch_sub(unsigned int,
942 memory_order = memory_order_seq_cst) volatile;
943 unsigned int fetch_sub(unsigned int, memory_order = memory_order_seq_cst);
944 unsigned int fetch_and(unsigned int,
945 memory_order = memory_order_seq_cst) volatile;
946 unsigned int fetch_and(unsigned int, memory_order = memory_order_seq_cst);
947 unsigned int fetch_or(unsigned int,
948 memory_order = memory_order_seq_cst) volatile;
949 unsigned int fetch_or(unsigned int, memory_order = memory_order_seq_cst);
950 unsigned int fetch_xor(unsigned int,
951 memory_order = memory_order_seq_cst) volatile;
952 unsigned int fetch_xor(unsigned int, memory_order = memory_order_seq_cst);
953 atomic_uint() = default;
954 constexpr atomic_uint(unsigned int);
955 atomic_uint(const atomic_uint&) = delete;
956 atomic_uint& operator=(const atomic_uint&) = delete;
957 atomic_uint& operator=(const atomic_uint&) volatile = delete;
958 unsigned int operator=(unsigned int) volatile;
959 unsigned int operator=(unsigned int);
960 unsigned int operator++(int) volatile;
961 unsigned int operator++(int);
962 unsigned int operator--(int) volatile;
963 unsigned int operator--(int);
964 unsigned int operator++() volatile;
965 unsigned int operator++();
966 unsigned int operator--() volatile;
967 unsigned int operator--();
968 unsigned int operator+=(unsigned int) volatile;
969 unsigned int operator+=(unsigned int);
970 unsigned int operator-=(unsigned int) volatile;
971 unsigned int operator-=(unsigned int);
972 unsigned int operator&=(unsigned int) volatile;
973 unsigned int operator&=(unsigned int);
974 unsigned int operator|=(unsigned int) volatile;
975 unsigned int operator|=(unsigned int);
976 unsigned int operator^=(unsigned int) volatile;
977 unsigned int operator^=(unsigned int);
978} atomic_uint;
979
980bool atomic_is_lock_free(const volatile atomic_uint*);
981bool atomic_is_lock_free(const atomic_uint*);
982void atomic_init(volatile atomic_uint*, itype);
983void atomic_init(atomic_uint*, itype);
984void atomic_store(volatile atomic_uint*, unsigned int);
985void atomic_store(atomic_uint*, unsigned int);
986void atomic_store_explicit(volatile atomic_uint*, unsigned int, memory_order);
987void atomic_store_explicit(atomic_uint*, unsigned int, memory_order);
988unsigned int atomic_load(const volatile atomic_uint*);
989unsigned int atomic_load(const atomic_uint*);
990unsigned int atomic_load_explicit(const volatile atomic_uint*, memory_order);
991unsigned int atomic_load_explicit(const atomic_uint*, memory_order);
992unsigned int atomic_exchange(volatile atomic_uint*, unsigned int);
993unsigned int atomic_exchange(atomic_uint*, unsigned int);
994unsigned int atomic_exchange_explicit(volatile atomic_uint*, unsigned int,
995 memory_order);
996unsigned int atomic_exchange_explicit(atomic_uint*, unsigned int, memory_order);
997bool atomic_compare_exchange_weak(volatile atomic_uint*, unsigned int*,
998 unsigned int);
999bool atomic_compare_exchange_weak(atomic_uint*, unsigned int*, unsigned int);
1000bool atomic_compare_exchange_strong(volatile atomic_uint*, unsigned int*,
1001 unsigned int);
1002bool atomic_compare_exchange_strong(atomic_uint*, unsigned int*, unsigned int);
1003bool atomic_compare_exchange_weak_explicit(volatile atomic_uint*, unsigned int*,
1004 unsigned int, memory_order,
1005 memory_order);
1006bool atomic_compare_exchange_weak_explicit(atomic_uint*, unsigned int*,
1007 unsigned int, memory_order,
1008 memory_order);
1009bool atomic_compare_exchange_strong_explicit(volatile atomic_uint*,
1010 unsigned int*, unsigned int,
1011 memory_order, memory_order);
1012bool atomic_compare_exchange_strong_explicit(atomic_uint*, unsigned int*,
1013 unsigned int, memory_order,
1014 memory_order);
1015unsigned int atomic_fetch_add(volatile atomic_uint*, unsigned int);
1016unsigned int atomic_fetch_add(atomic_uint*, unsigned int);
1017unsigned int atomic_fetch_add_explicit(volatile atomic_uint*, unsigned int,
1018 memory_order);
1019unsigned int atomic_fetch_add_explicit(atomic_uint*, unsigned int,
1020 memory_order);
1021unsigned int atomic_fetch_sub(volatile atomic_uint*, unsigned int);
1022unsigned int atomic_fetch_sub(atomic_uint*, unsigned int);
1023unsigned int atomic_fetch_sub_explicit(volatile atomic_uint*, unsigned int,
1024 memory_order);
1025unsigned int atomic_fetch_sub_explicit(atomic_uint*, unsigned int,
1026 memory_order);
1027unsigned int atomic_fetch_and(volatile atomic_uint*, unsigned int);
1028unsigned int atomic_fetch_and(atomic_uint*, unsigned int);
1029unsigned int atomic_fetch_and_explicit(volatile atomic_uint*, unsigned int,
1030 memory_order);
1031unsigned int atomic_fetch_and_explicit(atomic_uint*, unsigned int,
1032 memory_order);
1033unsigned int atomic_fetch_or(volatile atomic_uint*, unsigned int);
1034unsigned int atomic_fetch_or(atomic_uint*, unsigned int);
1035unsigned int atomic_fetch_or_explicit(volatile atomic_uint*, unsigned int,
1036 memory_order);
1037unsigned int atomic_fetch_or_explicit(atomic_uint*, unsigned int, memory_order);
1038unsigned int atomic_fetch_xor(volatile atomic_uint*, unsigned int);
1039unsigned int atomic_fetch_xor(atomic_uint*, unsigned int);
1040unsigned int atomic_fetch_xor_explicit(volatile atomic_uint*, unsigned int,
1041 memory_order);
1042unsigned int atomic_fetch_xor_explicit(atomic_uint*, unsigned int,
1043 memory_order);
1044
1045// atomic_long
1046
1047typedef struct atomic_long
1048{
1049 bool is_lock_free() const volatile;
1050 bool is_lock_free() const;
1051 void store(long, memory_order = memory_order_seq_cst) volatile;
1052 void store(long, memory_order = memory_order_seq_cst);
1053 long load(memory_order = memory_order_seq_cst) const volatile;
1054 long load(memory_order = memory_order_seq_cst) const;
1055 operator long() const volatile;
1056 operator long() const;
1057 long exchange(long,
1058 memory_order = memory_order_seq_cst) volatile;
1059 long exchange(long, memory_order = memory_order_seq_cst);
1060 bool compare_exchange_weak(long&, long, memory_order,
1061 memory_order) volatile;
1062 bool compare_exchange_weak(long&, long, memory_order, memory_order);
1063 bool compare_exchange_strong(long&, long, memory_order,
1064 memory_order) volatile;
1065 bool compare_exchange_strong(long&, long, memory_order, memory_order);
1066 bool compare_exchange_weak(long&, long,
1067 memory_order = memory_order_seq_cst) volatile;
1068 bool compare_exchange_weak(long&, long,
1069 memory_order = memory_order_seq_cst);
1070 bool compare_exchange_strong(long&, long,
1071 memory_order = memory_order_seq_cst) volatile;
1072 bool compare_exchange_strong(long&, long,
1073 memory_order = memory_order_seq_cst);
1074 long fetch_add(long, memory_order = memory_order_seq_cst) volatile;
1075 long fetch_add(long, memory_order = memory_order_seq_cst);
1076 long fetch_sub(long, memory_order = memory_order_seq_cst) volatile;
1077 long fetch_sub(long, memory_order = memory_order_seq_cst);
1078 long fetch_and(long, memory_order = memory_order_seq_cst) volatile;
1079 long fetch_and(long, memory_order = memory_order_seq_cst);
1080 long fetch_or(long, memory_order = memory_order_seq_cst) volatile;
1081 long fetch_or(long, memory_order = memory_order_seq_cst);
1082 long fetch_xor(long, memory_order = memory_order_seq_cst) volatile;
1083 long fetch_xor(long, memory_order = memory_order_seq_cst);
1084 atomic_long() = default;
1085 constexpr atomic_long(long);
1086 atomic_long(const atomic_long&) = delete;
1087 atomic_long& operator=(const atomic_long&) = delete;
1088 atomic_long& operator=(const atomic_long&) volatile = delete;
1089 long operator=(long) volatile;
1090 long operator=(long);
1091 long operator++(int) volatile;
1092 long operator++(int);
1093 long operator--(int) volatile;
1094 long operator--(int);
1095 long operator++() volatile;
1096 long operator++();
1097 long operator--() volatile;
1098 long operator--();
1099 long operator+=(long) volatile;
1100 long operator+=(long);
1101 long operator-=(long) volatile;
1102 long operator-=(long);
1103 long operator&=(long) volatile;
1104 long operator&=(long);
1105 long operator|=(long) volatile;
1106 long operator|=(long);
1107 long operator^=(long) volatile;
1108 long operator^=(long);
1109} atomic_long;
1110
1111bool atomic_is_lock_free(const volatile atomic_long*);
1112bool atomic_is_lock_free(const atomic_long*);
1113void atomic_init(volatile atomic_long*, itype);
1114void atomic_init(atomic_long*, itype);
1115void atomic_store(volatile atomic_long*, long);
1116void atomic_store(atomic_long*, long);
1117void atomic_store_explicit(volatile atomic_long*, long, memory_order);
1118void atomic_store_explicit(atomic_long*, long, memory_order);
1119long atomic_load(const volatile atomic_long*);
1120long atomic_load(const atomic_long*);
1121long atomic_load_explicit(const volatile atomic_long*, memory_order);
1122long atomic_load_explicit(const atomic_long*, memory_order);
1123long atomic_exchange(volatile atomic_long*, long);
1124long atomic_exchange(atomic_long*, long);
1125long atomic_exchange_explicit(volatile atomic_long*, long, memory_order);
1126long atomic_exchange_explicit(atomic_long*, long, memory_order);
1127bool atomic_compare_exchange_weak(volatile atomic_long*, long*, long);
1128bool atomic_compare_exchange_weak(atomic_long*, long*, long);
1129bool atomic_compare_exchange_strong(volatile atomic_long*, long*, long);
1130bool atomic_compare_exchange_strong(atomic_long*, long*, long);
1131bool atomic_compare_exchange_weak_explicit(volatile atomic_long*, long*, long,
1132 memory_order, memory_order);
1133bool atomic_compare_exchange_weak_explicit(atomic_long*, long*, long,
1134 memory_order, memory_order);
1135bool atomic_compare_exchange_strong_explicit(volatile atomic_long*, long*, long,
1136 memory_order, memory_order);
1137bool atomic_compare_exchange_strong_explicit(atomic_long*, long*, long,
1138 memory_order, memory_order);
1139long atomic_fetch_add(volatile atomic_long*, long);
1140long atomic_fetch_add(atomic_long*, long);
1141long atomic_fetch_add_explicit(volatile atomic_long*, long, memory_order);
1142long atomic_fetch_add_explicit(atomic_long*, long, memory_order);
1143long atomic_fetch_sub(volatile atomic_long*, long);
1144long atomic_fetch_sub(atomic_long*, long);
1145long atomic_fetch_sub_explicit(volatile atomic_long*, long, memory_order);
1146long atomic_fetch_sub_explicit(atomic_long*, long, memory_order);
1147long atomic_fetch_and(volatile atomic_long*, long);
1148long atomic_fetch_and(atomic_long*, long);
1149long atomic_fetch_and_explicit(volatile atomic_long*, long, memory_order);
1150long atomic_fetch_and_explicit(atomic_long*, long, memory_order);
1151long atomic_fetch_or(volatile atomic_long*, long);
1152long atomic_fetch_or(atomic_long*, long);
1153long atomic_fetch_or_explicit(volatile atomic_long*, long, memory_order);
1154long atomic_fetch_or_explicit(atomic_long*, long, memory_order);
1155long atomic_fetch_xor(volatile atomic_long*, long);
1156long atomic_fetch_xor(atomic_long*, long);
1157long atomic_fetch_xor_explicit(volatile atomic_long*, long, memory_order);
1158long atomic_fetch_xor_explicit(atomic_long*, long, memory_order);
1159
1160// atomic_ulong
1161
1162typedef struct atomic_ulong
1163{
1164 bool is_lock_free() const volatile;
1165 bool is_lock_free() const;
1166 void store(unsigned long, memory_order = memory_order_seq_cst) volatile;
1167 void store(unsigned long, memory_order = memory_order_seq_cst);
1168 unsigned long load(memory_order = memory_order_seq_cst) const volatile;
1169 unsigned long load(memory_order = memory_order_seq_cst) const;
1170 operator unsigned long() const volatile;
1171 operator unsigned long() const;
1172 unsigned long exchange(unsigned long,
1173 memory_order = memory_order_seq_cst) volatile;
1174 unsigned long exchange(unsigned long, memory_order = memory_order_seq_cst);
1175 bool compare_exchange_weak(unsigned long&, unsigned long, memory_order,
1176 memory_order) volatile;
1177 bool compare_exchange_weak(unsigned long&, unsigned long, memory_order,
1178 memory_order);
1179 bool compare_exchange_strong(unsigned long&, unsigned long, memory_order,
1180 memory_order) volatile;
1181 bool compare_exchange_strong(unsigned long&, unsigned long, memory_order,
1182 memory_order);
1183 bool compare_exchange_weak(unsigned long&, unsigned long,
1184 memory_order = memory_order_seq_cst) volatile;
1185 bool compare_exchange_weak(unsigned long&, unsigned long,
1186 memory_order = memory_order_seq_cst);
1187 bool compare_exchange_strong(unsigned long&, unsigned long,
1188 memory_order = memory_order_seq_cst) volatile;
1189 bool compare_exchange_strong(unsigned long&, unsigned long,
1190 memory_order = memory_order_seq_cst);
1191 unsigned long fetch_add(unsigned long,
1192 memory_order = memory_order_seq_cst) volatile;
1193 unsigned long fetch_add(unsigned long, memory_order = memory_order_seq_cst);
1194 unsigned long fetch_sub(unsigned long,
1195 memory_order = memory_order_seq_cst) volatile;
1196 unsigned long fetch_sub(unsigned long, memory_order = memory_order_seq_cst);
1197 unsigned long fetch_and(unsigned long,
1198 memory_order = memory_order_seq_cst) volatile;
1199 unsigned long fetch_and(unsigned long, memory_order = memory_order_seq_cst);
1200 unsigned long fetch_or(unsigned long,
1201 memory_order = memory_order_seq_cst) volatile;
1202 unsigned long fetch_or(unsigned long, memory_order = memory_order_seq_cst);
1203 unsigned long fetch_xor(unsigned long,
1204 memory_order = memory_order_seq_cst) volatile;
1205 unsigned long fetch_xor(unsigned long, memory_order = memory_order_seq_cst);
1206 atomic_ulong() = default;
1207 constexpr atomic_ulong(unsigned long);
1208 atomic_ulong(const atomic_ulong&) = delete;
1209 atomic_ulong& operator=(const atomic_ulong&) = delete;
1210 atomic_ulong& operator=(const atomic_ulong&) volatile = delete;
1211 unsigned long operator=(unsigned long) volatile;
1212 unsigned long operator=(unsigned long);
1213 unsigned long operator++(int) volatile;
1214 unsigned long operator++(int);
1215 unsigned long operator--(int) volatile;
1216 unsigned long operator--(int);
1217 unsigned long operator++() volatile;
1218 unsigned long operator++();
1219 unsigned long operator--() volatile;
1220 unsigned long operator--();
1221 unsigned long operator+=(unsigned long) volatile;
1222 unsigned long operator+=(unsigned long);
1223 unsigned long operator-=(unsigned long) volatile;
1224 unsigned long operator-=(unsigned long);
1225 unsigned long operator&=(unsigned long) volatile;
1226 unsigned long operator&=(unsigned long);
1227 unsigned long operator|=(unsigned long) volatile;
1228 unsigned long operator|=(unsigned long);
1229 unsigned long operator^=(unsigned long) volatile;
1230 unsigned long operator^=(unsigned long);
1231} atomic_ulong;
1232
1233bool atomic_is_lock_free(const volatile atomic_ulong*);
1234bool atomic_is_lock_free(const atomic_ulong*);
1235void atomic_init(volatile atomic_ulong*, itype);
1236void atomic_init(atomic_ulong*, itype);
1237void atomic_store(volatile atomic_ulong*, unsigned long);
1238void atomic_store(atomic_ulong*, unsigned long);
1239void atomic_store_explicit(volatile atomic_ulong*, unsigned long, memory_order);
1240void atomic_store_explicit(atomic_ulong*, unsigned long, memory_order);
1241unsigned long atomic_load(const volatile atomic_ulong*);
1242unsigned long atomic_load(const atomic_ulong*);
1243unsigned long atomic_load_explicit(const volatile atomic_ulong*, memory_order);
1244unsigned long atomic_load_explicit(const atomic_ulong*, memory_order);
1245unsigned long atomic_exchange(volatile atomic_ulong*, unsigned long);
1246unsigned long atomic_exchange(atomic_ulong*, unsigned long);
1247unsigned long atomic_exchange_explicit(volatile atomic_ulong*, unsigned long,
1248 memory_order);
1249unsigned long atomic_exchange_explicit(atomic_ulong*, unsigned long,
1250 memory_order);
1251bool atomic_compare_exchange_weak(volatile atomic_ulong*, unsigned long*,
1252 unsigned long);
1253bool atomic_compare_exchange_weak(atomic_ulong*, unsigned long*, unsigned long);
1254bool atomic_compare_exchange_strong(volatile atomic_ulong*, unsigned long*,
1255 unsigned long);
1256bool atomic_compare_exchange_strong(atomic_ulong*, unsigned long*,
1257 unsigned long);
1258bool atomic_compare_exchange_weak_explicit(volatile atomic_ulong*,
1259 unsigned long*, unsigned long,
1260 memory_order, memory_order);
1261bool atomic_compare_exchange_weak_explicit(atomic_ulong*, unsigned long*,
1262 unsigned long, memory_order,
1263 memory_order);
1264bool atomic_compare_exchange_strong_explicit(volatile atomic_ulong*,
1265 unsigned long*, unsigned long,
1266 memory_order, memory_order);
1267bool atomic_compare_exchange_strong_explicit(atomic_ulong*, unsigned long*,
1268 unsigned long, memory_order,
1269 memory_order);
1270unsigned long atomic_fetch_add(volatile atomic_ulong*, unsigned long);
1271unsigned long atomic_fetch_add(atomic_ulong*, unsigned long);
1272unsigned long atomic_fetch_add_explicit(volatile atomic_ulong*, unsigned long,
1273 memory_order);
1274unsigned long atomic_fetch_add_explicit(atomic_ulong*, unsigned long,
1275 memory_order);
1276unsigned long atomic_fetch_sub(volatile atomic_ulong*, unsigned long);
1277unsigned long atomic_fetch_sub(atomic_ulong*, unsigned long);
1278unsigned long atomic_fetch_sub_explicit(volatile atomic_ulong*, unsigned long,
1279 memory_order);
1280unsigned long atomic_fetch_sub_explicit(atomic_ulong*, unsigned long,
1281 memory_order);
1282unsigned long atomic_fetch_and(volatile atomic_ulong*, unsigned long);
1283unsigned long atomic_fetch_and(atomic_ulong*, unsigned long);
1284unsigned long atomic_fetch_and_explicit(volatile atomic_ulong*, unsigned long,
1285 memory_order);
1286unsigned long atomic_fetch_and_explicit(atomic_ulong*, unsigned long,
1287 memory_order);
1288unsigned long atomic_fetch_or(volatile atomic_ulong*, unsigned long);
1289unsigned long atomic_fetch_or(atomic_ulong*, unsigned long);
1290unsigned long atomic_fetch_or_explicit(volatile atomic_ulong*, unsigned long,
1291 memory_order);
1292unsigned long atomic_fetch_or_explicit(atomic_ulong*, unsigned long,
1293 memory_order);
1294unsigned long atomic_fetch_xor(volatile atomic_ulong*, unsigned long);
1295unsigned long atomic_fetch_xor(atomic_ulong*, unsigned long);
1296unsigned long atomic_fetch_xor_explicit(volatile atomic_ulong*, unsigned long,
1297 memory_order);
1298unsigned long atomic_fetch_xor_explicit(atomic_ulong*, unsigned long,
1299 memory_order);
1300
1301// atomic_llong
1302
1303typedef struct atomic_llong
1304{
1305 bool is_lock_free() const volatile;
1306 bool is_lock_free() const;
1307 void store(long long, memory_order = memory_order_seq_cst) volatile;
1308 void store(long long, memory_order = memory_order_seq_cst);
1309 long long load(memory_order = memory_order_seq_cst) const volatile;
1310 long long load(memory_order = memory_order_seq_cst) const;
1311 operator long long() const volatile;
1312 operator long long() const;
1313 long long exchange(long long,
1314 memory_order = memory_order_seq_cst) volatile;
1315 long long exchange(long long, memory_order = memory_order_seq_cst);
1316 bool compare_exchange_weak(long long&, long long, memory_order,
1317 memory_order) volatile;
1318 bool compare_exchange_weak(long long&, long long, memory_order,
1319 memory_order);
1320 bool compare_exchange_strong(long long&, long long, memory_order,
1321 memory_order) volatile;
1322 bool compare_exchange_strong(long long&, long long, memory_order,
1323 memory_order);
1324 bool compare_exchange_weak(long long&, long long,
1325 memory_order = memory_order_seq_cst) volatile;
1326 bool compare_exchange_weak(long long&, long long,
1327 memory_order = memory_order_seq_cst);
1328 bool compare_exchange_strong(long long&, long long,
1329 memory_order = memory_order_seq_cst) volatile;
1330 bool compare_exchange_strong(long long&, long long,
1331 memory_order = memory_order_seq_cst);
1332 long long fetch_add(long long,
1333 memory_order = memory_order_seq_cst) volatile;
1334 long long fetch_add(long long, memory_order = memory_order_seq_cst);
1335 long long fetch_sub(long long,
1336 memory_order = memory_order_seq_cst) volatile;
1337 long long fetch_sub(long long, memory_order = memory_order_seq_cst);
1338 long long fetch_and(long long,
1339 memory_order = memory_order_seq_cst) volatile;
1340 long long fetch_and(long long, memory_order = memory_order_seq_cst);
1341 long long fetch_or(long long, memory_order = memory_order_seq_cst) volatile;
1342 long long fetch_or(long long, memory_order = memory_order_seq_cst);
1343 long long fetch_xor(long long,
1344 memory_order = memory_order_seq_cst) volatile;
1345 long long fetch_xor(long long, memory_order = memory_order_seq_cst);
1346 atomic_llong() = default;
1347 constexpr atomic_llong(long long);
1348 atomic_llong(const atomic_llong&) = delete;
1349 atomic_llong& operator=(const atomic_llong&) = delete;
1350 atomic_llong& operator=(const atomic_llong&) volatile = delete;
1351 long long operator=(long long) volatile;
1352 long long operator=(long long);
1353 long long operator++(int) volatile;
1354 long long operator++(int);
1355 long long operator--(int) volatile;
1356 long long operator--(int);
1357 long long operator++() volatile;
1358 long long operator++();
1359 long long operator--() volatile;
1360 long long operator--();
1361 long long operator+=(long long) volatile;
1362 long long operator+=(long long);
1363 long long operator-=(long long) volatile;
1364 long long operator-=(long long);
1365 long long operator&=(long long) volatile;
1366 long long operator&=(long long);
1367 long long operator|=(long long) volatile;
1368 long long operator|=(long long);
1369 long long operator^=(long long) volatile;
1370 long long operator^=(long long);
1371} atomic_llong;
1372
1373bool atomic_is_lock_free(const volatile atomic_llong*);
1374bool atomic_is_lock_free(const atomic_llong*);
1375void atomic_init(volatile atomic_llong*, itype);
1376void atomic_init(atomic_llong*, itype);
1377void atomic_store(volatile atomic_llong*, long long);
1378void atomic_store(atomic_llong*, long long);
1379void atomic_store_explicit(volatile atomic_llong*, long long, memory_order);
1380void atomic_store_explicit(atomic_llong*, long long, memory_order);
1381long long atomic_load(const volatile atomic_llong*);
1382long long atomic_load(const atomic_llong*);
1383long long atomic_load_explicit(const volatile atomic_llong*, memory_order);
1384long long atomic_load_explicit(const atomic_llong*, memory_order);
1385long long atomic_exchange(volatile atomic_llong*, long long);
1386long long atomic_exchange(atomic_llong*, long long);
1387long long atomic_exchange_explicit(volatile atomic_llong*, long long,
1388 memory_order);
1389long long atomic_exchange_explicit(atomic_llong*, long long, memory_order);
1390bool atomic_compare_exchange_weak(volatile atomic_llong*, long long*,
1391 long long);
1392bool atomic_compare_exchange_weak(atomic_llong*, long long*, long long);
1393bool atomic_compare_exchange_strong(volatile atomic_llong*, long long*,
1394 long long);
1395bool atomic_compare_exchange_strong(atomic_llong*, long long*, long long);
1396bool atomic_compare_exchange_weak_explicit(volatile atomic_llong*, long long*,
1397 long long, memory_order,
1398 memory_order);
1399bool atomic_compare_exchange_weak_explicit(atomic_llong*, long long*, long long,
1400 memory_order, memory_order);
1401bool atomic_compare_exchange_strong_explicit(volatile atomic_llong*, long long*,
1402 long long, memory_order,
1403 memory_order);
1404bool atomic_compare_exchange_strong_explicit(atomic_llong*, long long*,
1405 long long, memory_order,
1406 memory_order);
1407long long atomic_fetch_add(volatile atomic_llong*, long long);
1408long long atomic_fetch_add(atomic_llong*, long long);
1409long long atomic_fetch_add_explicit(volatile atomic_llong*, long long,
1410 memory_order);
1411long long atomic_fetch_add_explicit(atomic_llong*, long long, memory_order);
1412long long atomic_fetch_sub(volatile atomic_llong*, long long);
1413long long atomic_fetch_sub(atomic_llong*, long long);
1414long long atomic_fetch_sub_explicit(volatile atomic_llong*, long long,
1415 memory_order);
1416long long atomic_fetch_sub_explicit(atomic_llong*, long long, memory_order);
1417long long atomic_fetch_and(volatile atomic_llong*, long long);
1418long long atomic_fetch_and(atomic_llong*, long long);
1419long long atomic_fetch_and_explicit(volatile atomic_llong*, long long,
1420 memory_order);
1421long long atomic_fetch_and_explicit(atomic_llong*, long long, memory_order);
1422long long atomic_fetch_or(volatile atomic_llong*, long long);
1423long long atomic_fetch_or(atomic_llong*, long long);
1424long long atomic_fetch_or_explicit(volatile atomic_llong*, long long,
1425 memory_order);
1426long long atomic_fetch_or_explicit(atomic_llong*, long long, memory_order);
1427long long atomic_fetch_xor(volatile atomic_llong*, long long);
1428long long atomic_fetch_xor(atomic_llong*, long long);
1429long long atomic_fetch_xor_explicit(volatile atomic_llong*, long long,
1430 memory_order);
1431long long atomic_fetch_xor_explicit(atomic_llong*, long long, memory_order);
1432
1433// atomic_ullong
1434
1435typedef struct atomic_ullong
1436{
1437 bool is_lock_free() const volatile;
1438 bool is_lock_free() const;
1439 void store(unsigned long long,
1440 memory_order = memory_order_seq_cst) volatile;
1441 void store(unsigned long long, memory_order = memory_order_seq_cst);
1442 unsigned long long load(memory_order = memory_order_seq_cst) const volatile;
1443 unsigned long long load(memory_order = memory_order_seq_cst) const;
1444 operator unsigned long long() const volatile;
1445 operator unsigned long long() const;
1446 unsigned long long exchange(unsigned long long,
1447 memory_order = memory_order_seq_cst) volatile;
1448 unsigned long long exchange(unsigned long long,
1449 memory_order = memory_order_seq_cst);
1450 bool compare_exchange_weak(unsigned long long&, unsigned long long,
1451 memory_order, memory_order) volatile;
1452 bool compare_exchange_weak(unsigned long long&, unsigned long long,
1453 memory_order, memory_order);
1454 bool compare_exchange_strong(unsigned long long&, unsigned long long,
1455 memory_order, memory_order) volatile;
1456 bool compare_exchange_strong(unsigned long long&, unsigned long long,
1457 memory_order, memory_order);
1458 bool compare_exchange_weak(unsigned long long&, unsigned long long,
1459 memory_order = memory_order_seq_cst) volatile;
1460 bool compare_exchange_weak(unsigned long long&, unsigned long long,
1461 memory_order = memory_order_seq_cst);
1462 bool compare_exchange_strong(unsigned long long&, unsigned long long,
1463 memory_order = memory_order_seq_cst) volatile;
1464 bool compare_exchange_strong(unsigned long long&, unsigned long long,
1465 memory_order = memory_order_seq_cst);
1466 unsigned long long fetch_add(unsigned long long,
1467 memory_order = memory_order_seq_cst) volatile;
1468 unsigned long long fetch_add(unsigned long long,
1469 memory_order = memory_order_seq_cst);
1470 unsigned long long fetch_sub(unsigned long long,
1471 memory_order = memory_order_seq_cst) volatile;
1472 unsigned long long fetch_sub(unsigned long long,
1473 memory_order = memory_order_seq_cst);
1474 unsigned long long fetch_and(unsigned long long,
1475 memory_order = memory_order_seq_cst) volatile;
1476 unsigned long long fetch_and(unsigned long long,
1477 memory_order = memory_order_seq_cst);
1478 unsigned long long fetch_or(unsigned long long,
1479 memory_order = memory_order_seq_cst) volatile;
1480 unsigned long long fetch_or(unsigned long long,
1481 memory_order = memory_order_seq_cst);
1482 unsigned long long fetch_xor(unsigned long long,
1483 memory_order = memory_order_seq_cst) volatile;
1484 unsigned long long fetch_xor(unsigned long long,
1485 memory_order = memory_order_seq_cst);
1486 atomic_ullong() = default;
1487 constexpr atomic_ullong(unsigned long long);
1488 atomic_ullong(const atomic_ullong&) = delete;
1489 atomic_ullong& operator=(const atomic_ullong&) = delete;
1490 atomic_ullong& operator=(const atomic_ullong&) volatile = delete;
1491 unsigned long long operator=(unsigned long long) volatile;
1492 unsigned long long operator=(unsigned long long);
1493 unsigned long long operator++(int) volatile;
1494 unsigned long long operator++(int);
1495 unsigned long long operator--(int) volatile;
1496 unsigned long long operator--(int);
1497 unsigned long long operator++() volatile;
1498 unsigned long long operator++();
1499 unsigned long long operator--() volatile;
1500 unsigned long long operator--();
1501 unsigned long long operator+=(unsigned long long) volatile;
1502 unsigned long long operator+=(unsigned long long);
1503 unsigned long long operator-=(unsigned long long) volatile;
1504 unsigned long long operator-=(unsigned long long);
1505 unsigned long long operator&=(unsigned long long) volatile;
1506 unsigned long long operator&=(unsigned long long);
1507 unsigned long long operator|=(unsigned long long) volatile;
1508 unsigned long long operator|=(unsigned long long);
1509 unsigned long long operator^=(unsigned long long) volatile;
1510 unsigned long long operator^=(unsigned long long);
1511} atomic_ullong;
1512
1513bool atomic_is_lock_free(const volatile atomic_ullong*);
1514bool atomic_is_lock_free(const atomic_ullong*);
1515void atomic_init(volatile atomic_ullong*, itype);
1516void atomic_init(atomic_ullong*, itype);
1517void atomic_store(volatile atomic_ullong*, unsigned long long);
1518void atomic_store(atomic_ullong*, unsigned long long);
1519void atomic_store_explicit(volatile atomic_ullong*, unsigned long long,
1520 memory_order);
1521void atomic_store_explicit(atomic_ullong*, unsigned long long, memory_order);
1522unsigned long long atomic_load(const volatile atomic_ullong*);
1523unsigned long long atomic_load(const atomic_ullong*);
1524unsigned long long atomic_load_explicit(const volatile atomic_ullong*,
1525 memory_order);
1526unsigned long long atomic_load_explicit(const atomic_ullong*, memory_order);
1527unsigned long long atomic_exchange(volatile atomic_ullong*, unsigned long long);
1528unsigned long long atomic_exchange(atomic_ullong*, unsigned long long);
1529unsigned long long atomic_exchange_explicit(volatile atomic_ullong*,
1530 unsigned long long, memory_order);
1531unsigned long long atomic_exchange_explicit(atomic_ullong*, unsigned long long,
1532 memory_order);
1533bool atomic_compare_exchange_weak(volatile atomic_ullong*, unsigned long long*,
1534 unsigned long long);
1535bool atomic_compare_exchange_weak(atomic_ullong*, unsigned long long*,
1536 unsigned long long);
1537bool atomic_compare_exchange_strong(volatile atomic_ullong*,
1538 unsigned long long*, unsigned long long);
1539bool atomic_compare_exchange_strong(atomic_ullong*, unsigned long long*,
1540 unsigned long long);
1541bool atomic_compare_exchange_weak_explicit(volatile atomic_ullong*,
1542 unsigned long long*,
1543 unsigned long long, memory_order,
1544 memory_order);
1545bool atomic_compare_exchange_weak_explicit(atomic_ullong*, unsigned long long*,
1546 unsigned long long, memory_order,
1547 memory_order);
1548bool atomic_compare_exchange_strong_explicit(volatile atomic_ullong*,
1549 unsigned long long*,
1550 unsigned long long, memory_order,
1551 memory_order);
1552bool atomic_compare_exchange_strong_explicit(atomic_ullong*,
1553 unsigned long long*,
1554 unsigned long long, memory_order,
1555 memory_order);
1556unsigned long long atomic_fetch_add(volatile atomic_ullong*,
1557 unsigned long long);
1558unsigned long long atomic_fetch_add(atomic_ullong*, unsigned long long);
1559unsigned long long atomic_fetch_add_explicit(volatile atomic_ullong*,
1560 unsigned long long, memory_order);
1561unsigned long long atomic_fetch_add_explicit(atomic_ullong*, unsigned long long,
1562 memory_order);
1563unsigned long long atomic_fetch_sub(volatile atomic_ullong*,
1564 unsigned long long);
1565unsigned long long atomic_fetch_sub(atomic_ullong*, unsigned long long);
1566unsigned long long atomic_fetch_sub_explicit(volatile atomic_ullong*,
1567 unsigned long long, memory_order);
1568unsigned long long atomic_fetch_sub_explicit(atomic_ullong*, unsigned long long,
1569 memory_order);
1570unsigned long long atomic_fetch_and(volatile atomic_ullong*,
1571 unsigned long long);
1572unsigned long long atomic_fetch_and(atomic_ullong*, unsigned long long);
1573unsigned long long atomic_fetch_and_explicit(volatile atomic_ullong*,
1574 unsigned long long, memory_order);
1575unsigned long long atomic_fetch_and_explicit(atomic_ullong*, unsigned long long,
1576 memory_order);
1577unsigned long long atomic_fetch_or(volatile atomic_ullong*, unsigned long long);
1578unsigned long long atomic_fetch_or(atomic_ullong*, unsigned long long);
1579unsigned long long atomic_fetch_or_explicit(volatile atomic_ullong*,
1580 unsigned long long, memory_order);
1581unsigned long long atomic_fetch_or_explicit(atomic_ullong*, unsigned long long,
1582 memory_order);
1583unsigned long long atomic_fetch_xor(volatile atomic_ullong*,
1584 unsigned long long);
1585unsigned long long atomic_fetch_xor(atomic_ullong*, unsigned long long);
1586unsigned long long atomic_fetch_xor_explicit(volatile atomic_ullong*,
1587 unsigned long long, memory_order);
1588unsigned long long atomic_fetch_xor_explicit(atomic_ullong*, unsigned long long,
1589 memory_order);
1590
1591// atomic_char16_t
1592
1593typedef struct atomic_char16_t
1594{
1595 bool is_lock_free() const volatile;
1596 bool is_lock_free() const;
1597 void store(char16_t, memory_order = memory_order_seq_cst) volatile;
1598 void store(char16_t, memory_order = memory_order_seq_cst);
1599 char16_t load(memory_order = memory_order_seq_cst) const volatile;
1600 char16_t load(memory_order = memory_order_seq_cst) const;
1601 operator char16_t() const volatile;
1602 operator char16_t() const;
1603 char16_t exchange(char16_t,
1604 memory_order = memory_order_seq_cst) volatile;
1605 char16_t exchange(char16_t, memory_order = memory_order_seq_cst);
1606 bool compare_exchange_weak(char16_t&, char16_t, memory_order,
1607 memory_order) volatile;
1608 bool compare_exchange_weak(char16_t&, char16_t, memory_order, memory_order);
1609 bool compare_exchange_strong(char16_t&, char16_t, memory_order,
1610 memory_order) volatile;
1611 bool compare_exchange_strong(char16_t&, char16_t,
1612 memory_order, memory_order);
1613 bool compare_exchange_weak(char16_t&, char16_t,
1614 memory_order = memory_order_seq_cst) volatile;
1615 bool compare_exchange_weak(char16_t&, char16_t,
1616 memory_order = memory_order_seq_cst);
1617 bool compare_exchange_strong(char16_t&, char16_t,
1618 memory_order = memory_order_seq_cst) volatile;
1619 bool compare_exchange_strong(char16_t&, char16_t,
1620 memory_order = memory_order_seq_cst);
1621 char16_t fetch_add(char16_t, memory_order = memory_order_seq_cst) volatile;
1622 char16_t fetch_add(char16_t, memory_order = memory_order_seq_cst);
1623 char16_t fetch_sub(char16_t, memory_order = memory_order_seq_cst) volatile;
1624 char16_t fetch_sub(char16_t, memory_order = memory_order_seq_cst);
1625 char16_t fetch_and(char16_t, memory_order = memory_order_seq_cst) volatile;
1626 char16_t fetch_and(char16_t, memory_order = memory_order_seq_cst);
1627 char16_t fetch_or(char16_t, memory_order = memory_order_seq_cst) volatile;
1628 char16_t fetch_or(char16_t, memory_order = memory_order_seq_cst);
1629 char16_t fetch_xor(char16_t, memory_order = memory_order_seq_cst) volatile;
1630 char16_t fetch_xor(char16_t, memory_order = memory_order_seq_cst);
1631 atomic_char16_t() = default;
1632 constexpr atomic_char16_t(char16_t);
1633 atomic_char16_t(const atomic_char16_t&) = delete;
1634 atomic_char16_t& operator=(const atomic_char16_t&) = delete;
1635 atomic_char16_t& operator=(const atomic_char16_t&) volatile = delete;
1636 char16_t operator=(char16_t) volatile;
1637 char16_t operator=(char16_t);
1638 char16_t operator++(int) volatile;
1639 char16_t operator++(int);
1640 char16_t operator--(int) volatile;
1641 char16_t operator--(int);
1642 char16_t operator++() volatile;
1643 char16_t operator++();
1644 char16_t operator--() volatile;
1645 char16_t operator--();
1646 char16_t operator+=(char16_t) volatile;
1647 char16_t operator+=(char16_t);
1648 char16_t operator-=(char16_t) volatile;
1649 char16_t operator-=(char16_t);
1650 char16_t operator&=(char16_t) volatile;
1651 char16_t operator&=(char16_t);
1652 char16_t operator|=(char16_t) volatile;
1653 char16_t operator|=(char16_t);
1654 char16_t operator^=(char16_t) volatile;
1655 char16_t operator^=(char16_t);
1656} atomic_char16_t;
1657
1658bool atomic_is_lock_free(const volatile atomic_char16_t*);
1659bool atomic_is_lock_free(const atomic_char16_t*);
1660void atomic_init(volatile atomic_char16_t*, itype);
1661void atomic_init(atomic_char16_t*, itype);
1662void atomic_store(volatile atomic_char16_t*, char16_t);
1663void atomic_store(atomic_char16_t*, char16_t);
1664void atomic_store_explicit(volatile atomic_char16_t*, char16_t, memory_order);
1665void atomic_store_explicit(atomic_char16_t*, char16_t, memory_order);
1666char16_t atomic_load(const volatile atomic_char16_t*);
1667char16_t atomic_load(const atomic_char16_t*);
1668char16_t atomic_load_explicit(const volatile atomic_char16_t*, memory_order);
1669char16_t atomic_load_explicit(const atomic_char16_t*, memory_order);
1670char16_t atomic_exchange(volatile atomic_char16_t*, char16_t);
1671char16_t atomic_exchange(atomic_char16_t*, char16_t);
1672char16_t atomic_exchange_explicit(volatile atomic_char16_t*, char16_t,
1673 memory_order);
1674char16_t atomic_exchange_explicit(atomic_char16_t*, char16_t, memory_order);
1675bool atomic_compare_exchange_weak(volatile atomic_char16_t*, char16_t*,
1676 char16_t);
1677bool atomic_compare_exchange_weak(atomic_char16_t*, char16_t*, char16_t);
1678bool atomic_compare_exchange_strong(volatile atomic_char16_t*, char16_t*,
1679 char16_t);
1680bool atomic_compare_exchange_strong(atomic_char16_t*, char16_t*, char16_t);
1681bool atomic_compare_exchange_weak_explicit(volatile atomic_char16_t*, char16_t*,
1682 char16_t, memory_order,
1683 memory_order);
1684bool atomic_compare_exchange_weak_explicit(atomic_char16_t*, char16_t*,
1685 char16_t, memory_order,
1686 memory_order);
1687bool atomic_compare_exchange_strong_explicit(volatile atomic_char16_t*,
1688 char16_t*, char16_t, memory_order,
1689 memory_order);
1690bool atomic_compare_exchange_strong_explicit(atomic_char16_t*, char16_t*,
1691 char16_t, memory_order,
1692 memory_order);
1693char16_t atomic_fetch_add(volatile atomic_char16_t*, char16_t);
1694char16_t atomic_fetch_add(atomic_char16_t*, char16_t);
1695char16_t atomic_fetch_add_explicit(volatile atomic_char16_t*, char16_t,
1696 memory_order);
1697char16_t atomic_fetch_add_explicit(atomic_char16_t*, char16_t, memory_order);
1698char16_t atomic_fetch_sub(volatile atomic_char16_t*, char16_t);
1699char16_t atomic_fetch_sub(atomic_char16_t*, char16_t);
1700char16_t atomic_fetch_sub_explicit(volatile atomic_char16_t*, char16_t,
1701 memory_order);
1702char16_t atomic_fetch_sub_explicit(atomic_char16_t*, char16_t, memory_order);
1703char16_t atomic_fetch_and(volatile atomic_char16_t*, char16_t);
1704char16_t atomic_fetch_and(atomic_char16_t*, char16_t);
1705char16_t atomic_fetch_and_explicit(volatile atomic_char16_t*, char16_t,
1706 memory_order);
1707char16_t atomic_fetch_and_explicit(atomic_char16_t*, char16_t, memory_order);
1708char16_t atomic_fetch_or(volatile atomic_char16_t*, char16_t);
1709char16_t atomic_fetch_or(atomic_char16_t*, char16_t);
1710char16_t atomic_fetch_or_explicit(volatile atomic_char16_t*, char16_t,
1711 memory_order);
1712char16_t atomic_fetch_or_explicit(atomic_char16_t*, char16_t, memory_order);
1713char16_t atomic_fetch_xor(volatile atomic_char16_t*, char16_t);
1714char16_t atomic_fetch_xor(atomic_char16_t*, char16_t);
1715char16_t atomic_fetch_xor_explicit(volatile atomic_char16_t*, char16_t,
1716 memory_order);
1717char16_t atomic_fetch_xor_explicit(atomic_char16_t*, char16_t, memory_order);
1718
1719// atomic_char32_t
1720
1721typedef struct atomic_char32_t
1722{
1723 bool is_lock_free() const volatile;
1724 bool is_lock_free() const;
1725 void store(char32_t, memory_order = memory_order_seq_cst) volatile;
1726 void store(char32_t, memory_order = memory_order_seq_cst);
1727 char32_t load(memory_order = memory_order_seq_cst) const volatile;
1728 char32_t load(memory_order = memory_order_seq_cst) const;
1729 operator char32_t() const volatile;
1730 operator char32_t() const;
1731 char32_t exchange(char32_t,
1732 memory_order = memory_order_seq_cst) volatile;
1733 char32_t exchange(char32_t, memory_order = memory_order_seq_cst);
1734 bool compare_exchange_weak(char32_t&, char32_t, memory_order,
1735 memory_order) volatile;
1736 bool compare_exchange_weak(char32_t&, char32_t, memory_order, memory_order);
1737 bool compare_exchange_strong(char32_t&, char32_t, memory_order,
1738 memory_order) volatile;
1739 bool compare_exchange_strong(char32_t&, char32_t,
1740 memory_order, memory_order);
1741 bool compare_exchange_weak(char32_t&, char32_t,
1742 memory_order = memory_order_seq_cst) volatile;
1743 bool compare_exchange_weak(char32_t&, char32_t,
1744 memory_order = memory_order_seq_cst);
1745 bool compare_exchange_strong(char32_t&, char32_t,
1746 memory_order = memory_order_seq_cst) volatile;
1747 bool compare_exchange_strong(char32_t&, char32_t,
1748 memory_order = memory_order_seq_cst);
1749 char32_t fetch_add(char32_t, memory_order = memory_order_seq_cst) volatile;
1750 char32_t fetch_add(char32_t, memory_order = memory_order_seq_cst);
1751 char32_t fetch_sub(char32_t, memory_order = memory_order_seq_cst) volatile;
1752 char32_t fetch_sub(char32_t, memory_order = memory_order_seq_cst);
1753 char32_t fetch_and(char32_t, memory_order = memory_order_seq_cst) volatile;
1754 char32_t fetch_and(char32_t, memory_order = memory_order_seq_cst);
1755 char32_t fetch_or(char32_t, memory_order = memory_order_seq_cst) volatile;
1756 char32_t fetch_or(char32_t, memory_order = memory_order_seq_cst);
1757 char32_t fetch_xor(char32_t, memory_order = memory_order_seq_cst) volatile;
1758 char32_t fetch_xor(char32_t, memory_order = memory_order_seq_cst);
1759 atomic_char32_t() = default;
1760 constexpr atomic_char32_t(char32_t);
1761 atomic_char32_t(const atomic_char32_t&) = delete;
1762 atomic_char32_t& operator=(const atomic_char32_t&) = delete;
1763 atomic_char32_t& operator=(const atomic_char32_t&) volatile = delete;
1764 char32_t operator=(char32_t) volatile;
1765 char32_t operator=(char32_t);
1766 char32_t operator++(int) volatile;
1767 char32_t operator++(int);
1768 char32_t operator--(int) volatile;
1769 char32_t operator--(int);
1770 char32_t operator++() volatile;
1771 char32_t operator++();
1772 char32_t operator--() volatile;
1773 char32_t operator--();
1774 char32_t operator+=(char32_t) volatile;
1775 char32_t operator+=(char32_t);
1776 char32_t operator-=(char32_t) volatile;
1777 char32_t operator-=(char32_t);
1778 char32_t operator&=(char32_t) volatile;
1779 char32_t operator&=(char32_t);
1780 char32_t operator|=(char32_t) volatile;
1781 char32_t operator|=(char32_t);
1782 char32_t operator^=(char32_t) volatile;
1783 char32_t operator^=(char32_t);
1784} atomic_char32_t;
1785
1786bool atomic_is_lock_free(const volatile atomic_char32_t*);
1787bool atomic_is_lock_free(const atomic_char32_t*);
1788void atomic_init(volatile atomic_char32_t*, itype);
1789void atomic_init(atomic_char32_t*, itype);
1790void atomic_store(volatile atomic_char32_t*, char32_t);
1791void atomic_store(atomic_char32_t*, char32_t);
1792void atomic_store_explicit(volatile atomic_char32_t*, char32_t, memory_order);
1793void atomic_store_explicit(atomic_char32_t*, char32_t, memory_order);
1794char32_t atomic_load(const volatile atomic_char32_t*);
1795char32_t atomic_load(const atomic_char32_t*);
1796char32_t atomic_load_explicit(const volatile atomic_char32_t*, memory_order);
1797char32_t atomic_load_explicit(const atomic_char32_t*, memory_order);
1798char32_t atomic_exchange(volatile atomic_char32_t*, char32_t);
1799char32_t atomic_exchange(atomic_char32_t*, char32_t);
1800char32_t atomic_exchange_explicit(volatile atomic_char32_t*, char32_t,
1801 memory_order);
1802char32_t atomic_exchange_explicit(atomic_char32_t*, char32_t, memory_order);
1803bool atomic_compare_exchange_weak(volatile atomic_char32_t*, char32_t*,
1804 char32_t);
1805bool atomic_compare_exchange_weak(atomic_char32_t*, char32_t*, char32_t);
1806bool atomic_compare_exchange_strong(volatile atomic_char32_t*, char32_t*,
1807 char32_t);
1808bool atomic_compare_exchange_strong(atomic_char32_t*, char32_t*, char32_t);
1809bool atomic_compare_exchange_weak_explicit(volatile atomic_char32_t*, char32_t*,
1810 char32_t, memory_order,
1811 memory_order);
1812bool atomic_compare_exchange_weak_explicit(atomic_char32_t*, char32_t*,
1813 char32_t, memory_order,
1814 memory_order);
1815bool atomic_compare_exchange_strong_explicit(volatile atomic_char32_t*,
1816 char32_t*, char32_t, memory_order,
1817 memory_order);
1818bool atomic_compare_exchange_strong_explicit(atomic_char32_t*, char32_t*,
1819 char32_t, memory_order,
1820 memory_order);
1821char32_t atomic_fetch_add(volatile atomic_char32_t*, char32_t);
1822char32_t atomic_fetch_add(atomic_char32_t*, char32_t);
1823char32_t atomic_fetch_add_explicit(volatile atomic_char32_t*, char32_t,
1824 memory_order);
1825char32_t atomic_fetch_add_explicit(atomic_char32_t*, char32_t, memory_order);
1826char32_t atomic_fetch_sub(volatile atomic_char32_t*, char32_t);
1827char32_t atomic_fetch_sub(atomic_char32_t*, char32_t);
1828char32_t atomic_fetch_sub_explicit(volatile atomic_char32_t*, char32_t,
1829 memory_order);
1830char32_t atomic_fetch_sub_explicit(atomic_char32_t*, char32_t, memory_order);
1831char32_t atomic_fetch_and(volatile atomic_char32_t*, char32_t);
1832char32_t atomic_fetch_and(atomic_char32_t*, char32_t);
1833char32_t atomic_fetch_and_explicit(volatile atomic_char32_t*, char32_t,
1834 memory_order);
1835char32_t atomic_fetch_and_explicit(atomic_char32_t*, char32_t, memory_order);
1836char32_t atomic_fetch_or(volatile atomic_char32_t*, char32_t);
1837char32_t atomic_fetch_or(atomic_char32_t*, char32_t);
1838char32_t atomic_fetch_or_explicit(volatile atomic_char32_t*, char32_t,
1839 memory_order);
1840char32_t atomic_fetch_or_explicit(atomic_char32_t*, char32_t, memory_order);
1841char32_t atomic_fetch_xor(volatile atomic_char32_t*, char32_t);
1842char32_t atomic_fetch_xor(atomic_char32_t*, char32_t);
1843char32_t atomic_fetch_xor_explicit(volatile atomic_char32_t*, char32_t,
1844 memory_order);
1845char32_t atomic_fetch_xor_explicit(atomic_char32_t*, char32_t, memory_order);
1846
1847// atomic_wchar_t
1848
1849typedef struct atomic_wchar_t
1850{
1851 bool is_lock_free() const volatile;
1852 bool is_lock_free() const;
1853 void store(wchar_t, memory_order = memory_order_seq_cst) volatile;
1854 void store(wchar_t, memory_order = memory_order_seq_cst);
1855 wchar_t load(memory_order = memory_order_seq_cst) const volatile;
1856 wchar_t load(memory_order = memory_order_seq_cst) const;
1857 operator wchar_t() const volatile;
1858 operator wchar_t() const;
1859 wchar_t exchange(wchar_t,
1860 memory_order = memory_order_seq_cst) volatile;
1861 wchar_t exchange(wchar_t, memory_order = memory_order_seq_cst);
1862 bool compare_exchange_weak(wchar_t&, wchar_t, memory_order,
1863 memory_order) volatile;
1864 bool compare_exchange_weak(wchar_t&, wchar_t, memory_order, memory_order);
1865 bool compare_exchange_strong(wchar_t&, wchar_t, memory_order,
1866 memory_order) volatile;
1867 bool compare_exchange_strong(wchar_t&, wchar_t, memory_order, memory_order);
1868 bool compare_exchange_weak(wchar_t&, wchar_t,
1869 memory_order = memory_order_seq_cst) volatile;
1870 bool compare_exchange_weak(wchar_t&, wchar_t,
1871 memory_order = memory_order_seq_cst);
1872 bool compare_exchange_strong(wchar_t&, wchar_t,
1873 memory_order = memory_order_seq_cst) volatile;
1874 bool compare_exchange_strong(wchar_t&, wchar_t,
1875 memory_order = memory_order_seq_cst);
1876 wchar_t fetch_add(wchar_t, memory_order = memory_order_seq_cst) volatile;
1877 wchar_t fetch_add(wchar_t, memory_order = memory_order_seq_cst);
1878 wchar_t fetch_sub(wchar_t, memory_order = memory_order_seq_cst) volatile;
1879 wchar_t fetch_sub(wchar_t, memory_order = memory_order_seq_cst);
1880 wchar_t fetch_and(wchar_t, memory_order = memory_order_seq_cst) volatile;
1881 wchar_t fetch_and(wchar_t, memory_order = memory_order_seq_cst);
1882 wchar_t fetch_or(wchar_t, memory_order = memory_order_seq_cst) volatile;
1883 wchar_t fetch_or(wchar_t, memory_order = memory_order_seq_cst);
1884 wchar_t fetch_xor(wchar_t, memory_order = memory_order_seq_cst) volatile;
1885 wchar_t fetch_xor(wchar_t, memory_order = memory_order_seq_cst);
1886 atomic_wchar_t() = default;
1887 constexpr atomic_wchar_t(wchar_t);
1888 atomic_wchar_t(const atomic_wchar_t&) = delete;
1889 atomic_wchar_t& operator=(const atomic_wchar_t&) = delete;
1890 atomic_wchar_t& operator=(const atomic_wchar_t&) volatile = delete;
1891 wchar_t operator=(wchar_t) volatile;
1892 wchar_t operator=(wchar_t);
1893 wchar_t operator++(int) volatile;
1894 wchar_t operator++(int);
1895 wchar_t operator--(int) volatile;
1896 wchar_t operator--(int);
1897 wchar_t operator++() volatile;
1898 wchar_t operator++();
1899 wchar_t operator--() volatile;
1900 wchar_t operator--();
1901 wchar_t operator+=(wchar_t) volatile;
1902 wchar_t operator+=(wchar_t);
1903 wchar_t operator-=(wchar_t) volatile;
1904 wchar_t operator-=(wchar_t);
1905 wchar_t operator&=(wchar_t) volatile;
1906 wchar_t operator&=(wchar_t);
1907 wchar_t operator|=(wchar_t) volatile;
1908 wchar_t operator|=(wchar_t);
1909 wchar_t operator^=(wchar_t) volatile;
1910 wchar_t operator^=(wchar_t);
1911} atomic_wchar_t;
1912
1913bool atomic_is_lock_free(const volatile atomic_wchar_t*);
1914bool atomic_is_lock_free(const atomic_wchar_t*);
1915void atomic_init(volatile atomic_wchar_t*, itype);
1916void atomic_init(atomic_wchar_t*, itype);
1917void atomic_store(volatile atomic_wchar_t*, wchar_t);
1918void atomic_store(atomic_wchar_t*, wchar_t);
1919void atomic_store_explicit(volatile atomic_wchar_t*, wchar_t, memory_order);
1920void atomic_store_explicit(atomic_wchar_t*, wchar_t, memory_order);
1921wchar_t atomic_load(const volatile atomic_wchar_t*);
1922wchar_t atomic_load(const atomic_wchar_t*);
1923wchar_t atomic_load_explicit(const volatile atomic_wchar_t*, memory_order);
1924wchar_t atomic_load_explicit(const atomic_wchar_t*, memory_order);
1925wchar_t atomic_exchange(volatile atomic_wchar_t*, wchar_t);
1926wchar_t atomic_exchange(atomic_wchar_t*, wchar_t);
1927wchar_t atomic_exchange_explicit(volatile atomic_wchar_t*,
1928 wchar_t, memory_order);
1929wchar_t atomic_exchange_explicit(atomic_wchar_t*, wchar_t, memory_order);
1930bool atomic_compare_exchange_weak(volatile atomic_wchar_t*, wchar_t*, wchar_t);
1931bool atomic_compare_exchange_weak(atomic_wchar_t*, wchar_t*, wchar_t);
1932bool atomic_compare_exchange_strong(volatile atomic_wchar_t*, wchar_t*,
1933 wchar_t);
1934bool atomic_compare_exchange_strong(atomic_wchar_t*, wchar_t*, wchar_t);
1935bool atomic_compare_exchange_weak_explicit(volatile atomic_wchar_t*, wchar_t*,
1936 wchar_t, memory_order, memory_order);
1937bool atomic_compare_exchange_weak_explicit(atomic_wchar_t*, wchar_t*, wchar_t,
1938 memory_order, memory_order);
1939bool atomic_compare_exchange_strong_explicit(volatile atomic_wchar_t*, wchar_t*,
1940 wchar_t, memory_order,
1941 memory_order);
1942bool atomic_compare_exchange_strong_explicit(atomic_wchar_t*, wchar_t*, wchar_t,
1943 memory_order, memory_order);
1944wchar_t atomic_fetch_add(volatile atomic_wchar_t*, wchar_t);
1945wchar_t atomic_fetch_add(atomic_wchar_t*, wchar_t);
1946wchar_t atomic_fetch_add_explicit(volatile atomic_wchar_t*, wchar_t,
1947 memory_order);
1948wchar_t atomic_fetch_add_explicit(atomic_wchar_t*, wchar_t, memory_order);
1949wchar_t atomic_fetch_sub(volatile atomic_wchar_t*, wchar_t);
1950wchar_t atomic_fetch_sub(atomic_wchar_t*, wchar_t);
1951wchar_t atomic_fetch_sub_explicit(volatile atomic_wchar_t*, wchar_t,
1952 memory_order);
1953wchar_t atomic_fetch_sub_explicit(atomic_wchar_t*, wchar_t, memory_order);
1954wchar_t atomic_fetch_and(volatile atomic_wchar_t*, wchar_t);
1955wchar_t atomic_fetch_and(atomic_wchar_t*, wchar_t);
1956wchar_t atomic_fetch_and_explicit(volatile atomic_wchar_t*, wchar_t,
1957 memory_order);
1958wchar_t atomic_fetch_and_explicit(atomic_wchar_t*, wchar_t, memory_order);
1959wchar_t atomic_fetch_or(volatile atomic_wchar_t*, wchar_t);
1960wchar_t atomic_fetch_or(atomic_wchar_t*, wchar_t);
1961wchar_t atomic_fetch_or_explicit(volatile atomic_wchar_t*, wchar_t,
1962 memory_order);
1963wchar_t atomic_fetch_or_explicit(atomic_wchar_t*, wchar_t, memory_order);
1964wchar_t atomic_fetch_xor(volatile atomic_wchar_t*, wchar_t);
1965wchar_t atomic_fetch_xor(atomic_wchar_t*, wchar_t);
1966wchar_t atomic_fetch_xor_explicit(volatile atomic_wchar_t*, wchar_t,
1967 memory_order);
1968wchar_t atomic_fetch_xor_explicit(atomic_wchar_t*, wchar_t, memory_order);
1969
1970// Atomics for standard typedef types
1971
1972typedef atomic_schar atomic_int_least8_t;
1973typedef atomic_uchar atomic_uint_least8_t;
1974typedef atomic_short atomic_int_least16_t;
1975typedef atomic_ushort atomic_uint_least16_t;
1976typedef atomic_int atomic_int_least32_t;
1977typedef atomic_uint atomic_uint_least32_t;
1978typedef atomic_llong atomic_int_least64_t;
1979typedef atomic_ullong atomic_uint_least64_t;
1980
1981typedef atomic_schar atomic_int_fast8_t;
1982typedef atomic_uchar atomic_uint_fast8_t;
1983typedef atomic_short atomic_int_fast16_t;
1984typedef atomic_ushort atomic_uint_fast16_t;
1985typedef atomic_int atomic_int_fast32_t;
1986typedef atomic_uint atomic_uint_fast32_t;
1987typedef atomic_llong atomic_int_fast64_t;
1988typedef atomic_ullong atomic_uint_fast64_t;
1989
1990typedef atomic_long atomic_intptr_t;
1991typedef atomic_ulong atomic_uintptr_t;
1992typedef atomic_ulong atomic_size_t;
1993typedef atomic_long atomic_ptrdiff_t;
1994typedef atomic_llong atomic_intmax_t;
1995typedef atomic_ullong atomic_uintmax_t;
1996
1997// address types
1998
1999typedef struct atomic_address
2000{
2001 bool is_lock_free() const volatile;
2002 bool is_lock_free() const;
2003 void store(void*, memory_order = memory_order_seq_cst) volatile;
2004 void store(void*, memory_order = memory_order_seq_cst);
2005 void* load(memory_order = memory_order_seq_cst) const volatile;
2006 void* load(memory_order = memory_order_seq_cst) const;
2007 operator void*() const volatile;
2008 operator void*() const;
2009 void* exchange(void*, memory_order = memory_order_seq_cst) volatile;
2010 void* exchange(void*, memory_order = memory_order_seq_cst);
2011 bool compare_exchange_weak(void*&, void*, memory_order,
2012 memory_order) volatile;
2013 bool compare_exchange_weak(void*&, void*, memory_order, memory_order);
2014 bool compare_exchange_strong(void*&, void*, memory_order,
2015 memory_order) volatile;
2016 bool compare_exchange_strong(void*&, void*, memory_order, memory_order);
2017 bool compare_exchange_weak(void*&, void*,
2018 memory_order = memory_order_seq_cst) volatile;
2019 bool compare_exchange_weak(void*&, void*,
2020 memory_order = memory_order_seq_cst);
2021 bool compare_exchange_strong(void*&, void*,
2022 memory_order = memory_order_seq_cst) volatile;
2023 bool compare_exchange_strong(void*&, void*,
2024 memory_order = memory_order_seq_cst);
2025 bool compare_exchange_weak(const void*&, const void*,
2026 memory_order, memory_order) volatile;
2027 bool compare_exchange_weak(const void*&, const void*, memory_order,
2028 memory_order);
2029 bool compare_exchange_strong(const void*&, const void*, memory_order,
2030 memory_order) volatile;
2031 bool compare_exchange_strong(const void*&, const void*, memory_order,
2032 memory_order);
2033 bool compare_exchange_weak(const void*&, const void*,
2034 memory_order = memory_order_seq_cst) volatile;
2035 bool compare_exchange_weak(const void*&, const void*,
2036 memory_order = memory_order_seq_cst);
2037 bool compare_exchange_strong(const void*&, const void*,
2038 memory_order = memory_order_seq_cst) volatile;
2039 bool compare_exchange_strong(const void*&, const void*,
2040 memory_order = memory_order_seq_cst);
2041 void* fetch_add(ptrdiff_t, memory_order = memory_order_seq_cst) volatile;
2042 void* fetch_add(ptrdiff_t, memory_order = memory_order_seq_cst);
2043 void* fetch_sub(ptrdiff_t, memory_order = memory_order_seq_cst) volatile;
2044 void* fetch_sub(ptrdiff_t, memory_order = memory_order_seq_cst);
2045 atomic_address() = default;
2046 constexpr atomic_address(void*);
2047 atomic_address(const atomic_address&) = delete;
2048 atomic_address& operator=(const atomic_address&) = delete;
2049 atomic_address& operator=(const atomic_address&) volatile = delete;
2050 void* operator=(const void*) volatile;
2051 void* operator=(const void*);
2052 void* operator+=(ptrdiff_t) volatile;
2053 void* operator+=(ptrdiff_t);
2054 void* operator-=(ptrdiff_t) volatile;
2055 void* operator-=(ptrdiff_t);
2056} atomic_address;
2057
2058bool atomic_is_lock_free(const volatile atomic_address*);
2059bool atomic_is_lock_free(const atomic_address*);
2060void atomic_init(volatile atomic_address*, void*);
2061void atomic_init(atomic_address*, void*);
2062void atomic_store(volatile atomic_address*, void*);
2063void atomic_store(atomic_address*, void*);
2064void atomic_store_explicit(volatile atomic_address*, void*, memory_order);
2065void atomic_store_explicit(atomic_address*, void*, memory_order);
2066void* atomic_load(const volatile atomic_address*);
2067void* atomic_load(const atomic_address*);
2068void* atomic_load_explicit(const volatile atomic_address*, memory_order);
2069void* atomic_load_explicit(const atomic_address*, memory_order);
2070void* atomic_exchange(volatile atomic_address*, void*);
2071void* atomic_exchange(atomic_address*, void*);
2072void* atomic_exchange_explicit(volatile atomic_address*, void*, memory_order);
2073void* atomic_exchange_explicit(atomic_address*, void*, memory_order);
2074bool atomic_compare_exchange_weak(volatile atomic_address*, void**, void*);
2075bool atomic_compare_exchange_weak(atomic_address*, void**, void*);
2076bool atomic_compare_exchange_strong(volatile atomic_address*, void**, void*);
2077bool atomic_compare_exchange_strong(atomic_address*, void**, void*);
2078bool atomic_compare_exchange_weak_explicit(volatile atomic_address*, void**,
2079 void*, memory_order, memory_order);
2080bool atomic_compare_exchange_weak_explicit(atomic_address*, void**, void*,
2081 memory_order, memory_order);
2082bool atomic_compare_exchange_strong_explicit(volatile atomic_address*, void**,
2083 void*, memory_order, memory_order);
2084bool atomic_compare_exchange_strong_explicit(atomic_address*, void**, void*,
2085 memory_order, memory_order);
2086void* atomic_fetch_add(volatile atomic_address*, ptrdiff_t);
2087void* atomic_fetch_add(atomic_address*, ptrdiff_t);
2088void* atomic_fetch_add_explicit(volatile atomic_address*, ptrdiff_t,
2089 memory_order);
2090void* atomic_fetch_add_explicit(atomic_address*, ptrdiff_t, memory_order);
2091void* atomic_fetch_sub(volatile atomic_address*, ptrdiff_t);
2092void* atomic_fetch_sub(atomic_address*, ptrdiff_t);
2093void* atomic_fetch_sub_explicit(volatile atomic_address*, ptrdiff_t,
2094 memory_order);
2095void* atomic_fetch_sub_explicit(atomic_address*, ptrdiff_t, memory_order);
2096
2097// generic types
2098
2099template <class T>
2100struct atomic
2101{
2102 bool is_lock_free() const volatile;
2103 bool is_lock_free() const;
2104 void store(T, memory_order = memory_order_seq_cst) volatile;
2105 void store(T, memory_order = memory_order_seq_cst);
2106 T load(memory_order = memory_order_seq_cst) const volatile;
2107 T load(memory_order = memory_order_seq_cst) const;
2108 operator T() const volatile;
2109 operator T() const;
2110 T exchange(T, memory_order = memory_order_seq_cst) volatile;
2111 T exchange(T, memory_order = memory_order_seq_cst);
2112 bool compare_exchange_weak(T&, T, memory_order, memory_order) volatile;
2113 bool compare_exchange_weak(T&, T, memory_order, memory_order);
2114 bool compare_exchange_strong(T&, T, memory_order, memory_order) volatile;
2115 bool compare_exchange_strong(T&, T, memory_order, memory_order);
2116 bool compare_exchange_weak(T&, T,
2117 memory_order = memory_order_seq_cst) volatile;
2118 bool compare_exchange_weak(T&, T, memory_order = memory_order_seq_cst);
2119 bool compare_exchange_strong(T&, T,
2120 memory_order = memory_order_seq_cst) volatile;
2121 bool compare_exchange_strong(T&, T, memory_order = memory_order_seq_cst);
2122
2123 atomic() = default;
2124 constexpr atomic(T);
2125 atomic(const atomic&) = delete;
2126 atomic& operator=(const atomic&) = delete;
2127 atomic& operator=(const atomic&) volatile = delete;
2128 T operator=(T) volatile;
2129 T operator=(T);
2130};
2131
2132template <>
2133struct atomic<bool>
2134 : public atomic_bool
2135{
2136 atomic() = default;
2137 constexpr atomic(bool);
2138 atomic(const atomic&) = delete;
2139 atomic& operator=(const atomic&) = delete;
2140 atomic& operator=(const atomic&) volatile = delete;
2141 bool operator=(bool) volatile;
2142 bool operator=(bool);
2143 operator bool() const volatile;
2144 operator bool() const;
2145};
2146
2147template <>
2148struct atomic<char>
2149 : public atomic_char
2150{
2151 atomic() = default;
2152 constexpr atomic(char);
2153 atomic(const atomic&) = delete;
2154 atomic& operator=(const atomic&) = delete;
2155 atomic& operator=(const atomic&) volatile = delete;
2156 char operator=(char) volatile;
2157 char operator=(char);
2158 operator char() const volatile;
2159 operator char() const;
2160};
2161
2162template <>
2163struct atomic<signed char>
2164 : public atomic_schar
2165{
2166 atomic() = default;
2167 constexpr atomic(signed char);
2168 atomic(const atomic&) = delete;
2169 atomic& operator=(const atomic&) = delete;
2170 atomic& operator=(const atomic&) volatile = delete;
2171 signed char operator=(signed char) volatile;
2172 signed char operator=(signed char);
2173 operator signed char() const volatile;
2174 operator signed char() const;
2175};
2176
2177template <>
2178struct atomic<unsigned char>
2179 : public atomic_uchar
2180{
2181 atomic() = default;
2182 constexpr atomic(unsigned char);
2183 atomic(const atomic&) = delete;
2184 atomic& operator=(const atomic&) = delete;
2185 atomic& operator=(const atomic&) volatile = delete;
2186 unsigned char operator=(unsigned char) volatile;
2187 unsigned char operator=(unsigned char);
2188 operator unsigned char() const volatile;
2189 operator unsigned char() const;
2190};
2191
2192template <>
2193struct atomic<short>
2194 : public atomic_short
2195{
2196 atomic() = default;
2197 constexpr atomic(short);
2198 atomic(const atomic&) = delete;
2199 atomic& operator=(const atomic&) = delete;
2200 atomic& operator=(const atomic&) volatile = delete;
2201 short operator=(short) volatile;
2202 short operator=(short);
2203 operator short() const volatile;
2204 operator short() const;
2205};
2206
2207template <>
2208struct atomic<unsigned short>
2209 : public atomic_ushort
2210{
2211 atomic() = default;
2212 constexpr atomic(unsigned short);
2213 atomic(const atomic&) = delete;
2214 atomic& operator=(const atomic&) = delete;
2215 atomic& operator=(const atomic&) volatile = delete;
2216 unsigned short operator=(unsigned short) volatile;
2217 unsigned short operator=(unsigned short);
2218 operator unsigned short() const volatile;
2219 operator unsigned short() const;
2220};
2221
2222template <>
2223struct atomic<int>
2224 : public atomic_int
2225{
2226 atomic() = default;
2227 constexpr atomic(int);
2228 atomic(const atomic&) = delete;
2229 atomic& operator=(const atomic&) = delete;
2230 atomic& operator=(const atomic&) volatile = delete;
2231 int operator=(int) volatile;
2232 int operator=(int);
2233 operator int() const volatile;
2234 operator int() const;
2235};
2236
2237template <>
2238struct atomic<unsigned int>
2239 : public atomic_uint
2240{
2241 atomic() = default;
2242 constexpr atomic(unsigned int);
2243 atomic(const atomic&) = delete;
2244 atomic& operator=(const atomic&) = delete;
2245 atomic& operator=(const atomic&) volatile = delete;
2246 unsigned int operator=(unsigned int) volatile;
2247 unsigned int operator=(unsigned int);
2248 operator unsigned int() const volatile;
2249 operator unsigned int() const;
2250};
2251
2252template <>
2253struct atomic<long>
2254 : public atomic_long
2255{
2256 atomic() = default;
2257 constexpr atomic(long);
2258 atomic(const atomic&) = delete;
2259 atomic& operator=(const atomic&) = delete;
2260 atomic& operator=(const atomic&) volatile = delete;
2261 long operator=(long) volatile;
2262 long operator=(long);
2263 operator long() const volatile;
2264 operator long() const;
2265};
2266
2267template <>
2268struct atomic<unsigned long>
2269 : public atomic_ulong
2270{
2271 atomic() = default;
2272 constexpr atomic(unsigned long);
2273 atomic(const atomic&) = delete;
2274 atomic& operator=(const atomic&) = delete;
2275 atomic& operator=(const atomic&) volatile = delete;
2276 unsigned long operator=(unsigned long) volatile;
2277 unsigned long operator=(unsigned long);
2278 operator unsigned long() const volatile;
2279 operator unsigned long() const;
2280};
2281
2282template <>
2283struct atomic<long long>
2284 : public atomic_llong
2285{
2286 atomic() = default;
2287 constexpr atomic(long long);
2288 atomic(const atomic&) = delete;
2289 atomic& operator=(const atomic&) = delete;
2290 atomic& operator=(const atomic&) volatile = delete;
2291 long long operator=(long long) volatile;
2292 long long operator=(long long);
2293 operator long long() const volatile;
2294 operator long long() const;
2295};
2296
2297template <>
2298struct atomic<unsigned long long>
2299 : public atomic_ullong
2300{
2301 atomic() = default;
2302 constexpr atomic(unsigned long long);
2303 atomic(const atomic&) = delete;
2304 atomic& operator=(const atomic&) = delete;
2305 atomic& operator=(const atomic&) volatile = delete;
2306 unsigned long long operator=(unsigned long long) volatile;
2307 unsigned long long operator=(unsigned long long);
2308 operator unsigned long long() const volatile;
2309 operator unsigned long long() const;
2310};
2311
2312template <>
2313struct atomic<char16_t>
2314 : public atomic_char16_t
2315{
2316 atomic() = default;
2317 constexpr atomic(char16_t);
2318 atomic(const atomic&) = delete;
2319 atomic& operator=(const atomic&) = delete;
2320 atomic& operator=(const atomic&) volatile = delete;
2321 char16_t operator=(char16_t) volatile;
2322 char16_t operator=(char16_t);
2323 operator char16_t() const volatile;
2324 operator char16_t() const;
2325};
2326
2327template <>
2328struct atomic<char32_t>
2329 : public atomic_char32_t
2330{
2331 atomic() = default;
2332 constexpr atomic(char32_t);
2333 atomic(const atomic&) = delete;
2334 atomic& operator=(const atomic&) = delete;
2335 atomic& operator=(const atomic&) volatile = delete;
2336 char32_t operator=(char32_t) volatile;
2337 char32_t operator=(char32_t);
2338 operator char32_t() const volatile;
2339 operator char32_t() const;
2340};
2341
2342template <>
2343struct atomic<wchar_t>
2344 : public atomic_wchar_t
2345{
2346 atomic() = default;
2347 constexpr atomic(wchar_t);
2348 atomic(const atomic&) = delete;
2349 atomic& operator=(const atomic&) = delete;
2350 atomic& operator=(const atomic&) volatile = delete;
2351 wchar_t operator=(wchar_t) volatile;
2352 wchar_t operator=(wchar_t);
2353 operator wchar_t() const volatile;
2354 operator wchar_t() const;
2355};
2356
2357template <class T>
2358struct atomic<T*>
2359 : public atomic_address
2360{
2361 void store(T*, memory_order = memory_order_seq_cst) volatile;
2362 void store(T*, memory_order = memory_order_seq_cst);
2363 T* load(memory_order = memory_order_seq_cst) const volatile;
2364 T* load(memory_order = memory_order_seq_cst) const;
2365 operator T*() const volatile;
2366 operator T*() const;
2367 T* exchange(T*, memory_order = memory_order_seq_cst) volatile;
2368 T* exchange(T*, memory_order = memory_order_seq_cst);
2369 bool compare_exchange_weak(T*&, T*, memory_order, memory_order) volatile;
2370 bool compare_exchange_weak(T*&, T*, memory_order, memory_order);
2371 bool compare_exchange_strong(T*&, T*, memory_order, memory_order) volatile;
2372 bool compare_exchange_strong(T*&, T*, memory_order, memory_order);
2373 bool compare_exchange_weak(T*&, T*,
2374 memory_order = memory_order_seq_cst) volatile;
2375 bool compare_exchange_weak(T*&, T*, memory_order = memory_order_seq_cst);
2376 bool compare_exchange_strong(T*&, T*,
2377 memory_order = memory_order_seq_cst) volatile;
2378 bool compare_exchange_strong(T*&, T*, memory_order = memory_order_seq_cst);
2379 T* fetch_add(ptrdiff_t, memory_order = memory_order_seq_cst) volatile;
2380 T* fetch_add(ptrdiff_t, memory_order = memory_order_seq_cst);
2381 T* fetch_sub(ptrdiff_t, memory_order = memory_order_seq_cst) volatile;
2382 T* fetch_sub(ptrdiff_t, memory_order = memory_order_seq_cst);
2383 atomic() = default;
2384 constexpr atomic(T*);
2385 atomic(const atomic&) = delete;
2386 atomic& operator=(const atomic&) = delete;
2387 atomic& operator=(const atomic&) volatile = delete;
2388 T* operator=(T*) volatile;
2389 T* operator=(T*);
2390 T* operator++(int) volatile;
2391 T* operator++(int);
2392 T* operator--(int) volatile;
2393 T* operator--(int);
2394 T* operator++() volatile;
2395 T* operator++();
2396 T* operator--() volatile;
2397 T* operator--();
2398 T* operator+=(ptrdiff_t) volatile;
2399 T* operator+=(ptrdiff_t);
2400 T* operator-=(ptrdiff_t) volatile;
2401 T* operator-=(ptrdiff_t);
2402};
2403
2404// fences
2405
2406void atomic_thread_fence(memory_order);
2407void atomic_signal_fence(memory_order);
2408
2409} // std
2410
2411*/
2412
2413#include <__config>
Howard Hinnant611fdaf2010-10-04 18:52:54 +00002414#include <__mutex_base>
2415#include <cstring>
Howard Hinnant8f73c632010-09-27 21:17:38 +00002416
2417#pragma GCC system_header
2418
2419_LIBCPP_BEGIN_NAMESPACE_STD
2420
Howard Hinnantd1176e22010-09-28 17:13:38 +00002421typedef enum memory_order
2422{
2423 memory_order_relaxed, memory_order_consume, memory_order_acquire,
2424 memory_order_release, memory_order_acq_rel, memory_order_seq_cst
2425} memory_order;
2426
2427template <class _Tp>
2428inline _LIBCPP_INLINE_VISIBILITY
2429_Tp
2430kill_dependency(_Tp __y)
2431{
2432 return __y;
2433}
Howard Hinnant8f73c632010-09-27 21:17:38 +00002434
Howard Hinnant611fdaf2010-10-04 18:52:54 +00002435_LIBCPP_VISIBLE
2436mutex& __not_atomic_mut();
2437
2438// load
2439
2440template <class _Tp>
2441_Tp
Howard Hinnant002f1d32010-10-04 23:55:35 +00002442__load_seq_cst(_Tp const volatile* __obj)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00002443{
2444 unique_lock<mutex> _(__not_atomic_mut());
2445 return *__obj;
2446}
2447
2448// load bool
2449
2450inline _LIBCPP_INLINE_VISIBILITY
2451bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00002452__choose_load_seq_cst(bool const volatile* __obj)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00002453{
2454#if __has_feature(__atomic_load_seq_cst_b)
2455 return __atomic_load_seq_cst(__obj);
2456#else
2457 return __load_seq_cst(__obj);
2458#endif
2459}
2460
2461inline _LIBCPP_INLINE_VISIBILITY
2462bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00002463__choose_load_acquire(bool const volatile* __obj)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00002464{
2465#if __has_feature(__atomic_load_acquire_b)
2466 return __atomic_load_acquire(__obj);
2467#else
2468 return __choose_load_seq_cst(__obj);
2469#endif
2470}
2471
2472inline _LIBCPP_INLINE_VISIBILITY
2473bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00002474__choose_load_consume(bool const volatile* __obj)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00002475{
2476#if __has_feature(__atomic_load_consume_b)
2477 return __atomic_load_consume(__obj);
2478#else
2479 return __choose_load_acquire(__obj);
2480#endif
2481}
2482
2483inline _LIBCPP_INLINE_VISIBILITY
2484bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00002485__choose_load_relaxed(bool const volatile* __obj)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00002486{
2487#if __has_feature(__atomic_load_relaxed_b)
2488 return __atomic_load_relaxed(__obj);
2489#else
2490 return __choose_load_consume(__obj);
2491#endif
2492}
2493
Howard Hinnant002f1d32010-10-04 23:55:35 +00002494// load char
2495
2496inline _LIBCPP_INLINE_VISIBILITY
2497char
2498__choose_load_seq_cst(char const volatile* __obj)
2499{
2500#if __has_feature(__atomic_load_seq_cst_c)
2501 return __atomic_load_seq_cst(__obj);
2502#else
2503 return __load_seq_cst(__obj);
2504#endif
2505}
2506
2507inline _LIBCPP_INLINE_VISIBILITY
2508char
2509__choose_load_acquire(char const volatile* __obj)
2510{
2511#if __has_feature(__atomic_load_acquire_c)
2512 return __atomic_load_acquire(__obj);
2513#else
2514 return __choose_load_seq_cst(__obj);
2515#endif
2516}
2517
2518inline _LIBCPP_INLINE_VISIBILITY
2519char
2520__choose_load_consume(char const volatile* __obj)
2521{
2522#if __has_feature(__atomic_load_consume_c)
2523 return __atomic_load_consume(__obj);
2524#else
2525 return __choose_load_acquire(__obj);
2526#endif
2527}
2528
2529inline _LIBCPP_INLINE_VISIBILITY
2530char
2531__choose_load_relaxed(char const volatile* __obj)
2532{
2533#if __has_feature(__atomic_load_relaxed_c)
2534 return __atomic_load_relaxed(__obj);
2535#else
2536 return __choose_load_consume(__obj);
2537#endif
2538}
2539
2540// load signed char
2541
2542inline _LIBCPP_INLINE_VISIBILITY
2543signed char
2544__choose_load_seq_cst(signed char const volatile* __obj)
2545{
2546#if __has_feature(__atomic_load_seq_cst_a)
2547 return __atomic_load_seq_cst(__obj);
2548#else
2549 return __load_seq_cst(__obj);
2550#endif
2551}
2552
2553inline _LIBCPP_INLINE_VISIBILITY
2554signed char
2555__choose_load_acquire(signed char const volatile* __obj)
2556{
2557#if __has_feature(__atomic_load_acquire_a)
2558 return __atomic_load_acquire(__obj);
2559#else
2560 return __choose_load_seq_cst(__obj);
2561#endif
2562}
2563
2564inline _LIBCPP_INLINE_VISIBILITY
2565signed char
2566__choose_load_consume(signed char const volatile* __obj)
2567{
2568#if __has_feature(__atomic_load_consume_a)
2569 return __atomic_load_consume(__obj);
2570#else
2571 return __choose_load_acquire(__obj);
2572#endif
2573}
2574
2575inline _LIBCPP_INLINE_VISIBILITY
2576signed char
2577__choose_load_relaxed(signed char const volatile* __obj)
2578{
2579#if __has_feature(__atomic_load_relaxed_a)
2580 return __atomic_load_relaxed(__obj);
2581#else
2582 return __choose_load_consume(__obj);
2583#endif
2584}
2585
2586// load unsigned char
2587
2588inline _LIBCPP_INLINE_VISIBILITY
2589unsigned char
2590__choose_load_seq_cst(unsigned char const volatile* __obj)
2591{
2592#if __has_feature(__atomic_load_seq_cst_h)
2593 return __atomic_load_seq_cst(__obj);
2594#else
2595 return __load_seq_cst(__obj);
2596#endif
2597}
2598
2599inline _LIBCPP_INLINE_VISIBILITY
2600unsigned char
2601__choose_load_acquire(unsigned char const volatile* __obj)
2602{
2603#if __has_feature(__atomic_load_acquire_h)
2604 return __atomic_load_acquire(__obj);
2605#else
2606 return __choose_load_seq_cst(__obj);
2607#endif
2608}
2609
2610inline _LIBCPP_INLINE_VISIBILITY
2611unsigned char
2612__choose_load_consume(unsigned char const volatile* __obj)
2613{
2614#if __has_feature(__atomic_load_consume_h)
2615 return __atomic_load_consume(__obj);
2616#else
2617 return __choose_load_acquire(__obj);
2618#endif
2619}
2620
2621inline _LIBCPP_INLINE_VISIBILITY
2622unsigned char
2623__choose_load_relaxed(unsigned char const volatile* __obj)
2624{
2625#if __has_feature(__atomic_load_relaxed_h)
2626 return __atomic_load_relaxed(__obj);
2627#else
2628 return __choose_load_consume(__obj);
2629#endif
2630}
2631
2632#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
2633
2634// load char16_t
2635
2636inline _LIBCPP_INLINE_VISIBILITY
2637char16_t
2638__choose_load_seq_cst(char16_t const volatile* __obj)
2639{
2640#if __has_feature(__atomic_load_seq_cst_Ds)
2641 return __atomic_load_seq_cst(__obj);
2642#else
2643 return __load_seq_cst(__obj);
2644#endif
2645}
2646
2647inline _LIBCPP_INLINE_VISIBILITY
2648char16_t
2649__choose_load_acquire(char16_t const volatile* __obj)
2650{
2651#if __has_feature(__atomic_load_acquire_Ds)
2652 return __atomic_load_acquire(__obj);
2653#else
2654 return __choose_load_seq_cst(__obj);
2655#endif
2656}
2657
2658inline _LIBCPP_INLINE_VISIBILITY
2659char16_t
2660__choose_load_consume(char16_t const volatile* __obj)
2661{
2662#if __has_feature(__atomic_load_consume_Ds)
2663 return __atomic_load_consume(__obj);
2664#else
2665 return __choose_load_acquire(__obj);
2666#endif
2667}
2668
2669inline _LIBCPP_INLINE_VISIBILITY
2670char16_t
2671__choose_load_relaxed(char16_t const volatile* __obj)
2672{
2673#if __has_feature(__atomic_load_relaxed_Ds)
2674 return __atomic_load_relaxed(__obj);
2675#else
2676 return __choose_load_consume(__obj);
2677#endif
2678}
2679
2680// load char32_t
2681
2682inline _LIBCPP_INLINE_VISIBILITY
2683char32_t
2684__choose_load_seq_cst(char32_t const volatile* __obj)
2685{
2686#if __has_feature(__atomic_load_seq_cst_Di)
2687 return __atomic_load_seq_cst(__obj);
2688#else
2689 return __load_seq_cst(__obj);
2690#endif
2691}
2692
2693inline _LIBCPP_INLINE_VISIBILITY
2694char32_t
2695__choose_load_acquire(char32_t const volatile* __obj)
2696{
2697#if __has_feature(__atomic_load_acquire_Di)
2698 return __atomic_load_acquire(__obj);
2699#else
2700 return __choose_load_seq_cst(__obj);
2701#endif
2702}
2703
2704inline _LIBCPP_INLINE_VISIBILITY
2705char32_t
2706__choose_load_consume(char32_t const volatile* __obj)
2707{
2708#if __has_feature(__atomic_load_consume_Di)
2709 return __atomic_load_consume(__obj);
2710#else
2711 return __choose_load_acquire(__obj);
2712#endif
2713}
2714
2715inline _LIBCPP_INLINE_VISIBILITY
2716char32_t
2717__choose_load_relaxed(char32_t const volatile* __obj)
2718{
2719#if __has_feature(__atomic_load_relaxed_Di)
2720 return __atomic_load_relaxed(__obj);
2721#else
2722 return __choose_load_consume(__obj);
2723#endif
2724}
2725
2726#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
2727
2728// load wchar_t
2729
2730inline _LIBCPP_INLINE_VISIBILITY
2731wchar_t
2732__choose_load_seq_cst(wchar_t const volatile* __obj)
2733{
2734#if __has_feature(__atomic_load_seq_cst_w)
2735 return __atomic_load_seq_cst(__obj);
2736#else
2737 return __load_seq_cst(__obj);
2738#endif
2739}
2740
2741inline _LIBCPP_INLINE_VISIBILITY
2742wchar_t
2743__choose_load_acquire(wchar_t const volatile* __obj)
2744{
2745#if __has_feature(__atomic_load_acquire_w)
2746 return __atomic_load_acquire(__obj);
2747#else
2748 return __choose_load_seq_cst(__obj);
2749#endif
2750}
2751
2752inline _LIBCPP_INLINE_VISIBILITY
2753wchar_t
2754__choose_load_consume(wchar_t const volatile* __obj)
2755{
2756#if __has_feature(__atomic_load_consume_w)
2757 return __atomic_load_consume(__obj);
2758#else
2759 return __choose_load_acquire(__obj);
2760#endif
2761}
2762
2763inline _LIBCPP_INLINE_VISIBILITY
2764wchar_t
2765__choose_load_relaxed(wchar_t const volatile* __obj)
2766{
2767#if __has_feature(__atomic_load_relaxed_w)
2768 return __atomic_load_relaxed(__obj);
2769#else
2770 return __choose_load_consume(__obj);
2771#endif
2772}
2773
2774// load short
2775
2776inline _LIBCPP_INLINE_VISIBILITY
2777short
2778__choose_load_seq_cst(short const volatile* __obj)
2779{
2780#if __has_feature(__atomic_load_seq_cst_s)
2781 return __atomic_load_seq_cst(__obj);
2782#else
2783 return __load_seq_cst(__obj);
2784#endif
2785}
2786
2787inline _LIBCPP_INLINE_VISIBILITY
2788short
2789__choose_load_acquire(short const volatile* __obj)
2790{
2791#if __has_feature(__atomic_load_acquire_s)
2792 return __atomic_load_acquire(__obj);
2793#else
2794 return __choose_load_seq_cst(__obj);
2795#endif
2796}
2797
2798inline _LIBCPP_INLINE_VISIBILITY
2799short
2800__choose_load_consume(short const volatile* __obj)
2801{
2802#if __has_feature(__atomic_load_consume_s)
2803 return __atomic_load_consume(__obj);
2804#else
2805 return __choose_load_acquire(__obj);
2806#endif
2807}
2808
2809inline _LIBCPP_INLINE_VISIBILITY
2810short
2811__choose_load_relaxed(short const volatile* __obj)
2812{
2813#if __has_feature(__atomic_load_relaxed_s)
2814 return __atomic_load_relaxed(__obj);
2815#else
2816 return __choose_load_consume(__obj);
2817#endif
2818}
2819
2820// load unsigned short
2821
2822inline _LIBCPP_INLINE_VISIBILITY
2823unsigned short
2824__choose_load_seq_cst(unsigned short const volatile* __obj)
2825{
2826#if __has_feature(__atomic_load_seq_cst_t)
2827 return __atomic_load_seq_cst(__obj);
2828#else
2829 return __load_seq_cst(__obj);
2830#endif
2831}
2832
2833inline _LIBCPP_INLINE_VISIBILITY
2834unsigned short
2835__choose_load_acquire(unsigned short const volatile* __obj)
2836{
2837#if __has_feature(__atomic_load_acquire_t)
2838 return __atomic_load_acquire(__obj);
2839#else
2840 return __choose_load_seq_cst(__obj);
2841#endif
2842}
2843
2844inline _LIBCPP_INLINE_VISIBILITY
2845unsigned short
2846__choose_load_consume(unsigned short const volatile* __obj)
2847{
2848#if __has_feature(__atomic_load_consume_t)
2849 return __atomic_load_consume(__obj);
2850#else
2851 return __choose_load_acquire(__obj);
2852#endif
2853}
2854
2855inline _LIBCPP_INLINE_VISIBILITY
2856unsigned short
2857__choose_load_relaxed(unsigned short const volatile* __obj)
2858{
2859#if __has_feature(__atomic_load_relaxed_t)
2860 return __atomic_load_relaxed(__obj);
2861#else
2862 return __choose_load_consume(__obj);
2863#endif
2864}
2865
2866// load int
2867
2868inline _LIBCPP_INLINE_VISIBILITY
2869int
2870__choose_load_seq_cst(int const volatile* __obj)
2871{
2872#if __has_feature(__atomic_load_seq_cst_i)
2873 return __atomic_load_seq_cst(__obj);
2874#else
2875 return __load_seq_cst(__obj);
2876#endif
2877}
2878
2879inline _LIBCPP_INLINE_VISIBILITY
2880int
2881__choose_load_acquire(int const volatile* __obj)
2882{
2883#if __has_feature(__atomic_load_acquire_i)
2884 return __atomic_load_acquire(__obj);
2885#else
2886 return __choose_load_seq_cst(__obj);
2887#endif
2888}
2889
2890inline _LIBCPP_INLINE_VISIBILITY
2891int
2892__choose_load_consume(int const volatile* __obj)
2893{
2894#if __has_feature(__atomic_load_consume_i)
2895 return __atomic_load_consume(__obj);
2896#else
2897 return __choose_load_acquire(__obj);
2898#endif
2899}
2900
2901inline _LIBCPP_INLINE_VISIBILITY
2902int
2903__choose_load_relaxed(int const volatile* __obj)
2904{
2905#if __has_feature(__atomic_load_relaxed_i)
2906 return __atomic_load_relaxed(__obj);
2907#else
2908 return __choose_load_consume(__obj);
2909#endif
2910}
2911
2912// load unsigned int
2913
2914inline _LIBCPP_INLINE_VISIBILITY
2915unsigned int
2916__choose_load_seq_cst(unsigned int const volatile* __obj)
2917{
2918#if __has_feature(__atomic_load_seq_cst_j)
2919 return __atomic_load_seq_cst(__obj);
2920#else
2921 return __load_seq_cst(__obj);
2922#endif
2923}
2924
2925inline _LIBCPP_INLINE_VISIBILITY
2926unsigned int
2927__choose_load_acquire(unsigned int const volatile* __obj)
2928{
2929#if __has_feature(__atomic_load_acquire_j)
2930 return __atomic_load_acquire(__obj);
2931#else
2932 return __choose_load_seq_cst(__obj);
2933#endif
2934}
2935
2936inline _LIBCPP_INLINE_VISIBILITY
2937unsigned int
2938__choose_load_consume(unsigned int const volatile* __obj)
2939{
2940#if __has_feature(__atomic_load_consume_j)
2941 return __atomic_load_consume(__obj);
2942#else
2943 return __choose_load_acquire(__obj);
2944#endif
2945}
2946
2947inline _LIBCPP_INLINE_VISIBILITY
2948unsigned int
2949__choose_load_relaxed(unsigned int const volatile* __obj)
2950{
2951#if __has_feature(__atomic_load_relaxed_j)
2952 return __atomic_load_relaxed(__obj);
2953#else
2954 return __choose_load_consume(__obj);
2955#endif
2956}
2957
2958// load long
2959
2960inline _LIBCPP_INLINE_VISIBILITY
2961long
2962__choose_load_seq_cst(long const volatile* __obj)
2963{
2964#if __has_feature(__atomic_load_seq_cst_l)
2965 return __atomic_load_seq_cst(__obj);
2966#else
2967 return __load_seq_cst(__obj);
2968#endif
2969}
2970
2971inline _LIBCPP_INLINE_VISIBILITY
2972long
2973__choose_load_acquire(long const volatile* __obj)
2974{
2975#if __has_feature(__atomic_load_acquire_l)
2976 return __atomic_load_acquire(__obj);
2977#else
2978 return __choose_load_seq_cst(__obj);
2979#endif
2980}
2981
2982inline _LIBCPP_INLINE_VISIBILITY
2983long
2984__choose_load_consume(long const volatile* __obj)
2985{
2986#if __has_feature(__atomic_load_consume_l)
2987 return __atomic_load_consume(__obj);
2988#else
2989 return __choose_load_acquire(__obj);
2990#endif
2991}
2992
2993inline _LIBCPP_INLINE_VISIBILITY
2994long
2995__choose_load_relaxed(long const volatile* __obj)
2996{
2997#if __has_feature(__atomic_load_relaxed_l)
2998 return __atomic_load_relaxed(__obj);
2999#else
3000 return __choose_load_consume(__obj);
3001#endif
3002}
3003
3004// load unsigned long
3005
3006inline _LIBCPP_INLINE_VISIBILITY
3007unsigned long
3008__choose_load_seq_cst(unsigned long const volatile* __obj)
3009{
3010#if __has_feature(__atomic_load_seq_cst_m)
3011 return __atomic_load_seq_cst(__obj);
3012#else
3013 return __load_seq_cst(__obj);
3014#endif
3015}
3016
3017inline _LIBCPP_INLINE_VISIBILITY
3018unsigned long
3019__choose_load_acquire(unsigned long const volatile* __obj)
3020{
3021#if __has_feature(__atomic_load_acquire_m)
3022 return __atomic_load_acquire(__obj);
3023#else
3024 return __choose_load_seq_cst(__obj);
3025#endif
3026}
3027
3028inline _LIBCPP_INLINE_VISIBILITY
3029unsigned long
3030__choose_load_consume(unsigned long const volatile* __obj)
3031{
3032#if __has_feature(__atomic_load_consume_m)
3033 return __atomic_load_consume(__obj);
3034#else
3035 return __choose_load_acquire(__obj);
3036#endif
3037}
3038
3039inline _LIBCPP_INLINE_VISIBILITY
3040unsigned long
3041__choose_load_relaxed(unsigned long const volatile* __obj)
3042{
3043#if __has_feature(__atomic_load_relaxed_m)
3044 return __atomic_load_relaxed(__obj);
3045#else
3046 return __choose_load_consume(__obj);
3047#endif
3048}
3049
3050// load long long
3051
3052inline _LIBCPP_INLINE_VISIBILITY
3053long long
3054__choose_load_seq_cst(long long const volatile* __obj)
3055{
3056#if __has_feature(__atomic_load_seq_cst_x)
3057 return __atomic_load_seq_cst(__obj);
3058#else
3059 return __load_seq_cst(__obj);
3060#endif
3061}
3062
3063inline _LIBCPP_INLINE_VISIBILITY
3064long long
3065__choose_load_acquire(long long const volatile* __obj)
3066{
3067#if __has_feature(__atomic_load_acquire_x)
3068 return __atomic_load_acquire(__obj);
3069#else
3070 return __choose_load_seq_cst(__obj);
3071#endif
3072}
3073
3074inline _LIBCPP_INLINE_VISIBILITY
3075long long
3076__choose_load_consume(long long const volatile* __obj)
3077{
3078#if __has_feature(__atomic_load_consume_x)
3079 return __atomic_load_consume(__obj);
3080#else
3081 return __choose_load_acquire(__obj);
3082#endif
3083}
3084
3085inline _LIBCPP_INLINE_VISIBILITY
3086long long
3087__choose_load_relaxed(long long const volatile* __obj)
3088{
3089#if __has_feature(__atomic_load_relaxed_x)
3090 return __atomic_load_relaxed(__obj);
3091#else
3092 return __choose_load_consume(__obj);
3093#endif
3094}
3095
3096// load unsigned long long
3097
3098inline _LIBCPP_INLINE_VISIBILITY
3099unsigned long long
3100__choose_load_seq_cst(unsigned long long const volatile* __obj)
3101{
3102#if __has_feature(__atomic_load_seq_cst_y)
3103 return __atomic_load_seq_cst(__obj);
3104#else
3105 return __load_seq_cst(__obj);
3106#endif
3107}
3108
3109inline _LIBCPP_INLINE_VISIBILITY
3110unsigned long long
3111__choose_load_acquire(unsigned long long const volatile* __obj)
3112{
3113#if __has_feature(__atomic_load_acquire_y)
3114 return __atomic_load_acquire(__obj);
3115#else
3116 return __choose_load_seq_cst(__obj);
3117#endif
3118}
3119
3120inline _LIBCPP_INLINE_VISIBILITY
3121unsigned long long
3122__choose_load_consume(unsigned long long const volatile* __obj)
3123{
3124#if __has_feature(__atomic_load_consume_y)
3125 return __atomic_load_consume(__obj);
3126#else
3127 return __choose_load_acquire(__obj);
3128#endif
3129}
3130
3131inline _LIBCPP_INLINE_VISIBILITY
3132unsigned long long
3133__choose_load_relaxed(unsigned long long const volatile* __obj)
3134{
3135#if __has_feature(__atomic_load_relaxed_y)
3136 return __atomic_load_relaxed(__obj);
3137#else
3138 return __choose_load_consume(__obj);
3139#endif
3140}
3141
3142// load void*
3143
3144inline _LIBCPP_INLINE_VISIBILITY
3145void*
3146__choose_load_seq_cst(void* const volatile* __obj)
3147{
3148#if __has_feature(__atomic_load_seq_cst_Py)
3149 return __atomic_load_seq_cst(__obj);
3150#else
3151 return __load_seq_cst(__obj);
3152#endif
3153}
3154
3155inline _LIBCPP_INLINE_VISIBILITY
3156void*
3157__choose_load_acquire(void* const volatile* __obj)
3158{
3159#if __has_feature(__atomic_load_acquire_Py)
3160 return __atomic_load_acquire(__obj);
3161#else
3162 return __choose_load_seq_cst(__obj);
3163#endif
3164}
3165
3166inline _LIBCPP_INLINE_VISIBILITY
3167void*
3168__choose_load_consume(void* const volatile* __obj)
3169{
3170#if __has_feature(__atomic_load_consume_Py)
3171 return __atomic_load_consume(__obj);
3172#else
3173 return __choose_load_acquire(__obj);
3174#endif
3175}
3176
3177inline _LIBCPP_INLINE_VISIBILITY
3178void*
3179__choose_load_relaxed(void* const volatile* __obj)
3180{
3181#if __has_feature(__atomic_load_relaxed_Py)
3182 return __atomic_load_relaxed(__obj);
3183#else
3184 return __choose_load_consume(__obj);
3185#endif
3186}
3187
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003188// store
3189
3190template <class _Tp>
3191void
Howard Hinnant002f1d32010-10-04 23:55:35 +00003192__store_seq_cst(_Tp volatile* __obj, _Tp __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003193{
3194 unique_lock<mutex> _(__not_atomic_mut());
3195 *__obj = __desr;
3196}
3197
3198// store bool
3199
3200inline _LIBCPP_INLINE_VISIBILITY
3201void
Howard Hinnant002f1d32010-10-04 23:55:35 +00003202__choose_store_seq_cst(bool volatile* __obj, bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003203{
3204#if __has_feature(__atomic_store_seq_cst_b)
3205 __atomic_store_seq_cst(__obj, __desr);
3206#else
3207 __store_seq_cst(__obj, __desr);
3208#endif
3209}
3210
3211inline _LIBCPP_INLINE_VISIBILITY
3212void
Howard Hinnant002f1d32010-10-04 23:55:35 +00003213__choose_store_release(bool volatile* __obj, bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003214{
3215#if __has_feature(__atomic_store_release_b)
3216 __atomic_store_release(__obj, __desr);
3217#else
3218 __choose_store_seq_cst(__obj, __desr);
3219#endif
3220}
3221
3222inline _LIBCPP_INLINE_VISIBILITY
3223void
Howard Hinnant002f1d32010-10-04 23:55:35 +00003224__choose_store_relaxed(bool volatile* __obj, bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003225{
3226#if __has_feature(__atomic_store_relaxed_b)
3227 __atomic_store_relaxed(__obj, __desr);
3228#else
3229 __choose_store_release(__obj, __desr);
3230#endif
3231}
3232
Howard Hinnant002f1d32010-10-04 23:55:35 +00003233// store char
3234
3235inline _LIBCPP_INLINE_VISIBILITY
3236void
3237__choose_store_seq_cst(char volatile* __obj, char __desr)
3238{
3239#if __has_feature(__atomic_store_seq_cst_c)
3240 __atomic_store_seq_cst(__obj, __desr);
3241#else
3242 __store_seq_cst(__obj, __desr);
3243#endif
3244}
3245
3246inline _LIBCPP_INLINE_VISIBILITY
3247void
3248__choose_store_release(char volatile* __obj, char __desr)
3249{
3250#if __has_feature(__atomic_store_release_c)
3251 __atomic_store_release(__obj, __desr);
3252#else
3253 __choose_store_seq_cst(__obj, __desr);
3254#endif
3255}
3256
3257inline _LIBCPP_INLINE_VISIBILITY
3258void
3259__choose_store_relaxed(char volatile* __obj, char __desr)
3260{
3261#if __has_feature(__atomic_store_relaxed_c)
3262 __atomic_store_relaxed(__obj, __desr);
3263#else
3264 __choose_store_release(__obj, __desr);
3265#endif
3266}
3267
3268// store signed char
3269
3270inline _LIBCPP_INLINE_VISIBILITY
3271void
3272__choose_store_seq_cst(signed char volatile* __obj, signed char __desr)
3273{
3274#if __has_feature(__atomic_store_seq_cst_a)
3275 __atomic_store_seq_cst(__obj, __desr);
3276#else
3277 __store_seq_cst(__obj, __desr);
3278#endif
3279}
3280
3281inline _LIBCPP_INLINE_VISIBILITY
3282void
3283__choose_store_release(signed char volatile* __obj, signed char __desr)
3284{
3285#if __has_feature(__atomic_store_release_a)
3286 __atomic_store_release(__obj, __desr);
3287#else
3288 __choose_store_seq_cst(__obj, __desr);
3289#endif
3290}
3291
3292inline _LIBCPP_INLINE_VISIBILITY
3293void
3294__choose_store_relaxed(signed char volatile* __obj, signed char __desr)
3295{
3296#if __has_feature(__atomic_store_relaxed_a)
3297 __atomic_store_relaxed(__obj, __desr);
3298#else
3299 __choose_store_release(__obj, __desr);
3300#endif
3301}
3302
3303// store unsigned char
3304
3305inline _LIBCPP_INLINE_VISIBILITY
3306void
3307__choose_store_seq_cst(unsigned char volatile* __obj, unsigned char __desr)
3308{
3309#if __has_feature(__atomic_store_seq_cst_h)
3310 __atomic_store_seq_cst(__obj, __desr);
3311#else
3312 __store_seq_cst(__obj, __desr);
3313#endif
3314}
3315
3316inline _LIBCPP_INLINE_VISIBILITY
3317void
3318__choose_store_release(unsigned char volatile* __obj, unsigned char __desr)
3319{
3320#if __has_feature(__atomic_store_release_h)
3321 __atomic_store_release(__obj, __desr);
3322#else
3323 __choose_store_seq_cst(__obj, __desr);
3324#endif
3325}
3326
3327inline _LIBCPP_INLINE_VISIBILITY
3328void
3329__choose_store_relaxed(unsigned char volatile* __obj, unsigned char __desr)
3330{
3331#if __has_feature(__atomic_store_relaxed_h)
3332 __atomic_store_relaxed(__obj, __desr);
3333#else
3334 __choose_store_release(__obj, __desr);
3335#endif
3336}
3337
3338#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
3339
3340// store char16_t
3341
3342inline _LIBCPP_INLINE_VISIBILITY
3343void
3344__choose_store_seq_cst(char16_t volatile* __obj, char16_t __desr)
3345{
3346#if __has_feature(__atomic_store_seq_cst_Ds)
3347 __atomic_store_seq_cst(__obj, __desr);
3348#else
3349 __store_seq_cst(__obj, __desr);
3350#endif
3351}
3352
3353inline _LIBCPP_INLINE_VISIBILITY
3354void
3355__choose_store_release(char16_t volatile* __obj, char16_t __desr)
3356{
3357#if __has_feature(__atomic_store_release_Ds)
3358 __atomic_store_release(__obj, __desr);
3359#else
3360 __choose_store_seq_cst(__obj, __desr);
3361#endif
3362}
3363
3364inline _LIBCPP_INLINE_VISIBILITY
3365void
3366__choose_store_relaxed(char16_t volatile* __obj, char16_t __desr)
3367{
3368#if __has_feature(__atomic_store_relaxed_Ds)
3369 __atomic_store_relaxed(__obj, __desr);
3370#else
3371 __choose_store_release(__obj, __desr);
3372#endif
3373}
3374
3375// store char32_t
3376
3377inline _LIBCPP_INLINE_VISIBILITY
3378void
3379__choose_store_seq_cst(char32_t volatile* __obj, char32_t __desr)
3380{
3381#if __has_feature(__atomic_store_seq_cst_Di)
3382 __atomic_store_seq_cst(__obj, __desr);
3383#else
3384 __store_seq_cst(__obj, __desr);
3385#endif
3386}
3387
3388inline _LIBCPP_INLINE_VISIBILITY
3389void
3390__choose_store_release(char32_t volatile* __obj, char32_t __desr)
3391{
3392#if __has_feature(__atomic_store_release_Di)
3393 __atomic_store_release(__obj, __desr);
3394#else
3395 __choose_store_seq_cst(__obj, __desr);
3396#endif
3397}
3398
3399inline _LIBCPP_INLINE_VISIBILITY
3400void
3401__choose_store_relaxed(char32_t volatile* __obj, char32_t __desr)
3402{
3403#if __has_feature(__atomic_store_relaxed_Di)
3404 __atomic_store_relaxed(__obj, __desr);
3405#else
3406 __choose_store_release(__obj, __desr);
3407#endif
3408}
3409
3410#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
3411
3412// store wchar_t
3413
3414inline _LIBCPP_INLINE_VISIBILITY
3415void
3416__choose_store_seq_cst(wchar_t volatile* __obj, wchar_t __desr)
3417{
3418#if __has_feature(__atomic_store_seq_cst_w)
3419 __atomic_store_seq_cst(__obj, __desr);
3420#else
3421 __store_seq_cst(__obj, __desr);
3422#endif
3423}
3424
3425inline _LIBCPP_INLINE_VISIBILITY
3426void
3427__choose_store_release(wchar_t volatile* __obj, wchar_t __desr)
3428{
3429#if __has_feature(__atomic_store_release_w)
3430 __atomic_store_release(__obj, __desr);
3431#else
3432 __choose_store_seq_cst(__obj, __desr);
3433#endif
3434}
3435
3436inline _LIBCPP_INLINE_VISIBILITY
3437void
3438__choose_store_relaxed(wchar_t volatile* __obj, wchar_t __desr)
3439{
3440#if __has_feature(__atomic_store_relaxed_w)
3441 __atomic_store_relaxed(__obj, __desr);
3442#else
3443 __choose_store_release(__obj, __desr);
3444#endif
3445}
3446
3447// store short
3448
3449inline _LIBCPP_INLINE_VISIBILITY
3450void
3451__choose_store_seq_cst(short volatile* __obj, short __desr)
3452{
3453#if __has_feature(__atomic_store_seq_cst_s)
3454 __atomic_store_seq_cst(__obj, __desr);
3455#else
3456 __store_seq_cst(__obj, __desr);
3457#endif
3458}
3459
3460inline _LIBCPP_INLINE_VISIBILITY
3461void
3462__choose_store_release(short volatile* __obj, short __desr)
3463{
3464#if __has_feature(__atomic_store_release_s)
3465 __atomic_store_release(__obj, __desr);
3466#else
3467 __choose_store_seq_cst(__obj, __desr);
3468#endif
3469}
3470
3471inline _LIBCPP_INLINE_VISIBILITY
3472void
3473__choose_store_relaxed(short volatile* __obj, short __desr)
3474{
3475#if __has_feature(__atomic_store_relaxed_s)
3476 __atomic_store_relaxed(__obj, __desr);
3477#else
3478 __choose_store_release(__obj, __desr);
3479#endif
3480}
3481
3482// store unsigned short
3483
3484inline _LIBCPP_INLINE_VISIBILITY
3485void
3486__choose_store_seq_cst(unsigned short volatile* __obj, unsigned short __desr)
3487{
3488#if __has_feature(__atomic_store_seq_cst_t)
3489 __atomic_store_seq_cst(__obj, __desr);
3490#else
3491 __store_seq_cst(__obj, __desr);
3492#endif
3493}
3494
3495inline _LIBCPP_INLINE_VISIBILITY
3496void
3497__choose_store_release(unsigned short volatile* __obj, unsigned short __desr)
3498{
3499#if __has_feature(__atomic_store_release_t)
3500 __atomic_store_release(__obj, __desr);
3501#else
3502 __choose_store_seq_cst(__obj, __desr);
3503#endif
3504}
3505
3506inline _LIBCPP_INLINE_VISIBILITY
3507void
3508__choose_store_relaxed(unsigned short volatile* __obj, unsigned short __desr)
3509{
3510#if __has_feature(__atomic_store_relaxed_t)
3511 __atomic_store_relaxed(__obj, __desr);
3512#else
3513 __choose_store_release(__obj, __desr);
3514#endif
3515}
3516
3517// store int
3518
3519inline _LIBCPP_INLINE_VISIBILITY
3520void
3521__choose_store_seq_cst(int volatile* __obj, int __desr)
3522{
3523#if __has_feature(__atomic_store_seq_cst_i)
3524 __atomic_store_seq_cst(__obj, __desr);
3525#else
3526 __store_seq_cst(__obj, __desr);
3527#endif
3528}
3529
3530inline _LIBCPP_INLINE_VISIBILITY
3531void
3532__choose_store_release(int volatile* __obj, int __desr)
3533{
3534#if __has_feature(__atomic_store_release_i)
3535 __atomic_store_release(__obj, __desr);
3536#else
3537 __choose_store_seq_cst(__obj, __desr);
3538#endif
3539}
3540
3541inline _LIBCPP_INLINE_VISIBILITY
3542void
3543__choose_store_relaxed(int volatile* __obj, int __desr)
3544{
3545#if __has_feature(__atomic_store_relaxed_i)
3546 __atomic_store_relaxed(__obj, __desr);
3547#else
3548 __choose_store_release(__obj, __desr);
3549#endif
3550}
3551
3552// store unsigned int
3553
3554inline _LIBCPP_INLINE_VISIBILITY
3555void
3556__choose_store_seq_cst(unsigned int volatile* __obj, unsigned int __desr)
3557{
3558#if __has_feature(__atomic_store_seq_cst_j)
3559 __atomic_store_seq_cst(__obj, __desr);
3560#else
3561 __store_seq_cst(__obj, __desr);
3562#endif
3563}
3564
3565inline _LIBCPP_INLINE_VISIBILITY
3566void
3567__choose_store_release(unsigned int volatile* __obj, unsigned int __desr)
3568{
3569#if __has_feature(__atomic_store_release_j)
3570 __atomic_store_release(__obj, __desr);
3571#else
3572 __choose_store_seq_cst(__obj, __desr);
3573#endif
3574}
3575
3576inline _LIBCPP_INLINE_VISIBILITY
3577void
3578__choose_store_relaxed(unsigned int volatile* __obj, unsigned int __desr)
3579{
3580#if __has_feature(__atomic_store_relaxed_j)
3581 __atomic_store_relaxed(__obj, __desr);
3582#else
3583 __choose_store_release(__obj, __desr);
3584#endif
3585}
3586
3587// store long
3588
3589inline _LIBCPP_INLINE_VISIBILITY
3590void
3591__choose_store_seq_cst(long volatile* __obj, long __desr)
3592{
3593#if __has_feature(__atomic_store_seq_cst_l)
3594 __atomic_store_seq_cst(__obj, __desr);
3595#else
3596 __store_seq_cst(__obj, __desr);
3597#endif
3598}
3599
3600inline _LIBCPP_INLINE_VISIBILITY
3601void
3602__choose_store_release(long volatile* __obj, long __desr)
3603{
3604#if __has_feature(__atomic_store_release_l)
3605 __atomic_store_release(__obj, __desr);
3606#else
3607 __choose_store_seq_cst(__obj, __desr);
3608#endif
3609}
3610
3611inline _LIBCPP_INLINE_VISIBILITY
3612void
3613__choose_store_relaxed(long volatile* __obj, long __desr)
3614{
3615#if __has_feature(__atomic_store_relaxed_l)
3616 __atomic_store_relaxed(__obj, __desr);
3617#else
3618 __choose_store_release(__obj, __desr);
3619#endif
3620}
3621
3622// store unsigned long
3623
3624inline _LIBCPP_INLINE_VISIBILITY
3625void
3626__choose_store_seq_cst(unsigned long volatile* __obj, unsigned long __desr)
3627{
3628#if __has_feature(__atomic_store_seq_cst_m)
3629 __atomic_store_seq_cst(__obj, __desr);
3630#else
3631 __store_seq_cst(__obj, __desr);
3632#endif
3633}
3634
3635inline _LIBCPP_INLINE_VISIBILITY
3636void
3637__choose_store_release(unsigned long volatile* __obj, unsigned long __desr)
3638{
3639#if __has_feature(__atomic_store_release_m)
3640 __atomic_store_release(__obj, __desr);
3641#else
3642 __choose_store_seq_cst(__obj, __desr);
3643#endif
3644}
3645
3646inline _LIBCPP_INLINE_VISIBILITY
3647void
3648__choose_store_relaxed(unsigned long volatile* __obj, unsigned long __desr)
3649{
3650#if __has_feature(__atomic_store_relaxed_m)
3651 __atomic_store_relaxed(__obj, __desr);
3652#else
3653 __choose_store_release(__obj, __desr);
3654#endif
3655}
3656
3657// store long long
3658
3659inline _LIBCPP_INLINE_VISIBILITY
3660void
3661__choose_store_seq_cst(long long volatile* __obj, long long __desr)
3662{
3663#if __has_feature(__atomic_store_seq_cst_x)
3664 __atomic_store_seq_cst(__obj, __desr);
3665#else
3666 __store_seq_cst(__obj, __desr);
3667#endif
3668}
3669
3670inline _LIBCPP_INLINE_VISIBILITY
3671void
3672__choose_store_release(long long volatile* __obj, long long __desr)
3673{
3674#if __has_feature(__atomic_store_release_x)
3675 __atomic_store_release(__obj, __desr);
3676#else
3677 __choose_store_seq_cst(__obj, __desr);
3678#endif
3679}
3680
3681inline _LIBCPP_INLINE_VISIBILITY
3682void
3683__choose_store_relaxed(long long volatile* __obj, long long __desr)
3684{
3685#if __has_feature(__atomic_store_relaxed_x)
3686 __atomic_store_relaxed(__obj, __desr);
3687#else
3688 __choose_store_release(__obj, __desr);
3689#endif
3690}
3691
3692// store unsigned long long
3693
3694inline _LIBCPP_INLINE_VISIBILITY
3695void
3696__choose_store_seq_cst(unsigned long long volatile* __obj, unsigned long long __desr)
3697{
3698#if __has_feature(__atomic_store_seq_cst_y)
3699 __atomic_store_seq_cst(__obj, __desr);
3700#else
3701 __store_seq_cst(__obj, __desr);
3702#endif
3703}
3704
3705inline _LIBCPP_INLINE_VISIBILITY
3706void
3707__choose_store_release(unsigned long long volatile* __obj, unsigned long long __desr)
3708{
3709#if __has_feature(__atomic_store_release_y)
3710 __atomic_store_release(__obj, __desr);
3711#else
3712 __choose_store_seq_cst(__obj, __desr);
3713#endif
3714}
3715
3716inline _LIBCPP_INLINE_VISIBILITY
3717void
3718__choose_store_relaxed(unsigned long long volatile* __obj, unsigned long long __desr)
3719{
3720#if __has_feature(__atomic_store_relaxed_y)
3721 __atomic_store_relaxed(__obj, __desr);
3722#else
3723 __choose_store_release(__obj, __desr);
3724#endif
3725}
3726
3727// store void*
3728
3729inline _LIBCPP_INLINE_VISIBILITY
3730void
3731__choose_store_seq_cst(void* volatile* __obj, void* __desr)
3732{
3733#if __has_feature(__atomic_store_seq_cst_Py)
3734 __atomic_store_seq_cst(__obj, __desr);
3735#else
3736 __store_seq_cst(__obj, __desr);
3737#endif
3738}
3739
3740inline _LIBCPP_INLINE_VISIBILITY
3741void
3742__choose_store_release(void* volatile* __obj, void* __desr)
3743{
3744#if __has_feature(__atomic_store_release_Py)
3745 __atomic_store_release(__obj, __desr);
3746#else
3747 __choose_store_seq_cst(__obj, __desr);
3748#endif
3749}
3750
3751inline _LIBCPP_INLINE_VISIBILITY
3752void
3753__choose_store_relaxed(void* volatile* __obj, void* __desr)
3754{
3755#if __has_feature(__atomic_store_relaxed_Py)
3756 __atomic_store_relaxed(__obj, __desr);
3757#else
3758 __choose_store_release(__obj, __desr);
3759#endif
3760}
3761
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003762// exchange
3763
3764template <class _Tp>
3765_Tp
Howard Hinnant002f1d32010-10-04 23:55:35 +00003766__exchange_seq_cst(_Tp volatile* __obj, _Tp __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003767{
3768 unique_lock<mutex> _(__not_atomic_mut());
3769 _Tp __r = *__obj;
3770 *__obj = __desr;
3771 return __r;
3772}
3773
3774// exchange bool
3775
3776inline _LIBCPP_INLINE_VISIBILITY
3777bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00003778__choose_exchange_seq_cst(bool volatile* __obj, bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003779{
3780#if __has_feature(__atomic_exchange_seq_cst_b)
3781 return __atomic_exchange_seq_cst(__obj, __desr);
3782#else
3783 return __exchange_seq_cst(__obj, __desr);
3784#endif
3785}
3786
3787inline _LIBCPP_INLINE_VISIBILITY
3788bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00003789__choose_exchange_acq_rel(bool volatile* __obj, bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003790{
3791#if __has_feature(__atomic_exchange_acq_rel_b)
3792 return __atomic_exchange_acq_rel(__obj, __desr);
3793#else
3794 return __choose_exchange_seq_cst(__obj, __desr);
3795#endif
3796}
3797
3798inline _LIBCPP_INLINE_VISIBILITY
3799bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00003800__choose_exchange_release(bool volatile* __obj, bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003801{
3802#if __has_feature(__atomic_exchange_release_b)
3803 return __atomic_exchange_release(__obj, __desr);
3804#else
3805 return __choose_exchange_acq_rel(__obj, __desr);
3806#endif
3807}
3808
3809inline _LIBCPP_INLINE_VISIBILITY
3810bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00003811__choose_exchange_acquire(bool volatile* __obj, bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003812{
3813#if __has_feature(__atomic_exchange_acquire_b)
3814 return __atomic_exchange_acquire(__obj, __desr);
3815#else
3816 return __choose_exchange_release(__obj, __desr);
3817#endif
3818}
3819
3820inline _LIBCPP_INLINE_VISIBILITY
3821bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00003822__choose_exchange_consume(bool volatile* __obj, bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003823{
3824#if __has_feature(__atomic_exchange_consume_b)
3825 return __atomic_exchange_consume(__obj, __desr);
3826#else
3827 return __choose_exchange_acquire(__obj, __desr);
3828#endif
3829}
3830
3831inline _LIBCPP_INLINE_VISIBILITY
3832bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00003833__choose_exchange_relaxed(bool volatile* __obj, bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00003834{
3835#if __has_feature(__atomic_exchange_relaxed_b)
3836 return __atomic_exchange_relaxed(__obj, __desr);
3837#else
3838 return __choose_exchange_consume(__obj, __desr);
3839#endif
3840}
3841
Howard Hinnant002f1d32010-10-04 23:55:35 +00003842// exchange char
3843
3844inline _LIBCPP_INLINE_VISIBILITY
3845char
3846__choose_exchange_seq_cst(char volatile* __obj, char __desr)
3847{
3848#if __has_feature(__atomic_exchange_seq_cst_c)
3849 return __atomic_exchange_seq_cst(__obj, __desr);
3850#else
3851 return __exchange_seq_cst(__obj, __desr);
3852#endif
3853}
3854
3855inline _LIBCPP_INLINE_VISIBILITY
3856char
3857__choose_exchange_acq_rel(char volatile* __obj, char __desr)
3858{
3859#if __has_feature(__atomic_exchange_acq_rel_c)
3860 return __atomic_exchange_acq_rel(__obj, __desr);
3861#else
3862 return __choose_exchange_seq_cst(__obj, __desr);
3863#endif
3864}
3865
3866inline _LIBCPP_INLINE_VISIBILITY
3867char
3868__choose_exchange_release(char volatile* __obj, char __desr)
3869{
3870#if __has_feature(__atomic_exchange_release_c)
3871 return __atomic_exchange_release(__obj, __desr);
3872#else
3873 return __choose_exchange_acq_rel(__obj, __desr);
3874#endif
3875}
3876
3877inline _LIBCPP_INLINE_VISIBILITY
3878char
3879__choose_exchange_acquire(char volatile* __obj, char __desr)
3880{
3881#if __has_feature(__atomic_exchange_acquire_c)
3882 return __atomic_exchange_acquire(__obj, __desr);
3883#else
3884 return __choose_exchange_release(__obj, __desr);
3885#endif
3886}
3887
3888inline _LIBCPP_INLINE_VISIBILITY
3889char
3890__choose_exchange_consume(char volatile* __obj, char __desr)
3891{
3892#if __has_feature(__atomic_exchange_consume_c)
3893 return __atomic_exchange_consume(__obj, __desr);
3894#else
3895 return __choose_exchange_acquire(__obj, __desr);
3896#endif
3897}
3898
3899inline _LIBCPP_INLINE_VISIBILITY
3900char
3901__choose_exchange_relaxed(char volatile* __obj, char __desr)
3902{
3903#if __has_feature(__atomic_exchange_relaxed_c)
3904 return __atomic_exchange_relaxed(__obj, __desr);
3905#else
3906 return __choose_exchange_consume(__obj, __desr);
3907#endif
3908}
3909
3910// exchange signed char
3911
3912inline _LIBCPP_INLINE_VISIBILITY
3913signed char
3914__choose_exchange_seq_cst(signed char volatile* __obj, signed char __desr)
3915{
3916#if __has_feature(__atomic_exchange_seq_cst_a)
3917 return __atomic_exchange_seq_cst(__obj, __desr);
3918#else
3919 return __exchange_seq_cst(__obj, __desr);
3920#endif
3921}
3922
3923inline _LIBCPP_INLINE_VISIBILITY
3924signed char
3925__choose_exchange_acq_rel(signed char volatile* __obj, signed char __desr)
3926{
3927#if __has_feature(__atomic_exchange_acq_rel_a)
3928 return __atomic_exchange_acq_rel(__obj, __desr);
3929#else
3930 return __choose_exchange_seq_cst(__obj, __desr);
3931#endif
3932}
3933
3934inline _LIBCPP_INLINE_VISIBILITY
3935signed char
3936__choose_exchange_release(signed char volatile* __obj, signed char __desr)
3937{
3938#if __has_feature(__atomic_exchange_release_a)
3939 return __atomic_exchange_release(__obj, __desr);
3940#else
3941 return __choose_exchange_acq_rel(__obj, __desr);
3942#endif
3943}
3944
3945inline _LIBCPP_INLINE_VISIBILITY
3946signed char
3947__choose_exchange_acquire(signed char volatile* __obj, signed char __desr)
3948{
3949#if __has_feature(__atomic_exchange_acquire_a)
3950 return __atomic_exchange_acquire(__obj, __desr);
3951#else
3952 return __choose_exchange_release(__obj, __desr);
3953#endif
3954}
3955
3956inline _LIBCPP_INLINE_VISIBILITY
3957signed char
3958__choose_exchange_consume(signed char volatile* __obj, signed char __desr)
3959{
3960#if __has_feature(__atomic_exchange_consume_a)
3961 return __atomic_exchange_consume(__obj, __desr);
3962#else
3963 return __choose_exchange_acquire(__obj, __desr);
3964#endif
3965}
3966
3967inline _LIBCPP_INLINE_VISIBILITY
3968signed char
3969__choose_exchange_relaxed(signed char volatile* __obj, signed char __desr)
3970{
3971#if __has_feature(__atomic_exchange_relaxed_a)
3972 return __atomic_exchange_relaxed(__obj, __desr);
3973#else
3974 return __choose_exchange_consume(__obj, __desr);
3975#endif
3976}
3977
3978// exchange unsigned char
3979
3980inline _LIBCPP_INLINE_VISIBILITY
3981unsigned char
3982__choose_exchange_seq_cst(unsigned char volatile* __obj, unsigned char __desr)
3983{
3984#if __has_feature(__atomic_exchange_seq_cst_h)
3985 return __atomic_exchange_seq_cst(__obj, __desr);
3986#else
3987 return __exchange_seq_cst(__obj, __desr);
3988#endif
3989}
3990
3991inline _LIBCPP_INLINE_VISIBILITY
3992unsigned char
3993__choose_exchange_acq_rel(unsigned char volatile* __obj, unsigned char __desr)
3994{
3995#if __has_feature(__atomic_exchange_acq_rel_h)
3996 return __atomic_exchange_acq_rel(__obj, __desr);
3997#else
3998 return __choose_exchange_seq_cst(__obj, __desr);
3999#endif
4000}
4001
4002inline _LIBCPP_INLINE_VISIBILITY
4003unsigned char
4004__choose_exchange_release(unsigned char volatile* __obj, unsigned char __desr)
4005{
4006#if __has_feature(__atomic_exchange_release_h)
4007 return __atomic_exchange_release(__obj, __desr);
4008#else
4009 return __choose_exchange_acq_rel(__obj, __desr);
4010#endif
4011}
4012
4013inline _LIBCPP_INLINE_VISIBILITY
4014unsigned char
4015__choose_exchange_acquire(unsigned char volatile* __obj, unsigned char __desr)
4016{
4017#if __has_feature(__atomic_exchange_acquire_h)
4018 return __atomic_exchange_acquire(__obj, __desr);
4019#else
4020 return __choose_exchange_release(__obj, __desr);
4021#endif
4022}
4023
4024inline _LIBCPP_INLINE_VISIBILITY
4025unsigned char
4026__choose_exchange_consume(unsigned char volatile* __obj, unsigned char __desr)
4027{
4028#if __has_feature(__atomic_exchange_consume_h)
4029 return __atomic_exchange_consume(__obj, __desr);
4030#else
4031 return __choose_exchange_acquire(__obj, __desr);
4032#endif
4033}
4034
4035inline _LIBCPP_INLINE_VISIBILITY
4036unsigned char
4037__choose_exchange_relaxed(unsigned char volatile* __obj, unsigned char __desr)
4038{
4039#if __has_feature(__atomic_exchange_relaxed_h)
4040 return __atomic_exchange_relaxed(__obj, __desr);
4041#else
4042 return __choose_exchange_consume(__obj, __desr);
4043#endif
4044}
4045
4046#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
4047
4048// exchange char16_t
4049
4050inline _LIBCPP_INLINE_VISIBILITY
4051char16_t
4052__choose_exchange_seq_cst(char16_t volatile* __obj, char16_t __desr)
4053{
4054#if __has_feature(__atomic_exchange_seq_cst_Ds)
4055 return __atomic_exchange_seq_cst(__obj, __desr);
4056#else
4057 return __exchange_seq_cst(__obj, __desr);
4058#endif
4059}
4060
4061inline _LIBCPP_INLINE_VISIBILITY
4062char16_t
4063__choose_exchange_acq_rel(char16_t volatile* __obj, char16_t __desr)
4064{
4065#if __has_feature(__atomic_exchange_acq_rel_Ds)
4066 return __atomic_exchange_acq_rel(__obj, __desr);
4067#else
4068 return __choose_exchange_seq_cst(__obj, __desr);
4069#endif
4070}
4071
4072inline _LIBCPP_INLINE_VISIBILITY
4073char16_t
4074__choose_exchange_release(char16_t volatile* __obj, char16_t __desr)
4075{
4076#if __has_feature(__atomic_exchange_release_Ds)
4077 return __atomic_exchange_release(__obj, __desr);
4078#else
4079 return __choose_exchange_acq_rel(__obj, __desr);
4080#endif
4081}
4082
4083inline _LIBCPP_INLINE_VISIBILITY
4084char16_t
4085__choose_exchange_acquire(char16_t volatile* __obj, char16_t __desr)
4086{
4087#if __has_feature(__atomic_exchange_acquire_Ds)
4088 return __atomic_exchange_acquire(__obj, __desr);
4089#else
4090 return __choose_exchange_release(__obj, __desr);
4091#endif
4092}
4093
4094inline _LIBCPP_INLINE_VISIBILITY
4095char16_t
4096__choose_exchange_consume(char16_t volatile* __obj, char16_t __desr)
4097{
4098#if __has_feature(__atomic_exchange_consume_Ds)
4099 return __atomic_exchange_consume(__obj, __desr);
4100#else
4101 return __choose_exchange_acquire(__obj, __desr);
4102#endif
4103}
4104
4105inline _LIBCPP_INLINE_VISIBILITY
4106char16_t
4107__choose_exchange_relaxed(char16_t volatile* __obj, char16_t __desr)
4108{
4109#if __has_feature(__atomic_exchange_relaxed_Ds)
4110 return __atomic_exchange_relaxed(__obj, __desr);
4111#else
4112 return __choose_exchange_consume(__obj, __desr);
4113#endif
4114}
4115
4116// exchange char32_t
4117
4118inline _LIBCPP_INLINE_VISIBILITY
4119char32_t
4120__choose_exchange_seq_cst(char32_t volatile* __obj, char32_t __desr)
4121{
4122#if __has_feature(__atomic_exchange_seq_cst_Di)
4123 return __atomic_exchange_seq_cst(__obj, __desr);
4124#else
4125 return __exchange_seq_cst(__obj, __desr);
4126#endif
4127}
4128
4129inline _LIBCPP_INLINE_VISIBILITY
4130char32_t
4131__choose_exchange_acq_rel(char32_t volatile* __obj, char32_t __desr)
4132{
4133#if __has_feature(__atomic_exchange_acq_rel_Di)
4134 return __atomic_exchange_acq_rel(__obj, __desr);
4135#else
4136 return __choose_exchange_seq_cst(__obj, __desr);
4137#endif
4138}
4139
4140inline _LIBCPP_INLINE_VISIBILITY
4141char32_t
4142__choose_exchange_release(char32_t volatile* __obj, char32_t __desr)
4143{
4144#if __has_feature(__atomic_exchange_release_Di)
4145 return __atomic_exchange_release(__obj, __desr);
4146#else
4147 return __choose_exchange_acq_rel(__obj, __desr);
4148#endif
4149}
4150
4151inline _LIBCPP_INLINE_VISIBILITY
4152char32_t
4153__choose_exchange_acquire(char32_t volatile* __obj, char32_t __desr)
4154{
4155#if __has_feature(__atomic_exchange_acquire_Di)
4156 return __atomic_exchange_acquire(__obj, __desr);
4157#else
4158 return __choose_exchange_release(__obj, __desr);
4159#endif
4160}
4161
4162inline _LIBCPP_INLINE_VISIBILITY
4163char32_t
4164__choose_exchange_consume(char32_t volatile* __obj, char32_t __desr)
4165{
4166#if __has_feature(__atomic_exchange_consume_Di)
4167 return __atomic_exchange_consume(__obj, __desr);
4168#else
4169 return __choose_exchange_acquire(__obj, __desr);
4170#endif
4171}
4172
4173inline _LIBCPP_INLINE_VISIBILITY
4174char32_t
4175__choose_exchange_relaxed(char32_t volatile* __obj, char32_t __desr)
4176{
4177#if __has_feature(__atomic_exchange_relaxed_Di)
4178 return __atomic_exchange_relaxed(__obj, __desr);
4179#else
4180 return __choose_exchange_consume(__obj, __desr);
4181#endif
4182}
4183
4184#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
4185
4186// exchange wchar_t
4187
4188inline _LIBCPP_INLINE_VISIBILITY
4189wchar_t
4190__choose_exchange_seq_cst(wchar_t volatile* __obj, wchar_t __desr)
4191{
4192#if __has_feature(__atomic_exchange_seq_cst_w)
4193 return __atomic_exchange_seq_cst(__obj, __desr);
4194#else
4195 return __exchange_seq_cst(__obj, __desr);
4196#endif
4197}
4198
4199inline _LIBCPP_INLINE_VISIBILITY
4200wchar_t
4201__choose_exchange_acq_rel(wchar_t volatile* __obj, wchar_t __desr)
4202{
4203#if __has_feature(__atomic_exchange_acq_rel_w)
4204 return __atomic_exchange_acq_rel(__obj, __desr);
4205#else
4206 return __choose_exchange_seq_cst(__obj, __desr);
4207#endif
4208}
4209
4210inline _LIBCPP_INLINE_VISIBILITY
4211wchar_t
4212__choose_exchange_release(wchar_t volatile* __obj, wchar_t __desr)
4213{
4214#if __has_feature(__atomic_exchange_release_w)
4215 return __atomic_exchange_release(__obj, __desr);
4216#else
4217 return __choose_exchange_acq_rel(__obj, __desr);
4218#endif
4219}
4220
4221inline _LIBCPP_INLINE_VISIBILITY
4222wchar_t
4223__choose_exchange_acquire(wchar_t volatile* __obj, wchar_t __desr)
4224{
4225#if __has_feature(__atomic_exchange_acquire_w)
4226 return __atomic_exchange_acquire(__obj, __desr);
4227#else
4228 return __choose_exchange_release(__obj, __desr);
4229#endif
4230}
4231
4232inline _LIBCPP_INLINE_VISIBILITY
4233wchar_t
4234__choose_exchange_consume(wchar_t volatile* __obj, wchar_t __desr)
4235{
4236#if __has_feature(__atomic_exchange_consume_w)
4237 return __atomic_exchange_consume(__obj, __desr);
4238#else
4239 return __choose_exchange_acquire(__obj, __desr);
4240#endif
4241}
4242
4243inline _LIBCPP_INLINE_VISIBILITY
4244wchar_t
4245__choose_exchange_relaxed(wchar_t volatile* __obj, wchar_t __desr)
4246{
4247#if __has_feature(__atomic_exchange_relaxed_w)
4248 return __atomic_exchange_relaxed(__obj, __desr);
4249#else
4250 return __choose_exchange_consume(__obj, __desr);
4251#endif
4252}
4253
4254// exchange short
4255
4256inline _LIBCPP_INLINE_VISIBILITY
4257short
4258__choose_exchange_seq_cst(short volatile* __obj, short __desr)
4259{
4260#if __has_feature(__atomic_exchange_seq_cst_s)
4261 return __atomic_exchange_seq_cst(__obj, __desr);
4262#else
4263 return __exchange_seq_cst(__obj, __desr);
4264#endif
4265}
4266
4267inline _LIBCPP_INLINE_VISIBILITY
4268short
4269__choose_exchange_acq_rel(short volatile* __obj, short __desr)
4270{
4271#if __has_feature(__atomic_exchange_acq_rel_s)
4272 return __atomic_exchange_acq_rel(__obj, __desr);
4273#else
4274 return __choose_exchange_seq_cst(__obj, __desr);
4275#endif
4276}
4277
4278inline _LIBCPP_INLINE_VISIBILITY
4279short
4280__choose_exchange_release(short volatile* __obj, short __desr)
4281{
4282#if __has_feature(__atomic_exchange_release_s)
4283 return __atomic_exchange_release(__obj, __desr);
4284#else
4285 return __choose_exchange_acq_rel(__obj, __desr);
4286#endif
4287}
4288
4289inline _LIBCPP_INLINE_VISIBILITY
4290short
4291__choose_exchange_acquire(short volatile* __obj, short __desr)
4292{
4293#if __has_feature(__atomic_exchange_acquire_s)
4294 return __atomic_exchange_acquire(__obj, __desr);
4295#else
4296 return __choose_exchange_release(__obj, __desr);
4297#endif
4298}
4299
4300inline _LIBCPP_INLINE_VISIBILITY
4301short
4302__choose_exchange_consume(short volatile* __obj, short __desr)
4303{
4304#if __has_feature(__atomic_exchange_consume_s)
4305 return __atomic_exchange_consume(__obj, __desr);
4306#else
4307 return __choose_exchange_acquire(__obj, __desr);
4308#endif
4309}
4310
4311inline _LIBCPP_INLINE_VISIBILITY
4312short
4313__choose_exchange_relaxed(short volatile* __obj, short __desr)
4314{
4315#if __has_feature(__atomic_exchange_relaxed_s)
4316 return __atomic_exchange_relaxed(__obj, __desr);
4317#else
4318 return __choose_exchange_consume(__obj, __desr);
4319#endif
4320}
4321
4322// exchange unsigned short
4323
4324inline _LIBCPP_INLINE_VISIBILITY
4325unsigned short
4326__choose_exchange_seq_cst(unsigned short volatile* __obj, unsigned short __desr)
4327{
4328#if __has_feature(__atomic_exchange_seq_cst_t)
4329 return __atomic_exchange_seq_cst(__obj, __desr);
4330#else
4331 return __exchange_seq_cst(__obj, __desr);
4332#endif
4333}
4334
4335inline _LIBCPP_INLINE_VISIBILITY
4336unsigned short
4337__choose_exchange_acq_rel(unsigned short volatile* __obj, unsigned short __desr)
4338{
4339#if __has_feature(__atomic_exchange_acq_rel_t)
4340 return __atomic_exchange_acq_rel(__obj, __desr);
4341#else
4342 return __choose_exchange_seq_cst(__obj, __desr);
4343#endif
4344}
4345
4346inline _LIBCPP_INLINE_VISIBILITY
4347unsigned short
4348__choose_exchange_release(unsigned short volatile* __obj, unsigned short __desr)
4349{
4350#if __has_feature(__atomic_exchange_release_t)
4351 return __atomic_exchange_release(__obj, __desr);
4352#else
4353 return __choose_exchange_acq_rel(__obj, __desr);
4354#endif
4355}
4356
4357inline _LIBCPP_INLINE_VISIBILITY
4358unsigned short
4359__choose_exchange_acquire(unsigned short volatile* __obj, unsigned short __desr)
4360{
4361#if __has_feature(__atomic_exchange_acquire_t)
4362 return __atomic_exchange_acquire(__obj, __desr);
4363#else
4364 return __choose_exchange_release(__obj, __desr);
4365#endif
4366}
4367
4368inline _LIBCPP_INLINE_VISIBILITY
4369unsigned short
4370__choose_exchange_consume(unsigned short volatile* __obj, unsigned short __desr)
4371{
4372#if __has_feature(__atomic_exchange_consume_t)
4373 return __atomic_exchange_consume(__obj, __desr);
4374#else
4375 return __choose_exchange_acquire(__obj, __desr);
4376#endif
4377}
4378
4379inline _LIBCPP_INLINE_VISIBILITY
4380unsigned short
4381__choose_exchange_relaxed(unsigned short volatile* __obj, unsigned short __desr)
4382{
4383#if __has_feature(__atomic_exchange_relaxed_t)
4384 return __atomic_exchange_relaxed(__obj, __desr);
4385#else
4386 return __choose_exchange_consume(__obj, __desr);
4387#endif
4388}
4389
4390// exchange int
4391
4392inline _LIBCPP_INLINE_VISIBILITY
4393int
4394__choose_exchange_seq_cst(int volatile* __obj, int __desr)
4395{
4396#if __has_feature(__atomic_exchange_seq_cst_i)
4397 return __atomic_exchange_seq_cst(__obj, __desr);
4398#else
4399 return __exchange_seq_cst(__obj, __desr);
4400#endif
4401}
4402
4403inline _LIBCPP_INLINE_VISIBILITY
4404int
4405__choose_exchange_acq_rel(int volatile* __obj, int __desr)
4406{
4407#if __has_feature(__atomic_exchange_acq_rel_i)
4408 return __atomic_exchange_acq_rel(__obj, __desr);
4409#else
4410 return __choose_exchange_seq_cst(__obj, __desr);
4411#endif
4412}
4413
4414inline _LIBCPP_INLINE_VISIBILITY
4415int
4416__choose_exchange_release(int volatile* __obj, int __desr)
4417{
4418#if __has_feature(__atomic_exchange_release_i)
4419 return __atomic_exchange_release(__obj, __desr);
4420#else
4421 return __choose_exchange_acq_rel(__obj, __desr);
4422#endif
4423}
4424
4425inline _LIBCPP_INLINE_VISIBILITY
4426int
4427__choose_exchange_acquire(int volatile* __obj, int __desr)
4428{
4429#if __has_feature(__atomic_exchange_acquire_i)
4430 return __atomic_exchange_acquire(__obj, __desr);
4431#else
4432 return __choose_exchange_release(__obj, __desr);
4433#endif
4434}
4435
4436inline _LIBCPP_INLINE_VISIBILITY
4437int
4438__choose_exchange_consume(int volatile* __obj, int __desr)
4439{
4440#if __has_feature(__atomic_exchange_consume_i)
4441 return __atomic_exchange_consume(__obj, __desr);
4442#else
4443 return __choose_exchange_acquire(__obj, __desr);
4444#endif
4445}
4446
4447inline _LIBCPP_INLINE_VISIBILITY
4448int
4449__choose_exchange_relaxed(int volatile* __obj, int __desr)
4450{
4451#if __has_feature(__atomic_exchange_relaxed_i)
4452 return __atomic_exchange_relaxed(__obj, __desr);
4453#else
4454 return __choose_exchange_consume(__obj, __desr);
4455#endif
4456}
4457
4458// exchange unsigned int
4459
4460inline _LIBCPP_INLINE_VISIBILITY
4461unsigned int
4462__choose_exchange_seq_cst(unsigned int volatile* __obj, unsigned int __desr)
4463{
4464#if __has_feature(__atomic_exchange_seq_cst_j)
4465 return __atomic_exchange_seq_cst(__obj, __desr);
4466#else
4467 return __exchange_seq_cst(__obj, __desr);
4468#endif
4469}
4470
4471inline _LIBCPP_INLINE_VISIBILITY
4472unsigned int
4473__choose_exchange_acq_rel(unsigned int volatile* __obj, unsigned int __desr)
4474{
4475#if __has_feature(__atomic_exchange_acq_rel_j)
4476 return __atomic_exchange_acq_rel(__obj, __desr);
4477#else
4478 return __choose_exchange_seq_cst(__obj, __desr);
4479#endif
4480}
4481
4482inline _LIBCPP_INLINE_VISIBILITY
4483unsigned int
4484__choose_exchange_release(unsigned int volatile* __obj, unsigned int __desr)
4485{
4486#if __has_feature(__atomic_exchange_release_j)
4487 return __atomic_exchange_release(__obj, __desr);
4488#else
4489 return __choose_exchange_acq_rel(__obj, __desr);
4490#endif
4491}
4492
4493inline _LIBCPP_INLINE_VISIBILITY
4494unsigned int
4495__choose_exchange_acquire(unsigned int volatile* __obj, unsigned int __desr)
4496{
4497#if __has_feature(__atomic_exchange_acquire_j)
4498 return __atomic_exchange_acquire(__obj, __desr);
4499#else
4500 return __choose_exchange_release(__obj, __desr);
4501#endif
4502}
4503
4504inline _LIBCPP_INLINE_VISIBILITY
4505unsigned int
4506__choose_exchange_consume(unsigned int volatile* __obj, unsigned int __desr)
4507{
4508#if __has_feature(__atomic_exchange_consume_j)
4509 return __atomic_exchange_consume(__obj, __desr);
4510#else
4511 return __choose_exchange_acquire(__obj, __desr);
4512#endif
4513}
4514
4515inline _LIBCPP_INLINE_VISIBILITY
4516unsigned int
4517__choose_exchange_relaxed(unsigned int volatile* __obj, unsigned int __desr)
4518{
4519#if __has_feature(__atomic_exchange_relaxed_j)
4520 return __atomic_exchange_relaxed(__obj, __desr);
4521#else
4522 return __choose_exchange_consume(__obj, __desr);
4523#endif
4524}
4525
4526// exchange long
4527
4528inline _LIBCPP_INLINE_VISIBILITY
4529long
4530__choose_exchange_seq_cst(long volatile* __obj, long __desr)
4531{
4532#if __has_feature(__atomic_exchange_seq_cst_l)
4533 return __atomic_exchange_seq_cst(__obj, __desr);
4534#else
4535 return __exchange_seq_cst(__obj, __desr);
4536#endif
4537}
4538
4539inline _LIBCPP_INLINE_VISIBILITY
4540long
4541__choose_exchange_acq_rel(long volatile* __obj, long __desr)
4542{
4543#if __has_feature(__atomic_exchange_acq_rel_l)
4544 return __atomic_exchange_acq_rel(__obj, __desr);
4545#else
4546 return __choose_exchange_seq_cst(__obj, __desr);
4547#endif
4548}
4549
4550inline _LIBCPP_INLINE_VISIBILITY
4551long
4552__choose_exchange_release(long volatile* __obj, long __desr)
4553{
4554#if __has_feature(__atomic_exchange_release_l)
4555 return __atomic_exchange_release(__obj, __desr);
4556#else
4557 return __choose_exchange_acq_rel(__obj, __desr);
4558#endif
4559}
4560
4561inline _LIBCPP_INLINE_VISIBILITY
4562long
4563__choose_exchange_acquire(long volatile* __obj, long __desr)
4564{
4565#if __has_feature(__atomic_exchange_acquire_l)
4566 return __atomic_exchange_acquire(__obj, __desr);
4567#else
4568 return __choose_exchange_release(__obj, __desr);
4569#endif
4570}
4571
4572inline _LIBCPP_INLINE_VISIBILITY
4573long
4574__choose_exchange_consume(long volatile* __obj, long __desr)
4575{
4576#if __has_feature(__atomic_exchange_consume_l)
4577 return __atomic_exchange_consume(__obj, __desr);
4578#else
4579 return __choose_exchange_acquire(__obj, __desr);
4580#endif
4581}
4582
4583inline _LIBCPP_INLINE_VISIBILITY
4584long
4585__choose_exchange_relaxed(long volatile* __obj, long __desr)
4586{
4587#if __has_feature(__atomic_exchange_relaxed_l)
4588 return __atomic_exchange_relaxed(__obj, __desr);
4589#else
4590 return __choose_exchange_consume(__obj, __desr);
4591#endif
4592}
4593
4594// exchange unsigned long
4595
4596inline _LIBCPP_INLINE_VISIBILITY
4597unsigned long
4598__choose_exchange_seq_cst(unsigned long volatile* __obj, unsigned long __desr)
4599{
4600#if __has_feature(__atomic_exchange_seq_cst_m)
4601 return __atomic_exchange_seq_cst(__obj, __desr);
4602#else
4603 return __exchange_seq_cst(__obj, __desr);
4604#endif
4605}
4606
4607inline _LIBCPP_INLINE_VISIBILITY
4608unsigned long
4609__choose_exchange_acq_rel(unsigned long volatile* __obj, unsigned long __desr)
4610{
4611#if __has_feature(__atomic_exchange_acq_rel_m)
4612 return __atomic_exchange_acq_rel(__obj, __desr);
4613#else
4614 return __choose_exchange_seq_cst(__obj, __desr);
4615#endif
4616}
4617
4618inline _LIBCPP_INLINE_VISIBILITY
4619unsigned long
4620__choose_exchange_release(unsigned long volatile* __obj, unsigned long __desr)
4621{
4622#if __has_feature(__atomic_exchange_release_m)
4623 return __atomic_exchange_release(__obj, __desr);
4624#else
4625 return __choose_exchange_acq_rel(__obj, __desr);
4626#endif
4627}
4628
4629inline _LIBCPP_INLINE_VISIBILITY
4630unsigned long
4631__choose_exchange_acquire(unsigned long volatile* __obj, unsigned long __desr)
4632{
4633#if __has_feature(__atomic_exchange_acquire_m)
4634 return __atomic_exchange_acquire(__obj, __desr);
4635#else
4636 return __choose_exchange_release(__obj, __desr);
4637#endif
4638}
4639
4640inline _LIBCPP_INLINE_VISIBILITY
4641unsigned long
4642__choose_exchange_consume(unsigned long volatile* __obj, unsigned long __desr)
4643{
4644#if __has_feature(__atomic_exchange_consume_m)
4645 return __atomic_exchange_consume(__obj, __desr);
4646#else
4647 return __choose_exchange_acquire(__obj, __desr);
4648#endif
4649}
4650
4651inline _LIBCPP_INLINE_VISIBILITY
4652unsigned long
4653__choose_exchange_relaxed(unsigned long volatile* __obj, unsigned long __desr)
4654{
4655#if __has_feature(__atomic_exchange_relaxed_m)
4656 return __atomic_exchange_relaxed(__obj, __desr);
4657#else
4658 return __choose_exchange_consume(__obj, __desr);
4659#endif
4660}
4661
4662// exchange long long
4663
4664inline _LIBCPP_INLINE_VISIBILITY
4665long long
4666__choose_exchange_seq_cst(long long volatile* __obj, long long __desr)
4667{
4668#if __has_feature(__atomic_exchange_seq_cst_x)
4669 return __atomic_exchange_seq_cst(__obj, __desr);
4670#else
4671 return __exchange_seq_cst(__obj, __desr);
4672#endif
4673}
4674
4675inline _LIBCPP_INLINE_VISIBILITY
4676long long
4677__choose_exchange_acq_rel(long long volatile* __obj, long long __desr)
4678{
4679#if __has_feature(__atomic_exchange_acq_rel_x)
4680 return __atomic_exchange_acq_rel(__obj, __desr);
4681#else
4682 return __choose_exchange_seq_cst(__obj, __desr);
4683#endif
4684}
4685
4686inline _LIBCPP_INLINE_VISIBILITY
4687long long
4688__choose_exchange_release(long long volatile* __obj, long long __desr)
4689{
4690#if __has_feature(__atomic_exchange_release_x)
4691 return __atomic_exchange_release(__obj, __desr);
4692#else
4693 return __choose_exchange_acq_rel(__obj, __desr);
4694#endif
4695}
4696
4697inline _LIBCPP_INLINE_VISIBILITY
4698long long
4699__choose_exchange_acquire(long long volatile* __obj, long long __desr)
4700{
4701#if __has_feature(__atomic_exchange_acquire_x)
4702 return __atomic_exchange_acquire(__obj, __desr);
4703#else
4704 return __choose_exchange_release(__obj, __desr);
4705#endif
4706}
4707
4708inline _LIBCPP_INLINE_VISIBILITY
4709long long
4710__choose_exchange_consume(long long volatile* __obj, long long __desr)
4711{
4712#if __has_feature(__atomic_exchange_consume_x)
4713 return __atomic_exchange_consume(__obj, __desr);
4714#else
4715 return __choose_exchange_acquire(__obj, __desr);
4716#endif
4717}
4718
4719inline _LIBCPP_INLINE_VISIBILITY
4720long long
4721__choose_exchange_relaxed(long long volatile* __obj, long long __desr)
4722{
4723#if __has_feature(__atomic_exchange_relaxed_x)
4724 return __atomic_exchange_relaxed(__obj, __desr);
4725#else
4726 return __choose_exchange_consume(__obj, __desr);
4727#endif
4728}
4729
4730// exchange unsigned long long
4731
4732inline _LIBCPP_INLINE_VISIBILITY
4733unsigned long long
4734__choose_exchange_seq_cst(unsigned long long volatile* __obj, unsigned long long __desr)
4735{
4736#if __has_feature(__atomic_exchange_seq_cst_y)
4737 return __atomic_exchange_seq_cst(__obj, __desr);
4738#else
4739 return __exchange_seq_cst(__obj, __desr);
4740#endif
4741}
4742
4743inline _LIBCPP_INLINE_VISIBILITY
4744unsigned long long
4745__choose_exchange_acq_rel(unsigned long long volatile* __obj, unsigned long long __desr)
4746{
4747#if __has_feature(__atomic_exchange_acq_rel_y)
4748 return __atomic_exchange_acq_rel(__obj, __desr);
4749#else
4750 return __choose_exchange_seq_cst(__obj, __desr);
4751#endif
4752}
4753
4754inline _LIBCPP_INLINE_VISIBILITY
4755unsigned long long
4756__choose_exchange_release(unsigned long long volatile* __obj, unsigned long long __desr)
4757{
4758#if __has_feature(__atomic_exchange_release_y)
4759 return __atomic_exchange_release(__obj, __desr);
4760#else
4761 return __choose_exchange_acq_rel(__obj, __desr);
4762#endif
4763}
4764
4765inline _LIBCPP_INLINE_VISIBILITY
4766unsigned long long
4767__choose_exchange_acquire(unsigned long long volatile* __obj, unsigned long long __desr)
4768{
4769#if __has_feature(__atomic_exchange_acquire_y)
4770 return __atomic_exchange_acquire(__obj, __desr);
4771#else
4772 return __choose_exchange_release(__obj, __desr);
4773#endif
4774}
4775
4776inline _LIBCPP_INLINE_VISIBILITY
4777unsigned long long
4778__choose_exchange_consume(unsigned long long volatile* __obj, unsigned long long __desr)
4779{
4780#if __has_feature(__atomic_exchange_consume_y)
4781 return __atomic_exchange_consume(__obj, __desr);
4782#else
4783 return __choose_exchange_acquire(__obj, __desr);
4784#endif
4785}
4786
4787inline _LIBCPP_INLINE_VISIBILITY
4788unsigned long long
4789__choose_exchange_relaxed(unsigned long long volatile* __obj, unsigned long long __desr)
4790{
4791#if __has_feature(__atomic_exchange_relaxed_y)
4792 return __atomic_exchange_relaxed(__obj, __desr);
4793#else
4794 return __choose_exchange_consume(__obj, __desr);
4795#endif
4796}
4797
4798// exchange void*
4799
4800inline _LIBCPP_INLINE_VISIBILITY
4801void*
4802__choose_exchange_seq_cst(void* volatile* __obj, void* __desr)
4803{
4804#if __has_feature(__atomic_exchange_seq_cst_Py)
4805 return __atomic_exchange_seq_cst(__obj, __desr);
4806#else
4807 return __exchange_seq_cst(__obj, __desr);
4808#endif
4809}
4810
4811inline _LIBCPP_INLINE_VISIBILITY
4812void*
4813__choose_exchange_acq_rel(void* volatile* __obj, void* __desr)
4814{
4815#if __has_feature(__atomic_exchange_acq_rel_Py)
4816 return __atomic_exchange_acq_rel(__obj, __desr);
4817#else
4818 return __choose_exchange_seq_cst(__obj, __desr);
4819#endif
4820}
4821
4822inline _LIBCPP_INLINE_VISIBILITY
4823void*
4824__choose_exchange_release(void* volatile* __obj, void* __desr)
4825{
4826#if __has_feature(__atomic_exchange_release_Py)
4827 return __atomic_exchange_release(__obj, __desr);
4828#else
4829 return __choose_exchange_acq_rel(__obj, __desr);
4830#endif
4831}
4832
4833inline _LIBCPP_INLINE_VISIBILITY
4834void*
4835__choose_exchange_acquire(void* volatile* __obj, void* __desr)
4836{
4837#if __has_feature(__atomic_exchange_acquire_Py)
4838 return __atomic_exchange_acquire(__obj, __desr);
4839#else
4840 return __choose_exchange_release(__obj, __desr);
4841#endif
4842}
4843
4844inline _LIBCPP_INLINE_VISIBILITY
4845void*
4846__choose_exchange_consume(void* volatile* __obj, void* __desr)
4847{
4848#if __has_feature(__atomic_exchange_consume_Py)
4849 return __atomic_exchange_consume(__obj, __desr);
4850#else
4851 return __choose_exchange_acquire(__obj, __desr);
4852#endif
4853}
4854
4855inline _LIBCPP_INLINE_VISIBILITY
4856void*
4857__choose_exchange_relaxed(void* volatile* __obj, void* __desr)
4858{
4859#if __has_feature(__atomic_exchange_relaxed_Py)
4860 return __atomic_exchange_relaxed(__obj, __desr);
4861#else
4862 return __choose_exchange_consume(__obj, __desr);
4863#endif
4864}
4865
Howard Hinnant611fdaf2010-10-04 18:52:54 +00004866// compare_exchange_strong
4867
4868template <class _Tp>
4869bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00004870__compare_exchange_strong_seq_cst_seq_cst(_Tp volatile* __obj, _Tp* __exp,
Howard Hinnant611fdaf2010-10-04 18:52:54 +00004871 _Tp __desr)
4872{
4873 unique_lock<mutex> _(__not_atomic_mut());
4874 if (_STD::memcmp(const_cast<_Tp*>(__obj), __exp, sizeof(_Tp)) == 0)
4875 {
4876 _STD::memcpy(const_cast<_Tp*>(__obj), &__desr, sizeof(_Tp));
4877 return true;
4878 }
4879 _STD::memcpy(__exp, const_cast<_Tp*>(__obj), sizeof(_Tp));
4880 return false;
4881}
4882
4883// compare_exchange_strong bool
4884
4885inline _LIBCPP_INLINE_VISIBILITY
4886bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00004887__choose_compare_exchange_strong_seq_cst_seq_cst(bool volatile* __obj,
4888 bool* __exp,
4889 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00004890{
4891#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_b)
4892 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
4893 __desr);
4894#else
4895 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
4896#endif
4897}
4898
4899inline _LIBCPP_INLINE_VISIBILITY
4900bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00004901__choose_compare_exchange_strong_seq_cst_acquire(bool volatile* __obj,
4902 bool* __exp,
4903 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00004904{
4905#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_b)
4906 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
4907 __desr);
4908#else
4909 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
4910 __desr);
4911#endif
4912}
4913
4914inline _LIBCPP_INLINE_VISIBILITY
4915bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00004916__choose_compare_exchange_strong_seq_cst_consume(bool volatile* __obj,
4917 bool* __exp,
4918 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00004919{
4920#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_b)
4921 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
4922 __desr);
4923#else
4924 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
4925 __desr);
4926#endif
4927}
4928
4929inline _LIBCPP_INLINE_VISIBILITY
4930bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00004931__choose_compare_exchange_strong_seq_cst_relaxed(bool volatile* __obj,
4932 bool* __exp,
4933 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00004934{
4935#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_b)
4936 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
4937 __desr);
4938#else
4939 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
4940 __desr);
4941#endif
4942}
4943
4944inline _LIBCPP_INLINE_VISIBILITY
4945bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00004946__choose_compare_exchange_strong_acq_rel_acquire(bool volatile* __obj,
4947 bool* __exp,
4948 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00004949{
4950#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_b)
4951 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
4952 __desr);
4953#else
4954 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
4955 __desr);
4956#endif
4957}
4958
4959inline _LIBCPP_INLINE_VISIBILITY
4960bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00004961__choose_compare_exchange_strong_acq_rel_consume(bool volatile* __obj,
4962 bool* __exp,
4963 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00004964{
4965#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_b)
4966 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
4967 __desr);
4968#else
4969 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
4970 __desr);
4971#endif
4972}
4973
4974inline _LIBCPP_INLINE_VISIBILITY
4975bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00004976__choose_compare_exchange_strong_acq_rel_relaxed(bool volatile* __obj,
4977 bool* __exp,
4978 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00004979{
4980#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_b)
4981 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
4982 __desr);
4983#else
4984 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
4985 __desr);
4986#endif
4987}
4988
4989inline _LIBCPP_INLINE_VISIBILITY
4990bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00004991__choose_compare_exchange_strong_release_acquire(bool volatile* __obj,
4992 bool* __exp,
4993 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00004994{
4995#if __has_feature(__atomic_compare_exchange_strong_release_acquire_b)
4996 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
4997 __desr);
4998#else
4999 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5000 __desr);
5001#endif
5002}
5003
5004inline _LIBCPP_INLINE_VISIBILITY
5005bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00005006__choose_compare_exchange_strong_release_consume(bool volatile* __obj,
5007 bool* __exp,
5008 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00005009{
5010#if __has_feature(__atomic_compare_exchange_strong_release_consume_b)
5011 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
5012 __desr);
5013#else
5014 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
5015 __desr);
5016#endif
5017}
5018
5019inline _LIBCPP_INLINE_VISIBILITY
5020bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00005021__choose_compare_exchange_strong_release_relaxed(bool volatile* __obj,
5022 bool* __exp,
5023 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00005024{
5025#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_b)
5026 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
5027 __desr);
5028#else
5029 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
5030 __desr);
5031#endif
5032}
5033
5034inline _LIBCPP_INLINE_VISIBILITY
5035bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00005036__choose_compare_exchange_strong_acquire_acquire(bool volatile* __obj,
5037 bool* __exp,
5038 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00005039{
5040#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_b)
5041 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
5042 __desr);
5043#else
5044 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
5045 __desr);
5046#endif
5047}
5048
5049inline _LIBCPP_INLINE_VISIBILITY
5050bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00005051__choose_compare_exchange_strong_acquire_consume(bool volatile* __obj,
5052 bool* __exp,
5053 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00005054{
5055#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_b)
5056 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
5057 __desr);
5058#else
5059 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
5060 __desr);
5061#endif
5062}
5063
5064inline _LIBCPP_INLINE_VISIBILITY
5065bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00005066__choose_compare_exchange_strong_acquire_relaxed(bool volatile* __obj,
5067 bool* __exp,
5068 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00005069{
5070#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_b)
5071 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
5072 __desr);
5073#else
5074 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
5075 __desr);
5076#endif
5077}
5078
5079inline _LIBCPP_INLINE_VISIBILITY
5080bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00005081__choose_compare_exchange_strong_consume_consume(bool volatile* __obj,
5082 bool* __exp,
5083 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00005084{
5085#if __has_feature(__atomic_compare_exchange_strong_consume_consume_b)
5086 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
5087 __desr);
5088#else
5089 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
5090 __desr);
5091#endif
5092}
5093
5094inline _LIBCPP_INLINE_VISIBILITY
5095bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00005096__choose_compare_exchange_strong_consume_relaxed(bool volatile* __obj,
5097 bool* __exp,
5098 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00005099{
5100#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_b)
5101 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
5102 __desr);
5103#else
5104 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
5105 __desr);
5106#endif
5107}
5108
5109inline _LIBCPP_INLINE_VISIBILITY
5110bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00005111__choose_compare_exchange_strong_relaxed_relaxed(bool volatile* __obj,
5112 bool* __exp,
5113 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00005114{
5115#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_b)
5116 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
5117 __desr);
5118#else
5119 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
5120 __desr);
5121#endif
5122}
5123
Howard Hinnant002f1d32010-10-04 23:55:35 +00005124// compare_exchange_strong char
5125
5126inline _LIBCPP_INLINE_VISIBILITY
5127bool
5128__choose_compare_exchange_strong_seq_cst_seq_cst(char volatile* __obj,
5129 char* __exp,
5130 char __desr)
5131{
5132#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_c)
5133 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
5134 __desr);
5135#else
5136 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
5137#endif
5138}
5139
5140inline _LIBCPP_INLINE_VISIBILITY
5141bool
5142__choose_compare_exchange_strong_seq_cst_acquire(char volatile* __obj,
5143 char* __exp,
5144 char __desr)
5145{
5146#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_c)
5147 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
5148 __desr);
5149#else
5150 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
5151 __desr);
5152#endif
5153}
5154
5155inline _LIBCPP_INLINE_VISIBILITY
5156bool
5157__choose_compare_exchange_strong_seq_cst_consume(char volatile* __obj,
5158 char* __exp,
5159 char __desr)
5160{
5161#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_c)
5162 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
5163 __desr);
5164#else
5165 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
5166 __desr);
5167#endif
5168}
5169
5170inline _LIBCPP_INLINE_VISIBILITY
5171bool
5172__choose_compare_exchange_strong_seq_cst_relaxed(char volatile* __obj,
5173 char* __exp,
5174 char __desr)
5175{
5176#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_c)
5177 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
5178 __desr);
5179#else
5180 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
5181 __desr);
5182#endif
5183}
5184
5185inline _LIBCPP_INLINE_VISIBILITY
5186bool
5187__choose_compare_exchange_strong_acq_rel_acquire(char volatile* __obj,
5188 char* __exp,
5189 char __desr)
5190{
5191#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_c)
5192 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5193 __desr);
5194#else
5195 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
5196 __desr);
5197#endif
5198}
5199
5200inline _LIBCPP_INLINE_VISIBILITY
5201bool
5202__choose_compare_exchange_strong_acq_rel_consume(char volatile* __obj,
5203 char* __exp,
5204 char __desr)
5205{
5206#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_c)
5207 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
5208 __desr);
5209#else
5210 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5211 __desr);
5212#endif
5213}
5214
5215inline _LIBCPP_INLINE_VISIBILITY
5216bool
5217__choose_compare_exchange_strong_acq_rel_relaxed(char volatile* __obj,
5218 char* __exp,
5219 char __desr)
5220{
5221#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_c)
5222 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
5223 __desr);
5224#else
5225 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
5226 __desr);
5227#endif
5228}
5229
5230inline _LIBCPP_INLINE_VISIBILITY
5231bool
5232__choose_compare_exchange_strong_release_acquire(char volatile* __obj,
5233 char* __exp,
5234 char __desr)
5235{
5236#if __has_feature(__atomic_compare_exchange_strong_release_acquire_c)
5237 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
5238 __desr);
5239#else
5240 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5241 __desr);
5242#endif
5243}
5244
5245inline _LIBCPP_INLINE_VISIBILITY
5246bool
5247__choose_compare_exchange_strong_release_consume(char volatile* __obj,
5248 char* __exp,
5249 char __desr)
5250{
5251#if __has_feature(__atomic_compare_exchange_strong_release_consume_c)
5252 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
5253 __desr);
5254#else
5255 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
5256 __desr);
5257#endif
5258}
5259
5260inline _LIBCPP_INLINE_VISIBILITY
5261bool
5262__choose_compare_exchange_strong_release_relaxed(char volatile* __obj,
5263 char* __exp,
5264 char __desr)
5265{
5266#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_c)
5267 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
5268 __desr);
5269#else
5270 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
5271 __desr);
5272#endif
5273}
5274
5275inline _LIBCPP_INLINE_VISIBILITY
5276bool
5277__choose_compare_exchange_strong_acquire_acquire(char volatile* __obj,
5278 char* __exp,
5279 char __desr)
5280{
5281#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_c)
5282 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
5283 __desr);
5284#else
5285 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
5286 __desr);
5287#endif
5288}
5289
5290inline _LIBCPP_INLINE_VISIBILITY
5291bool
5292__choose_compare_exchange_strong_acquire_consume(char volatile* __obj,
5293 char* __exp,
5294 char __desr)
5295{
5296#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_c)
5297 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
5298 __desr);
5299#else
5300 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
5301 __desr);
5302#endif
5303}
5304
5305inline _LIBCPP_INLINE_VISIBILITY
5306bool
5307__choose_compare_exchange_strong_acquire_relaxed(char volatile* __obj,
5308 char* __exp,
5309 char __desr)
5310{
5311#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_c)
5312 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
5313 __desr);
5314#else
5315 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
5316 __desr);
5317#endif
5318}
5319
5320inline _LIBCPP_INLINE_VISIBILITY
5321bool
5322__choose_compare_exchange_strong_consume_consume(char volatile* __obj,
5323 char* __exp,
5324 char __desr)
5325{
5326#if __has_feature(__atomic_compare_exchange_strong_consume_consume_c)
5327 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
5328 __desr);
5329#else
5330 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
5331 __desr);
5332#endif
5333}
5334
5335inline _LIBCPP_INLINE_VISIBILITY
5336bool
5337__choose_compare_exchange_strong_consume_relaxed(char volatile* __obj,
5338 char* __exp,
5339 char __desr)
5340{
5341#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_c)
5342 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
5343 __desr);
5344#else
5345 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
5346 __desr);
5347#endif
5348}
5349
5350inline _LIBCPP_INLINE_VISIBILITY
5351bool
5352__choose_compare_exchange_strong_relaxed_relaxed(char volatile* __obj,
5353 char* __exp,
5354 char __desr)
5355{
5356#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_c)
5357 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
5358 __desr);
5359#else
5360 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
5361 __desr);
5362#endif
5363}
5364
5365// compare_exchange_strong signed char
5366
5367inline _LIBCPP_INLINE_VISIBILITY
5368bool
5369__choose_compare_exchange_strong_seq_cst_seq_cst(signed char volatile* __obj,
5370 signed char* __exp,
5371 signed char __desr)
5372{
5373#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_a)
5374 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
5375 __desr);
5376#else
5377 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
5378#endif
5379}
5380
5381inline _LIBCPP_INLINE_VISIBILITY
5382bool
5383__choose_compare_exchange_strong_seq_cst_acquire(signed char volatile* __obj,
5384 signed char* __exp,
5385 signed char __desr)
5386{
5387#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_a)
5388 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
5389 __desr);
5390#else
5391 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
5392 __desr);
5393#endif
5394}
5395
5396inline _LIBCPP_INLINE_VISIBILITY
5397bool
5398__choose_compare_exchange_strong_seq_cst_consume(signed char volatile* __obj,
5399 signed char* __exp,
5400 signed char __desr)
5401{
5402#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_a)
5403 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
5404 __desr);
5405#else
5406 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
5407 __desr);
5408#endif
5409}
5410
5411inline _LIBCPP_INLINE_VISIBILITY
5412bool
5413__choose_compare_exchange_strong_seq_cst_relaxed(signed char volatile* __obj,
5414 signed char* __exp,
5415 signed char __desr)
5416{
5417#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_a)
5418 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
5419 __desr);
5420#else
5421 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
5422 __desr);
5423#endif
5424}
5425
5426inline _LIBCPP_INLINE_VISIBILITY
5427bool
5428__choose_compare_exchange_strong_acq_rel_acquire(signed char volatile* __obj,
5429 signed char* __exp,
5430 signed char __desr)
5431{
5432#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_a)
5433 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5434 __desr);
5435#else
5436 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
5437 __desr);
5438#endif
5439}
5440
5441inline _LIBCPP_INLINE_VISIBILITY
5442bool
5443__choose_compare_exchange_strong_acq_rel_consume(signed char volatile* __obj,
5444 signed char* __exp,
5445 signed char __desr)
5446{
5447#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_a)
5448 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
5449 __desr);
5450#else
5451 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5452 __desr);
5453#endif
5454}
5455
5456inline _LIBCPP_INLINE_VISIBILITY
5457bool
5458__choose_compare_exchange_strong_acq_rel_relaxed(signed char volatile* __obj,
5459 signed char* __exp,
5460 signed char __desr)
5461{
5462#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_a)
5463 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
5464 __desr);
5465#else
5466 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
5467 __desr);
5468#endif
5469}
5470
5471inline _LIBCPP_INLINE_VISIBILITY
5472bool
5473__choose_compare_exchange_strong_release_acquire(signed char volatile* __obj,
5474 signed char* __exp,
5475 signed char __desr)
5476{
5477#if __has_feature(__atomic_compare_exchange_strong_release_acquire_a)
5478 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
5479 __desr);
5480#else
5481 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5482 __desr);
5483#endif
5484}
5485
5486inline _LIBCPP_INLINE_VISIBILITY
5487bool
5488__choose_compare_exchange_strong_release_consume(signed char volatile* __obj,
5489 signed char* __exp,
5490 signed char __desr)
5491{
5492#if __has_feature(__atomic_compare_exchange_strong_release_consume_a)
5493 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
5494 __desr);
5495#else
5496 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
5497 __desr);
5498#endif
5499}
5500
5501inline _LIBCPP_INLINE_VISIBILITY
5502bool
5503__choose_compare_exchange_strong_release_relaxed(signed char volatile* __obj,
5504 signed char* __exp,
5505 signed char __desr)
5506{
5507#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_a)
5508 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
5509 __desr);
5510#else
5511 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
5512 __desr);
5513#endif
5514}
5515
5516inline _LIBCPP_INLINE_VISIBILITY
5517bool
5518__choose_compare_exchange_strong_acquire_acquire(signed char volatile* __obj,
5519 signed char* __exp,
5520 signed char __desr)
5521{
5522#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_a)
5523 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
5524 __desr);
5525#else
5526 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
5527 __desr);
5528#endif
5529}
5530
5531inline _LIBCPP_INLINE_VISIBILITY
5532bool
5533__choose_compare_exchange_strong_acquire_consume(signed char volatile* __obj,
5534 signed char* __exp,
5535 signed char __desr)
5536{
5537#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_a)
5538 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
5539 __desr);
5540#else
5541 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
5542 __desr);
5543#endif
5544}
5545
5546inline _LIBCPP_INLINE_VISIBILITY
5547bool
5548__choose_compare_exchange_strong_acquire_relaxed(signed char volatile* __obj,
5549 signed char* __exp,
5550 signed char __desr)
5551{
5552#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_a)
5553 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
5554 __desr);
5555#else
5556 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
5557 __desr);
5558#endif
5559}
5560
5561inline _LIBCPP_INLINE_VISIBILITY
5562bool
5563__choose_compare_exchange_strong_consume_consume(signed char volatile* __obj,
5564 signed char* __exp,
5565 signed char __desr)
5566{
5567#if __has_feature(__atomic_compare_exchange_strong_consume_consume_a)
5568 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
5569 __desr);
5570#else
5571 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
5572 __desr);
5573#endif
5574}
5575
5576inline _LIBCPP_INLINE_VISIBILITY
5577bool
5578__choose_compare_exchange_strong_consume_relaxed(signed char volatile* __obj,
5579 signed char* __exp,
5580 signed char __desr)
5581{
5582#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_a)
5583 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
5584 __desr);
5585#else
5586 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
5587 __desr);
5588#endif
5589}
5590
5591inline _LIBCPP_INLINE_VISIBILITY
5592bool
5593__choose_compare_exchange_strong_relaxed_relaxed(signed char volatile* __obj,
5594 signed char* __exp,
5595 signed char __desr)
5596{
5597#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_a)
5598 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
5599 __desr);
5600#else
5601 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
5602 __desr);
5603#endif
5604}
5605
5606// compare_exchange_strong unsigned char
5607
5608inline _LIBCPP_INLINE_VISIBILITY
5609bool
5610__choose_compare_exchange_strong_seq_cst_seq_cst(unsigned char volatile* __obj,
5611 unsigned char* __exp,
5612 unsigned char __desr)
5613{
5614#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_h)
5615 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
5616 __desr);
5617#else
5618 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
5619#endif
5620}
5621
5622inline _LIBCPP_INLINE_VISIBILITY
5623bool
5624__choose_compare_exchange_strong_seq_cst_acquire(unsigned char volatile* __obj,
5625 unsigned char* __exp,
5626 unsigned char __desr)
5627{
5628#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_h)
5629 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
5630 __desr);
5631#else
5632 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
5633 __desr);
5634#endif
5635}
5636
5637inline _LIBCPP_INLINE_VISIBILITY
5638bool
5639__choose_compare_exchange_strong_seq_cst_consume(unsigned char volatile* __obj,
5640 unsigned char* __exp,
5641 unsigned char __desr)
5642{
5643#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_h)
5644 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
5645 __desr);
5646#else
5647 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
5648 __desr);
5649#endif
5650}
5651
5652inline _LIBCPP_INLINE_VISIBILITY
5653bool
5654__choose_compare_exchange_strong_seq_cst_relaxed(unsigned char volatile* __obj,
5655 unsigned char* __exp,
5656 unsigned char __desr)
5657{
5658#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_h)
5659 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
5660 __desr);
5661#else
5662 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
5663 __desr);
5664#endif
5665}
5666
5667inline _LIBCPP_INLINE_VISIBILITY
5668bool
5669__choose_compare_exchange_strong_acq_rel_acquire(unsigned char volatile* __obj,
5670 unsigned char* __exp,
5671 unsigned char __desr)
5672{
5673#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_h)
5674 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5675 __desr);
5676#else
5677 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
5678 __desr);
5679#endif
5680}
5681
5682inline _LIBCPP_INLINE_VISIBILITY
5683bool
5684__choose_compare_exchange_strong_acq_rel_consume(unsigned char volatile* __obj,
5685 unsigned char* __exp,
5686 unsigned char __desr)
5687{
5688#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_h)
5689 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
5690 __desr);
5691#else
5692 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5693 __desr);
5694#endif
5695}
5696
5697inline _LIBCPP_INLINE_VISIBILITY
5698bool
5699__choose_compare_exchange_strong_acq_rel_relaxed(unsigned char volatile* __obj,
5700 unsigned char* __exp,
5701 unsigned char __desr)
5702{
5703#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_h)
5704 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
5705 __desr);
5706#else
5707 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
5708 __desr);
5709#endif
5710}
5711
5712inline _LIBCPP_INLINE_VISIBILITY
5713bool
5714__choose_compare_exchange_strong_release_acquire(unsigned char volatile* __obj,
5715 unsigned char* __exp,
5716 unsigned char __desr)
5717{
5718#if __has_feature(__atomic_compare_exchange_strong_release_acquire_h)
5719 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
5720 __desr);
5721#else
5722 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5723 __desr);
5724#endif
5725}
5726
5727inline _LIBCPP_INLINE_VISIBILITY
5728bool
5729__choose_compare_exchange_strong_release_consume(unsigned char volatile* __obj,
5730 unsigned char* __exp,
5731 unsigned char __desr)
5732{
5733#if __has_feature(__atomic_compare_exchange_strong_release_consume_h)
5734 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
5735 __desr);
5736#else
5737 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
5738 __desr);
5739#endif
5740}
5741
5742inline _LIBCPP_INLINE_VISIBILITY
5743bool
5744__choose_compare_exchange_strong_release_relaxed(unsigned char volatile* __obj,
5745 unsigned char* __exp,
5746 unsigned char __desr)
5747{
5748#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_h)
5749 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
5750 __desr);
5751#else
5752 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
5753 __desr);
5754#endif
5755}
5756
5757inline _LIBCPP_INLINE_VISIBILITY
5758bool
5759__choose_compare_exchange_strong_acquire_acquire(unsigned char volatile* __obj,
5760 unsigned char* __exp,
5761 unsigned char __desr)
5762{
5763#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_h)
5764 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
5765 __desr);
5766#else
5767 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
5768 __desr);
5769#endif
5770}
5771
5772inline _LIBCPP_INLINE_VISIBILITY
5773bool
5774__choose_compare_exchange_strong_acquire_consume(unsigned char volatile* __obj,
5775 unsigned char* __exp,
5776 unsigned char __desr)
5777{
5778#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_h)
5779 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
5780 __desr);
5781#else
5782 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
5783 __desr);
5784#endif
5785}
5786
5787inline _LIBCPP_INLINE_VISIBILITY
5788bool
5789__choose_compare_exchange_strong_acquire_relaxed(unsigned char volatile* __obj,
5790 unsigned char* __exp,
5791 unsigned char __desr)
5792{
5793#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_h)
5794 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
5795 __desr);
5796#else
5797 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
5798 __desr);
5799#endif
5800}
5801
5802inline _LIBCPP_INLINE_VISIBILITY
5803bool
5804__choose_compare_exchange_strong_consume_consume(unsigned char volatile* __obj,
5805 unsigned char* __exp,
5806 unsigned char __desr)
5807{
5808#if __has_feature(__atomic_compare_exchange_strong_consume_consume_h)
5809 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
5810 __desr);
5811#else
5812 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
5813 __desr);
5814#endif
5815}
5816
5817inline _LIBCPP_INLINE_VISIBILITY
5818bool
5819__choose_compare_exchange_strong_consume_relaxed(unsigned char volatile* __obj,
5820 unsigned char* __exp,
5821 unsigned char __desr)
5822{
5823#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_h)
5824 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
5825 __desr);
5826#else
5827 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
5828 __desr);
5829#endif
5830}
5831
5832inline _LIBCPP_INLINE_VISIBILITY
5833bool
5834__choose_compare_exchange_strong_relaxed_relaxed(unsigned char volatile* __obj,
5835 unsigned char* __exp,
5836 unsigned char __desr)
5837{
5838#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_h)
5839 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
5840 __desr);
5841#else
5842 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
5843 __desr);
5844#endif
5845}
5846
5847#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
5848
5849// compare_exchange_strong char16_t
5850
5851inline _LIBCPP_INLINE_VISIBILITY
5852bool
5853__choose_compare_exchange_strong_seq_cst_seq_cst(char16_t volatile* __obj,
5854 char16_t* __exp,
5855 char16_t __desr)
5856{
5857#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_Ds)
5858 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
5859 __desr);
5860#else
5861 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
5862#endif
5863}
5864
5865inline _LIBCPP_INLINE_VISIBILITY
5866bool
5867__choose_compare_exchange_strong_seq_cst_acquire(char16_t volatile* __obj,
5868 char16_t* __exp,
5869 char16_t __desr)
5870{
5871#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_Ds)
5872 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
5873 __desr);
5874#else
5875 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
5876 __desr);
5877#endif
5878}
5879
5880inline _LIBCPP_INLINE_VISIBILITY
5881bool
5882__choose_compare_exchange_strong_seq_cst_consume(char16_t volatile* __obj,
5883 char16_t* __exp,
5884 char16_t __desr)
5885{
5886#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_Ds)
5887 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
5888 __desr);
5889#else
5890 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
5891 __desr);
5892#endif
5893}
5894
5895inline _LIBCPP_INLINE_VISIBILITY
5896bool
5897__choose_compare_exchange_strong_seq_cst_relaxed(char16_t volatile* __obj,
5898 char16_t* __exp,
5899 char16_t __desr)
5900{
5901#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_Ds)
5902 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
5903 __desr);
5904#else
5905 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
5906 __desr);
5907#endif
5908}
5909
5910inline _LIBCPP_INLINE_VISIBILITY
5911bool
5912__choose_compare_exchange_strong_acq_rel_acquire(char16_t volatile* __obj,
5913 char16_t* __exp,
5914 char16_t __desr)
5915{
5916#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_Ds)
5917 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5918 __desr);
5919#else
5920 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
5921 __desr);
5922#endif
5923}
5924
5925inline _LIBCPP_INLINE_VISIBILITY
5926bool
5927__choose_compare_exchange_strong_acq_rel_consume(char16_t volatile* __obj,
5928 char16_t* __exp,
5929 char16_t __desr)
5930{
5931#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_Ds)
5932 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
5933 __desr);
5934#else
5935 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5936 __desr);
5937#endif
5938}
5939
5940inline _LIBCPP_INLINE_VISIBILITY
5941bool
5942__choose_compare_exchange_strong_acq_rel_relaxed(char16_t volatile* __obj,
5943 char16_t* __exp,
5944 char16_t __desr)
5945{
5946#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_Ds)
5947 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
5948 __desr);
5949#else
5950 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
5951 __desr);
5952#endif
5953}
5954
5955inline _LIBCPP_INLINE_VISIBILITY
5956bool
5957__choose_compare_exchange_strong_release_acquire(char16_t volatile* __obj,
5958 char16_t* __exp,
5959 char16_t __desr)
5960{
5961#if __has_feature(__atomic_compare_exchange_strong_release_acquire_Ds)
5962 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
5963 __desr);
5964#else
5965 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
5966 __desr);
5967#endif
5968}
5969
5970inline _LIBCPP_INLINE_VISIBILITY
5971bool
5972__choose_compare_exchange_strong_release_consume(char16_t volatile* __obj,
5973 char16_t* __exp,
5974 char16_t __desr)
5975{
5976#if __has_feature(__atomic_compare_exchange_strong_release_consume_Ds)
5977 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
5978 __desr);
5979#else
5980 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
5981 __desr);
5982#endif
5983}
5984
5985inline _LIBCPP_INLINE_VISIBILITY
5986bool
5987__choose_compare_exchange_strong_release_relaxed(char16_t volatile* __obj,
5988 char16_t* __exp,
5989 char16_t __desr)
5990{
5991#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_Ds)
5992 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
5993 __desr);
5994#else
5995 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
5996 __desr);
5997#endif
5998}
5999
6000inline _LIBCPP_INLINE_VISIBILITY
6001bool
6002__choose_compare_exchange_strong_acquire_acquire(char16_t volatile* __obj,
6003 char16_t* __exp,
6004 char16_t __desr)
6005{
6006#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_Ds)
6007 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
6008 __desr);
6009#else
6010 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
6011 __desr);
6012#endif
6013}
6014
6015inline _LIBCPP_INLINE_VISIBILITY
6016bool
6017__choose_compare_exchange_strong_acquire_consume(char16_t volatile* __obj,
6018 char16_t* __exp,
6019 char16_t __desr)
6020{
6021#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_Ds)
6022 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
6023 __desr);
6024#else
6025 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
6026 __desr);
6027#endif
6028}
6029
6030inline _LIBCPP_INLINE_VISIBILITY
6031bool
6032__choose_compare_exchange_strong_acquire_relaxed(char16_t volatile* __obj,
6033 char16_t* __exp,
6034 char16_t __desr)
6035{
6036#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_Ds)
6037 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
6038 __desr);
6039#else
6040 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
6041 __desr);
6042#endif
6043}
6044
6045inline _LIBCPP_INLINE_VISIBILITY
6046bool
6047__choose_compare_exchange_strong_consume_consume(char16_t volatile* __obj,
6048 char16_t* __exp,
6049 char16_t __desr)
6050{
6051#if __has_feature(__atomic_compare_exchange_strong_consume_consume_Ds)
6052 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
6053 __desr);
6054#else
6055 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
6056 __desr);
6057#endif
6058}
6059
6060inline _LIBCPP_INLINE_VISIBILITY
6061bool
6062__choose_compare_exchange_strong_consume_relaxed(char16_t volatile* __obj,
6063 char16_t* __exp,
6064 char16_t __desr)
6065{
6066#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_Ds)
6067 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
6068 __desr);
6069#else
6070 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
6071 __desr);
6072#endif
6073}
6074
6075inline _LIBCPP_INLINE_VISIBILITY
6076bool
6077__choose_compare_exchange_strong_relaxed_relaxed(char16_t volatile* __obj,
6078 char16_t* __exp,
6079 char16_t __desr)
6080{
6081#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_Ds)
6082 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
6083 __desr);
6084#else
6085 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
6086 __desr);
6087#endif
6088}
6089
6090// compare_exchange_strong char32_t
6091
6092inline _LIBCPP_INLINE_VISIBILITY
6093bool
6094__choose_compare_exchange_strong_seq_cst_seq_cst(char32_t volatile* __obj,
6095 char32_t* __exp,
6096 char32_t __desr)
6097{
6098#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_Di)
6099 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
6100 __desr);
6101#else
6102 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
6103#endif
6104}
6105
6106inline _LIBCPP_INLINE_VISIBILITY
6107bool
6108__choose_compare_exchange_strong_seq_cst_acquire(char32_t volatile* __obj,
6109 char32_t* __exp,
6110 char32_t __desr)
6111{
6112#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_Di)
6113 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
6114 __desr);
6115#else
6116 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
6117 __desr);
6118#endif
6119}
6120
6121inline _LIBCPP_INLINE_VISIBILITY
6122bool
6123__choose_compare_exchange_strong_seq_cst_consume(char32_t volatile* __obj,
6124 char32_t* __exp,
6125 char32_t __desr)
6126{
6127#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_Di)
6128 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
6129 __desr);
6130#else
6131 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
6132 __desr);
6133#endif
6134}
6135
6136inline _LIBCPP_INLINE_VISIBILITY
6137bool
6138__choose_compare_exchange_strong_seq_cst_relaxed(char32_t volatile* __obj,
6139 char32_t* __exp,
6140 char32_t __desr)
6141{
6142#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_Di)
6143 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
6144 __desr);
6145#else
6146 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
6147 __desr);
6148#endif
6149}
6150
6151inline _LIBCPP_INLINE_VISIBILITY
6152bool
6153__choose_compare_exchange_strong_acq_rel_acquire(char32_t volatile* __obj,
6154 char32_t* __exp,
6155 char32_t __desr)
6156{
6157#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_Di)
6158 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
6159 __desr);
6160#else
6161 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
6162 __desr);
6163#endif
6164}
6165
6166inline _LIBCPP_INLINE_VISIBILITY
6167bool
6168__choose_compare_exchange_strong_acq_rel_consume(char32_t volatile* __obj,
6169 char32_t* __exp,
6170 char32_t __desr)
6171{
6172#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_Di)
6173 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
6174 __desr);
6175#else
6176 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
6177 __desr);
6178#endif
6179}
6180
6181inline _LIBCPP_INLINE_VISIBILITY
6182bool
6183__choose_compare_exchange_strong_acq_rel_relaxed(char32_t volatile* __obj,
6184 char32_t* __exp,
6185 char32_t __desr)
6186{
6187#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_Di)
6188 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
6189 __desr);
6190#else
6191 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
6192 __desr);
6193#endif
6194}
6195
6196inline _LIBCPP_INLINE_VISIBILITY
6197bool
6198__choose_compare_exchange_strong_release_acquire(char32_t volatile* __obj,
6199 char32_t* __exp,
6200 char32_t __desr)
6201{
6202#if __has_feature(__atomic_compare_exchange_strong_release_acquire_Di)
6203 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
6204 __desr);
6205#else
6206 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
6207 __desr);
6208#endif
6209}
6210
6211inline _LIBCPP_INLINE_VISIBILITY
6212bool
6213__choose_compare_exchange_strong_release_consume(char32_t volatile* __obj,
6214 char32_t* __exp,
6215 char32_t __desr)
6216{
6217#if __has_feature(__atomic_compare_exchange_strong_release_consume_Di)
6218 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
6219 __desr);
6220#else
6221 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
6222 __desr);
6223#endif
6224}
6225
6226inline _LIBCPP_INLINE_VISIBILITY
6227bool
6228__choose_compare_exchange_strong_release_relaxed(char32_t volatile* __obj,
6229 char32_t* __exp,
6230 char32_t __desr)
6231{
6232#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_Di)
6233 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
6234 __desr);
6235#else
6236 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
6237 __desr);
6238#endif
6239}
6240
6241inline _LIBCPP_INLINE_VISIBILITY
6242bool
6243__choose_compare_exchange_strong_acquire_acquire(char32_t volatile* __obj,
6244 char32_t* __exp,
6245 char32_t __desr)
6246{
6247#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_Di)
6248 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
6249 __desr);
6250#else
6251 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
6252 __desr);
6253#endif
6254}
6255
6256inline _LIBCPP_INLINE_VISIBILITY
6257bool
6258__choose_compare_exchange_strong_acquire_consume(char32_t volatile* __obj,
6259 char32_t* __exp,
6260 char32_t __desr)
6261{
6262#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_Di)
6263 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
6264 __desr);
6265#else
6266 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
6267 __desr);
6268#endif
6269}
6270
6271inline _LIBCPP_INLINE_VISIBILITY
6272bool
6273__choose_compare_exchange_strong_acquire_relaxed(char32_t volatile* __obj,
6274 char32_t* __exp,
6275 char32_t __desr)
6276{
6277#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_Di)
6278 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
6279 __desr);
6280#else
6281 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
6282 __desr);
6283#endif
6284}
6285
6286inline _LIBCPP_INLINE_VISIBILITY
6287bool
6288__choose_compare_exchange_strong_consume_consume(char32_t volatile* __obj,
6289 char32_t* __exp,
6290 char32_t __desr)
6291{
6292#if __has_feature(__atomic_compare_exchange_strong_consume_consume_Di)
6293 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
6294 __desr);
6295#else
6296 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
6297 __desr);
6298#endif
6299}
6300
6301inline _LIBCPP_INLINE_VISIBILITY
6302bool
6303__choose_compare_exchange_strong_consume_relaxed(char32_t volatile* __obj,
6304 char32_t* __exp,
6305 char32_t __desr)
6306{
6307#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_Di)
6308 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
6309 __desr);
6310#else
6311 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
6312 __desr);
6313#endif
6314}
6315
6316inline _LIBCPP_INLINE_VISIBILITY
6317bool
6318__choose_compare_exchange_strong_relaxed_relaxed(char32_t volatile* __obj,
6319 char32_t* __exp,
6320 char32_t __desr)
6321{
6322#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_Di)
6323 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
6324 __desr);
6325#else
6326 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
6327 __desr);
6328#endif
6329}
6330
6331#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
6332
6333// compare_exchange_strong wchar_t
6334
6335inline _LIBCPP_INLINE_VISIBILITY
6336bool
6337__choose_compare_exchange_strong_seq_cst_seq_cst(wchar_t volatile* __obj,
6338 wchar_t* __exp,
6339 wchar_t __desr)
6340{
6341#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_w)
6342 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
6343 __desr);
6344#else
6345 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
6346#endif
6347}
6348
6349inline _LIBCPP_INLINE_VISIBILITY
6350bool
6351__choose_compare_exchange_strong_seq_cst_acquire(wchar_t volatile* __obj,
6352 wchar_t* __exp,
6353 wchar_t __desr)
6354{
6355#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_w)
6356 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
6357 __desr);
6358#else
6359 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
6360 __desr);
6361#endif
6362}
6363
6364inline _LIBCPP_INLINE_VISIBILITY
6365bool
6366__choose_compare_exchange_strong_seq_cst_consume(wchar_t volatile* __obj,
6367 wchar_t* __exp,
6368 wchar_t __desr)
6369{
6370#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_w)
6371 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
6372 __desr);
6373#else
6374 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
6375 __desr);
6376#endif
6377}
6378
6379inline _LIBCPP_INLINE_VISIBILITY
6380bool
6381__choose_compare_exchange_strong_seq_cst_relaxed(wchar_t volatile* __obj,
6382 wchar_t* __exp,
6383 wchar_t __desr)
6384{
6385#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_w)
6386 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
6387 __desr);
6388#else
6389 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
6390 __desr);
6391#endif
6392}
6393
6394inline _LIBCPP_INLINE_VISIBILITY
6395bool
6396__choose_compare_exchange_strong_acq_rel_acquire(wchar_t volatile* __obj,
6397 wchar_t* __exp,
6398 wchar_t __desr)
6399{
6400#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_w)
6401 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
6402 __desr);
6403#else
6404 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
6405 __desr);
6406#endif
6407}
6408
6409inline _LIBCPP_INLINE_VISIBILITY
6410bool
6411__choose_compare_exchange_strong_acq_rel_consume(wchar_t volatile* __obj,
6412 wchar_t* __exp,
6413 wchar_t __desr)
6414{
6415#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_w)
6416 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
6417 __desr);
6418#else
6419 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
6420 __desr);
6421#endif
6422}
6423
6424inline _LIBCPP_INLINE_VISIBILITY
6425bool
6426__choose_compare_exchange_strong_acq_rel_relaxed(wchar_t volatile* __obj,
6427 wchar_t* __exp,
6428 wchar_t __desr)
6429{
6430#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_w)
6431 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
6432 __desr);
6433#else
6434 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
6435 __desr);
6436#endif
6437}
6438
6439inline _LIBCPP_INLINE_VISIBILITY
6440bool
6441__choose_compare_exchange_strong_release_acquire(wchar_t volatile* __obj,
6442 wchar_t* __exp,
6443 wchar_t __desr)
6444{
6445#if __has_feature(__atomic_compare_exchange_strong_release_acquire_w)
6446 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
6447 __desr);
6448#else
6449 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
6450 __desr);
6451#endif
6452}
6453
6454inline _LIBCPP_INLINE_VISIBILITY
6455bool
6456__choose_compare_exchange_strong_release_consume(wchar_t volatile* __obj,
6457 wchar_t* __exp,
6458 wchar_t __desr)
6459{
6460#if __has_feature(__atomic_compare_exchange_strong_release_consume_w)
6461 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
6462 __desr);
6463#else
6464 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
6465 __desr);
6466#endif
6467}
6468
6469inline _LIBCPP_INLINE_VISIBILITY
6470bool
6471__choose_compare_exchange_strong_release_relaxed(wchar_t volatile* __obj,
6472 wchar_t* __exp,
6473 wchar_t __desr)
6474{
6475#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_w)
6476 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
6477 __desr);
6478#else
6479 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
6480 __desr);
6481#endif
6482}
6483
6484inline _LIBCPP_INLINE_VISIBILITY
6485bool
6486__choose_compare_exchange_strong_acquire_acquire(wchar_t volatile* __obj,
6487 wchar_t* __exp,
6488 wchar_t __desr)
6489{
6490#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_w)
6491 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
6492 __desr);
6493#else
6494 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
6495 __desr);
6496#endif
6497}
6498
6499inline _LIBCPP_INLINE_VISIBILITY
6500bool
6501__choose_compare_exchange_strong_acquire_consume(wchar_t volatile* __obj,
6502 wchar_t* __exp,
6503 wchar_t __desr)
6504{
6505#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_w)
6506 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
6507 __desr);
6508#else
6509 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
6510 __desr);
6511#endif
6512}
6513
6514inline _LIBCPP_INLINE_VISIBILITY
6515bool
6516__choose_compare_exchange_strong_acquire_relaxed(wchar_t volatile* __obj,
6517 wchar_t* __exp,
6518 wchar_t __desr)
6519{
6520#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_w)
6521 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
6522 __desr);
6523#else
6524 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
6525 __desr);
6526#endif
6527}
6528
6529inline _LIBCPP_INLINE_VISIBILITY
6530bool
6531__choose_compare_exchange_strong_consume_consume(wchar_t volatile* __obj,
6532 wchar_t* __exp,
6533 wchar_t __desr)
6534{
6535#if __has_feature(__atomic_compare_exchange_strong_consume_consume_w)
6536 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
6537 __desr);
6538#else
6539 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
6540 __desr);
6541#endif
6542}
6543
6544inline _LIBCPP_INLINE_VISIBILITY
6545bool
6546__choose_compare_exchange_strong_consume_relaxed(wchar_t volatile* __obj,
6547 wchar_t* __exp,
6548 wchar_t __desr)
6549{
6550#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_w)
6551 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
6552 __desr);
6553#else
6554 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
6555 __desr);
6556#endif
6557}
6558
6559inline _LIBCPP_INLINE_VISIBILITY
6560bool
6561__choose_compare_exchange_strong_relaxed_relaxed(wchar_t volatile* __obj,
6562 wchar_t* __exp,
6563 wchar_t __desr)
6564{
6565#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_w)
6566 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
6567 __desr);
6568#else
6569 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
6570 __desr);
6571#endif
6572}
6573
6574// compare_exchange_strong short
6575
6576inline _LIBCPP_INLINE_VISIBILITY
6577bool
6578__choose_compare_exchange_strong_seq_cst_seq_cst(short volatile* __obj,
6579 short* __exp,
6580 short __desr)
6581{
6582#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_s)
6583 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
6584 __desr);
6585#else
6586 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
6587#endif
6588}
6589
6590inline _LIBCPP_INLINE_VISIBILITY
6591bool
6592__choose_compare_exchange_strong_seq_cst_acquire(short volatile* __obj,
6593 short* __exp,
6594 short __desr)
6595{
6596#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_s)
6597 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
6598 __desr);
6599#else
6600 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
6601 __desr);
6602#endif
6603}
6604
6605inline _LIBCPP_INLINE_VISIBILITY
6606bool
6607__choose_compare_exchange_strong_seq_cst_consume(short volatile* __obj,
6608 short* __exp,
6609 short __desr)
6610{
6611#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_s)
6612 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
6613 __desr);
6614#else
6615 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
6616 __desr);
6617#endif
6618}
6619
6620inline _LIBCPP_INLINE_VISIBILITY
6621bool
6622__choose_compare_exchange_strong_seq_cst_relaxed(short volatile* __obj,
6623 short* __exp,
6624 short __desr)
6625{
6626#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_s)
6627 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
6628 __desr);
6629#else
6630 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
6631 __desr);
6632#endif
6633}
6634
6635inline _LIBCPP_INLINE_VISIBILITY
6636bool
6637__choose_compare_exchange_strong_acq_rel_acquire(short volatile* __obj,
6638 short* __exp,
6639 short __desr)
6640{
6641#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_s)
6642 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
6643 __desr);
6644#else
6645 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
6646 __desr);
6647#endif
6648}
6649
6650inline _LIBCPP_INLINE_VISIBILITY
6651bool
6652__choose_compare_exchange_strong_acq_rel_consume(short volatile* __obj,
6653 short* __exp,
6654 short __desr)
6655{
6656#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_s)
6657 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
6658 __desr);
6659#else
6660 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
6661 __desr);
6662#endif
6663}
6664
6665inline _LIBCPP_INLINE_VISIBILITY
6666bool
6667__choose_compare_exchange_strong_acq_rel_relaxed(short volatile* __obj,
6668 short* __exp,
6669 short __desr)
6670{
6671#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_s)
6672 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
6673 __desr);
6674#else
6675 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
6676 __desr);
6677#endif
6678}
6679
6680inline _LIBCPP_INLINE_VISIBILITY
6681bool
6682__choose_compare_exchange_strong_release_acquire(short volatile* __obj,
6683 short* __exp,
6684 short __desr)
6685{
6686#if __has_feature(__atomic_compare_exchange_strong_release_acquire_s)
6687 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
6688 __desr);
6689#else
6690 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
6691 __desr);
6692#endif
6693}
6694
6695inline _LIBCPP_INLINE_VISIBILITY
6696bool
6697__choose_compare_exchange_strong_release_consume(short volatile* __obj,
6698 short* __exp,
6699 short __desr)
6700{
6701#if __has_feature(__atomic_compare_exchange_strong_release_consume_s)
6702 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
6703 __desr);
6704#else
6705 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
6706 __desr);
6707#endif
6708}
6709
6710inline _LIBCPP_INLINE_VISIBILITY
6711bool
6712__choose_compare_exchange_strong_release_relaxed(short volatile* __obj,
6713 short* __exp,
6714 short __desr)
6715{
6716#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_s)
6717 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
6718 __desr);
6719#else
6720 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
6721 __desr);
6722#endif
6723}
6724
6725inline _LIBCPP_INLINE_VISIBILITY
6726bool
6727__choose_compare_exchange_strong_acquire_acquire(short volatile* __obj,
6728 short* __exp,
6729 short __desr)
6730{
6731#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_s)
6732 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
6733 __desr);
6734#else
6735 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
6736 __desr);
6737#endif
6738}
6739
6740inline _LIBCPP_INLINE_VISIBILITY
6741bool
6742__choose_compare_exchange_strong_acquire_consume(short volatile* __obj,
6743 short* __exp,
6744 short __desr)
6745{
6746#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_s)
6747 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
6748 __desr);
6749#else
6750 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
6751 __desr);
6752#endif
6753}
6754
6755inline _LIBCPP_INLINE_VISIBILITY
6756bool
6757__choose_compare_exchange_strong_acquire_relaxed(short volatile* __obj,
6758 short* __exp,
6759 short __desr)
6760{
6761#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_s)
6762 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
6763 __desr);
6764#else
6765 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
6766 __desr);
6767#endif
6768}
6769
6770inline _LIBCPP_INLINE_VISIBILITY
6771bool
6772__choose_compare_exchange_strong_consume_consume(short volatile* __obj,
6773 short* __exp,
6774 short __desr)
6775{
6776#if __has_feature(__atomic_compare_exchange_strong_consume_consume_s)
6777 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
6778 __desr);
6779#else
6780 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
6781 __desr);
6782#endif
6783}
6784
6785inline _LIBCPP_INLINE_VISIBILITY
6786bool
6787__choose_compare_exchange_strong_consume_relaxed(short volatile* __obj,
6788 short* __exp,
6789 short __desr)
6790{
6791#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_s)
6792 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
6793 __desr);
6794#else
6795 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
6796 __desr);
6797#endif
6798}
6799
6800inline _LIBCPP_INLINE_VISIBILITY
6801bool
6802__choose_compare_exchange_strong_relaxed_relaxed(short volatile* __obj,
6803 short* __exp,
6804 short __desr)
6805{
6806#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_s)
6807 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
6808 __desr);
6809#else
6810 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
6811 __desr);
6812#endif
6813}
6814
6815// compare_exchange_strong unsigned short
6816
6817inline _LIBCPP_INLINE_VISIBILITY
6818bool
6819__choose_compare_exchange_strong_seq_cst_seq_cst(unsigned short volatile* __obj,
6820 unsigned short* __exp,
6821 unsigned short __desr)
6822{
6823#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_t)
6824 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
6825 __desr);
6826#else
6827 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
6828#endif
6829}
6830
6831inline _LIBCPP_INLINE_VISIBILITY
6832bool
6833__choose_compare_exchange_strong_seq_cst_acquire(unsigned short volatile* __obj,
6834 unsigned short* __exp,
6835 unsigned short __desr)
6836{
6837#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_t)
6838 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
6839 __desr);
6840#else
6841 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
6842 __desr);
6843#endif
6844}
6845
6846inline _LIBCPP_INLINE_VISIBILITY
6847bool
6848__choose_compare_exchange_strong_seq_cst_consume(unsigned short volatile* __obj,
6849 unsigned short* __exp,
6850 unsigned short __desr)
6851{
6852#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_t)
6853 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
6854 __desr);
6855#else
6856 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
6857 __desr);
6858#endif
6859}
6860
6861inline _LIBCPP_INLINE_VISIBILITY
6862bool
6863__choose_compare_exchange_strong_seq_cst_relaxed(unsigned short volatile* __obj,
6864 unsigned short* __exp,
6865 unsigned short __desr)
6866{
6867#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_t)
6868 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
6869 __desr);
6870#else
6871 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
6872 __desr);
6873#endif
6874}
6875
6876inline _LIBCPP_INLINE_VISIBILITY
6877bool
6878__choose_compare_exchange_strong_acq_rel_acquire(unsigned short volatile* __obj,
6879 unsigned short* __exp,
6880 unsigned short __desr)
6881{
6882#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_t)
6883 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
6884 __desr);
6885#else
6886 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
6887 __desr);
6888#endif
6889}
6890
6891inline _LIBCPP_INLINE_VISIBILITY
6892bool
6893__choose_compare_exchange_strong_acq_rel_consume(unsigned short volatile* __obj,
6894 unsigned short* __exp,
6895 unsigned short __desr)
6896{
6897#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_t)
6898 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
6899 __desr);
6900#else
6901 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
6902 __desr);
6903#endif
6904}
6905
6906inline _LIBCPP_INLINE_VISIBILITY
6907bool
6908__choose_compare_exchange_strong_acq_rel_relaxed(unsigned short volatile* __obj,
6909 unsigned short* __exp,
6910 unsigned short __desr)
6911{
6912#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_t)
6913 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
6914 __desr);
6915#else
6916 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
6917 __desr);
6918#endif
6919}
6920
6921inline _LIBCPP_INLINE_VISIBILITY
6922bool
6923__choose_compare_exchange_strong_release_acquire(unsigned short volatile* __obj,
6924 unsigned short* __exp,
6925 unsigned short __desr)
6926{
6927#if __has_feature(__atomic_compare_exchange_strong_release_acquire_t)
6928 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
6929 __desr);
6930#else
6931 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
6932 __desr);
6933#endif
6934}
6935
6936inline _LIBCPP_INLINE_VISIBILITY
6937bool
6938__choose_compare_exchange_strong_release_consume(unsigned short volatile* __obj,
6939 unsigned short* __exp,
6940 unsigned short __desr)
6941{
6942#if __has_feature(__atomic_compare_exchange_strong_release_consume_t)
6943 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
6944 __desr);
6945#else
6946 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
6947 __desr);
6948#endif
6949}
6950
6951inline _LIBCPP_INLINE_VISIBILITY
6952bool
6953__choose_compare_exchange_strong_release_relaxed(unsigned short volatile* __obj,
6954 unsigned short* __exp,
6955 unsigned short __desr)
6956{
6957#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_t)
6958 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
6959 __desr);
6960#else
6961 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
6962 __desr);
6963#endif
6964}
6965
6966inline _LIBCPP_INLINE_VISIBILITY
6967bool
6968__choose_compare_exchange_strong_acquire_acquire(unsigned short volatile* __obj,
6969 unsigned short* __exp,
6970 unsigned short __desr)
6971{
6972#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_t)
6973 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
6974 __desr);
6975#else
6976 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
6977 __desr);
6978#endif
6979}
6980
6981inline _LIBCPP_INLINE_VISIBILITY
6982bool
6983__choose_compare_exchange_strong_acquire_consume(unsigned short volatile* __obj,
6984 unsigned short* __exp,
6985 unsigned short __desr)
6986{
6987#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_t)
6988 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
6989 __desr);
6990#else
6991 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
6992 __desr);
6993#endif
6994}
6995
6996inline _LIBCPP_INLINE_VISIBILITY
6997bool
6998__choose_compare_exchange_strong_acquire_relaxed(unsigned short volatile* __obj,
6999 unsigned short* __exp,
7000 unsigned short __desr)
7001{
7002#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_t)
7003 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
7004 __desr);
7005#else
7006 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
7007 __desr);
7008#endif
7009}
7010
7011inline _LIBCPP_INLINE_VISIBILITY
7012bool
7013__choose_compare_exchange_strong_consume_consume(unsigned short volatile* __obj,
7014 unsigned short* __exp,
7015 unsigned short __desr)
7016{
7017#if __has_feature(__atomic_compare_exchange_strong_consume_consume_t)
7018 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
7019 __desr);
7020#else
7021 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
7022 __desr);
7023#endif
7024}
7025
7026inline _LIBCPP_INLINE_VISIBILITY
7027bool
7028__choose_compare_exchange_strong_consume_relaxed(unsigned short volatile* __obj,
7029 unsigned short* __exp,
7030 unsigned short __desr)
7031{
7032#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_t)
7033 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
7034 __desr);
7035#else
7036 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
7037 __desr);
7038#endif
7039}
7040
7041inline _LIBCPP_INLINE_VISIBILITY
7042bool
7043__choose_compare_exchange_strong_relaxed_relaxed(unsigned short volatile* __obj,
7044 unsigned short* __exp,
7045 unsigned short __desr)
7046{
7047#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_t)
7048 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
7049 __desr);
7050#else
7051 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
7052 __desr);
7053#endif
7054}
7055
7056// compare_exchange_strong int
7057
7058inline _LIBCPP_INLINE_VISIBILITY
7059bool
7060__choose_compare_exchange_strong_seq_cst_seq_cst(int volatile* __obj,
7061 int* __exp,
7062 int __desr)
7063{
7064#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_i)
7065 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
7066 __desr);
7067#else
7068 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
7069#endif
7070}
7071
7072inline _LIBCPP_INLINE_VISIBILITY
7073bool
7074__choose_compare_exchange_strong_seq_cst_acquire(int volatile* __obj,
7075 int* __exp,
7076 int __desr)
7077{
7078#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_i)
7079 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
7080 __desr);
7081#else
7082 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
7083 __desr);
7084#endif
7085}
7086
7087inline _LIBCPP_INLINE_VISIBILITY
7088bool
7089__choose_compare_exchange_strong_seq_cst_consume(int volatile* __obj,
7090 int* __exp,
7091 int __desr)
7092{
7093#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_i)
7094 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
7095 __desr);
7096#else
7097 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
7098 __desr);
7099#endif
7100}
7101
7102inline _LIBCPP_INLINE_VISIBILITY
7103bool
7104__choose_compare_exchange_strong_seq_cst_relaxed(int volatile* __obj,
7105 int* __exp,
7106 int __desr)
7107{
7108#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_i)
7109 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
7110 __desr);
7111#else
7112 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
7113 __desr);
7114#endif
7115}
7116
7117inline _LIBCPP_INLINE_VISIBILITY
7118bool
7119__choose_compare_exchange_strong_acq_rel_acquire(int volatile* __obj,
7120 int* __exp,
7121 int __desr)
7122{
7123#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_i)
7124 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
7125 __desr);
7126#else
7127 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
7128 __desr);
7129#endif
7130}
7131
7132inline _LIBCPP_INLINE_VISIBILITY
7133bool
7134__choose_compare_exchange_strong_acq_rel_consume(int volatile* __obj,
7135 int* __exp,
7136 int __desr)
7137{
7138#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_i)
7139 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
7140 __desr);
7141#else
7142 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
7143 __desr);
7144#endif
7145}
7146
7147inline _LIBCPP_INLINE_VISIBILITY
7148bool
7149__choose_compare_exchange_strong_acq_rel_relaxed(int volatile* __obj,
7150 int* __exp,
7151 int __desr)
7152{
7153#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_i)
7154 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
7155 __desr);
7156#else
7157 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
7158 __desr);
7159#endif
7160}
7161
7162inline _LIBCPP_INLINE_VISIBILITY
7163bool
7164__choose_compare_exchange_strong_release_acquire(int volatile* __obj,
7165 int* __exp,
7166 int __desr)
7167{
7168#if __has_feature(__atomic_compare_exchange_strong_release_acquire_i)
7169 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
7170 __desr);
7171#else
7172 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
7173 __desr);
7174#endif
7175}
7176
7177inline _LIBCPP_INLINE_VISIBILITY
7178bool
7179__choose_compare_exchange_strong_release_consume(int volatile* __obj,
7180 int* __exp,
7181 int __desr)
7182{
7183#if __has_feature(__atomic_compare_exchange_strong_release_consume_i)
7184 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
7185 __desr);
7186#else
7187 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
7188 __desr);
7189#endif
7190}
7191
7192inline _LIBCPP_INLINE_VISIBILITY
7193bool
7194__choose_compare_exchange_strong_release_relaxed(int volatile* __obj,
7195 int* __exp,
7196 int __desr)
7197{
7198#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_i)
7199 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
7200 __desr);
7201#else
7202 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
7203 __desr);
7204#endif
7205}
7206
7207inline _LIBCPP_INLINE_VISIBILITY
7208bool
7209__choose_compare_exchange_strong_acquire_acquire(int volatile* __obj,
7210 int* __exp,
7211 int __desr)
7212{
7213#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_i)
7214 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
7215 __desr);
7216#else
7217 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
7218 __desr);
7219#endif
7220}
7221
7222inline _LIBCPP_INLINE_VISIBILITY
7223bool
7224__choose_compare_exchange_strong_acquire_consume(int volatile* __obj,
7225 int* __exp,
7226 int __desr)
7227{
7228#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_i)
7229 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
7230 __desr);
7231#else
7232 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
7233 __desr);
7234#endif
7235}
7236
7237inline _LIBCPP_INLINE_VISIBILITY
7238bool
7239__choose_compare_exchange_strong_acquire_relaxed(int volatile* __obj,
7240 int* __exp,
7241 int __desr)
7242{
7243#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_i)
7244 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
7245 __desr);
7246#else
7247 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
7248 __desr);
7249#endif
7250}
7251
7252inline _LIBCPP_INLINE_VISIBILITY
7253bool
7254__choose_compare_exchange_strong_consume_consume(int volatile* __obj,
7255 int* __exp,
7256 int __desr)
7257{
7258#if __has_feature(__atomic_compare_exchange_strong_consume_consume_i)
7259 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
7260 __desr);
7261#else
7262 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
7263 __desr);
7264#endif
7265}
7266
7267inline _LIBCPP_INLINE_VISIBILITY
7268bool
7269__choose_compare_exchange_strong_consume_relaxed(int volatile* __obj,
7270 int* __exp,
7271 int __desr)
7272{
7273#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_i)
7274 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
7275 __desr);
7276#else
7277 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
7278 __desr);
7279#endif
7280}
7281
7282inline _LIBCPP_INLINE_VISIBILITY
7283bool
7284__choose_compare_exchange_strong_relaxed_relaxed(int volatile* __obj,
7285 int* __exp,
7286 int __desr)
7287{
7288#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_i)
7289 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
7290 __desr);
7291#else
7292 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
7293 __desr);
7294#endif
7295}
7296
7297// compare_exchange_strong unsigned int
7298
7299inline _LIBCPP_INLINE_VISIBILITY
7300bool
7301__choose_compare_exchange_strong_seq_cst_seq_cst(unsigned int volatile* __obj,
7302 unsigned int* __exp,
7303 unsigned int __desr)
7304{
7305#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_j)
7306 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
7307 __desr);
7308#else
7309 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
7310#endif
7311}
7312
7313inline _LIBCPP_INLINE_VISIBILITY
7314bool
7315__choose_compare_exchange_strong_seq_cst_acquire(unsigned int volatile* __obj,
7316 unsigned int* __exp,
7317 unsigned int __desr)
7318{
7319#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_j)
7320 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
7321 __desr);
7322#else
7323 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
7324 __desr);
7325#endif
7326}
7327
7328inline _LIBCPP_INLINE_VISIBILITY
7329bool
7330__choose_compare_exchange_strong_seq_cst_consume(unsigned int volatile* __obj,
7331 unsigned int* __exp,
7332 unsigned int __desr)
7333{
7334#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_j)
7335 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
7336 __desr);
7337#else
7338 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
7339 __desr);
7340#endif
7341}
7342
7343inline _LIBCPP_INLINE_VISIBILITY
7344bool
7345__choose_compare_exchange_strong_seq_cst_relaxed(unsigned int volatile* __obj,
7346 unsigned int* __exp,
7347 unsigned int __desr)
7348{
7349#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_j)
7350 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
7351 __desr);
7352#else
7353 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
7354 __desr);
7355#endif
7356}
7357
7358inline _LIBCPP_INLINE_VISIBILITY
7359bool
7360__choose_compare_exchange_strong_acq_rel_acquire(unsigned int volatile* __obj,
7361 unsigned int* __exp,
7362 unsigned int __desr)
7363{
7364#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_j)
7365 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
7366 __desr);
7367#else
7368 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
7369 __desr);
7370#endif
7371}
7372
7373inline _LIBCPP_INLINE_VISIBILITY
7374bool
7375__choose_compare_exchange_strong_acq_rel_consume(unsigned int volatile* __obj,
7376 unsigned int* __exp,
7377 unsigned int __desr)
7378{
7379#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_j)
7380 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
7381 __desr);
7382#else
7383 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
7384 __desr);
7385#endif
7386}
7387
7388inline _LIBCPP_INLINE_VISIBILITY
7389bool
7390__choose_compare_exchange_strong_acq_rel_relaxed(unsigned int volatile* __obj,
7391 unsigned int* __exp,
7392 unsigned int __desr)
7393{
7394#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_j)
7395 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
7396 __desr);
7397#else
7398 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
7399 __desr);
7400#endif
7401}
7402
7403inline _LIBCPP_INLINE_VISIBILITY
7404bool
7405__choose_compare_exchange_strong_release_acquire(unsigned int volatile* __obj,
7406 unsigned int* __exp,
7407 unsigned int __desr)
7408{
7409#if __has_feature(__atomic_compare_exchange_strong_release_acquire_j)
7410 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
7411 __desr);
7412#else
7413 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
7414 __desr);
7415#endif
7416}
7417
7418inline _LIBCPP_INLINE_VISIBILITY
7419bool
7420__choose_compare_exchange_strong_release_consume(unsigned int volatile* __obj,
7421 unsigned int* __exp,
7422 unsigned int __desr)
7423{
7424#if __has_feature(__atomic_compare_exchange_strong_release_consume_j)
7425 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
7426 __desr);
7427#else
7428 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
7429 __desr);
7430#endif
7431}
7432
7433inline _LIBCPP_INLINE_VISIBILITY
7434bool
7435__choose_compare_exchange_strong_release_relaxed(unsigned int volatile* __obj,
7436 unsigned int* __exp,
7437 unsigned int __desr)
7438{
7439#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_j)
7440 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
7441 __desr);
7442#else
7443 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
7444 __desr);
7445#endif
7446}
7447
7448inline _LIBCPP_INLINE_VISIBILITY
7449bool
7450__choose_compare_exchange_strong_acquire_acquire(unsigned int volatile* __obj,
7451 unsigned int* __exp,
7452 unsigned int __desr)
7453{
7454#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_j)
7455 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
7456 __desr);
7457#else
7458 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
7459 __desr);
7460#endif
7461}
7462
7463inline _LIBCPP_INLINE_VISIBILITY
7464bool
7465__choose_compare_exchange_strong_acquire_consume(unsigned int volatile* __obj,
7466 unsigned int* __exp,
7467 unsigned int __desr)
7468{
7469#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_j)
7470 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
7471 __desr);
7472#else
7473 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
7474 __desr);
7475#endif
7476}
7477
7478inline _LIBCPP_INLINE_VISIBILITY
7479bool
7480__choose_compare_exchange_strong_acquire_relaxed(unsigned int volatile* __obj,
7481 unsigned int* __exp,
7482 unsigned int __desr)
7483{
7484#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_j)
7485 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
7486 __desr);
7487#else
7488 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
7489 __desr);
7490#endif
7491}
7492
7493inline _LIBCPP_INLINE_VISIBILITY
7494bool
7495__choose_compare_exchange_strong_consume_consume(unsigned int volatile* __obj,
7496 unsigned int* __exp,
7497 unsigned int __desr)
7498{
7499#if __has_feature(__atomic_compare_exchange_strong_consume_consume_j)
7500 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
7501 __desr);
7502#else
7503 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
7504 __desr);
7505#endif
7506}
7507
7508inline _LIBCPP_INLINE_VISIBILITY
7509bool
7510__choose_compare_exchange_strong_consume_relaxed(unsigned int volatile* __obj,
7511 unsigned int* __exp,
7512 unsigned int __desr)
7513{
7514#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_j)
7515 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
7516 __desr);
7517#else
7518 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
7519 __desr);
7520#endif
7521}
7522
7523inline _LIBCPP_INLINE_VISIBILITY
7524bool
7525__choose_compare_exchange_strong_relaxed_relaxed(unsigned int volatile* __obj,
7526 unsigned int* __exp,
7527 unsigned int __desr)
7528{
7529#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_j)
7530 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
7531 __desr);
7532#else
7533 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
7534 __desr);
7535#endif
7536}
7537
7538// compare_exchange_strong long
7539
7540inline _LIBCPP_INLINE_VISIBILITY
7541bool
7542__choose_compare_exchange_strong_seq_cst_seq_cst(long volatile* __obj,
7543 long* __exp,
7544 long __desr)
7545{
7546#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_l)
7547 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
7548 __desr);
7549#else
7550 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
7551#endif
7552}
7553
7554inline _LIBCPP_INLINE_VISIBILITY
7555bool
7556__choose_compare_exchange_strong_seq_cst_acquire(long volatile* __obj,
7557 long* __exp,
7558 long __desr)
7559{
7560#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_l)
7561 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
7562 __desr);
7563#else
7564 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
7565 __desr);
7566#endif
7567}
7568
7569inline _LIBCPP_INLINE_VISIBILITY
7570bool
7571__choose_compare_exchange_strong_seq_cst_consume(long volatile* __obj,
7572 long* __exp,
7573 long __desr)
7574{
7575#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_l)
7576 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
7577 __desr);
7578#else
7579 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
7580 __desr);
7581#endif
7582}
7583
7584inline _LIBCPP_INLINE_VISIBILITY
7585bool
7586__choose_compare_exchange_strong_seq_cst_relaxed(long volatile* __obj,
7587 long* __exp,
7588 long __desr)
7589{
7590#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_l)
7591 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
7592 __desr);
7593#else
7594 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
7595 __desr);
7596#endif
7597}
7598
7599inline _LIBCPP_INLINE_VISIBILITY
7600bool
7601__choose_compare_exchange_strong_acq_rel_acquire(long volatile* __obj,
7602 long* __exp,
7603 long __desr)
7604{
7605#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_l)
7606 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
7607 __desr);
7608#else
7609 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
7610 __desr);
7611#endif
7612}
7613
7614inline _LIBCPP_INLINE_VISIBILITY
7615bool
7616__choose_compare_exchange_strong_acq_rel_consume(long volatile* __obj,
7617 long* __exp,
7618 long __desr)
7619{
7620#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_l)
7621 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
7622 __desr);
7623#else
7624 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
7625 __desr);
7626#endif
7627}
7628
7629inline _LIBCPP_INLINE_VISIBILITY
7630bool
7631__choose_compare_exchange_strong_acq_rel_relaxed(long volatile* __obj,
7632 long* __exp,
7633 long __desr)
7634{
7635#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_l)
7636 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
7637 __desr);
7638#else
7639 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
7640 __desr);
7641#endif
7642}
7643
7644inline _LIBCPP_INLINE_VISIBILITY
7645bool
7646__choose_compare_exchange_strong_release_acquire(long volatile* __obj,
7647 long* __exp,
7648 long __desr)
7649{
7650#if __has_feature(__atomic_compare_exchange_strong_release_acquire_l)
7651 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
7652 __desr);
7653#else
7654 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
7655 __desr);
7656#endif
7657}
7658
7659inline _LIBCPP_INLINE_VISIBILITY
7660bool
7661__choose_compare_exchange_strong_release_consume(long volatile* __obj,
7662 long* __exp,
7663 long __desr)
7664{
7665#if __has_feature(__atomic_compare_exchange_strong_release_consume_l)
7666 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
7667 __desr);
7668#else
7669 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
7670 __desr);
7671#endif
7672}
7673
7674inline _LIBCPP_INLINE_VISIBILITY
7675bool
7676__choose_compare_exchange_strong_release_relaxed(long volatile* __obj,
7677 long* __exp,
7678 long __desr)
7679{
7680#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_l)
7681 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
7682 __desr);
7683#else
7684 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
7685 __desr);
7686#endif
7687}
7688
7689inline _LIBCPP_INLINE_VISIBILITY
7690bool
7691__choose_compare_exchange_strong_acquire_acquire(long volatile* __obj,
7692 long* __exp,
7693 long __desr)
7694{
7695#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_l)
7696 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
7697 __desr);
7698#else
7699 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
7700 __desr);
7701#endif
7702}
7703
7704inline _LIBCPP_INLINE_VISIBILITY
7705bool
7706__choose_compare_exchange_strong_acquire_consume(long volatile* __obj,
7707 long* __exp,
7708 long __desr)
7709{
7710#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_l)
7711 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
7712 __desr);
7713#else
7714 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
7715 __desr);
7716#endif
7717}
7718
7719inline _LIBCPP_INLINE_VISIBILITY
7720bool
7721__choose_compare_exchange_strong_acquire_relaxed(long volatile* __obj,
7722 long* __exp,
7723 long __desr)
7724{
7725#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_l)
7726 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
7727 __desr);
7728#else
7729 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
7730 __desr);
7731#endif
7732}
7733
7734inline _LIBCPP_INLINE_VISIBILITY
7735bool
7736__choose_compare_exchange_strong_consume_consume(long volatile* __obj,
7737 long* __exp,
7738 long __desr)
7739{
7740#if __has_feature(__atomic_compare_exchange_strong_consume_consume_l)
7741 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
7742 __desr);
7743#else
7744 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
7745 __desr);
7746#endif
7747}
7748
7749inline _LIBCPP_INLINE_VISIBILITY
7750bool
7751__choose_compare_exchange_strong_consume_relaxed(long volatile* __obj,
7752 long* __exp,
7753 long __desr)
7754{
7755#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_l)
7756 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
7757 __desr);
7758#else
7759 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
7760 __desr);
7761#endif
7762}
7763
7764inline _LIBCPP_INLINE_VISIBILITY
7765bool
7766__choose_compare_exchange_strong_relaxed_relaxed(long volatile* __obj,
7767 long* __exp,
7768 long __desr)
7769{
7770#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_l)
7771 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
7772 __desr);
7773#else
7774 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
7775 __desr);
7776#endif
7777}
7778
7779// compare_exchange_strong unsigned long
7780
7781inline _LIBCPP_INLINE_VISIBILITY
7782bool
7783__choose_compare_exchange_strong_seq_cst_seq_cst(unsigned long volatile* __obj,
7784 unsigned long* __exp,
7785 unsigned long __desr)
7786{
7787#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_m)
7788 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
7789 __desr);
7790#else
7791 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
7792#endif
7793}
7794
7795inline _LIBCPP_INLINE_VISIBILITY
7796bool
7797__choose_compare_exchange_strong_seq_cst_acquire(unsigned long volatile* __obj,
7798 unsigned long* __exp,
7799 unsigned long __desr)
7800{
7801#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_m)
7802 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
7803 __desr);
7804#else
7805 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
7806 __desr);
7807#endif
7808}
7809
7810inline _LIBCPP_INLINE_VISIBILITY
7811bool
7812__choose_compare_exchange_strong_seq_cst_consume(unsigned long volatile* __obj,
7813 unsigned long* __exp,
7814 unsigned long __desr)
7815{
7816#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_m)
7817 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
7818 __desr);
7819#else
7820 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
7821 __desr);
7822#endif
7823}
7824
7825inline _LIBCPP_INLINE_VISIBILITY
7826bool
7827__choose_compare_exchange_strong_seq_cst_relaxed(unsigned long volatile* __obj,
7828 unsigned long* __exp,
7829 unsigned long __desr)
7830{
7831#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_m)
7832 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
7833 __desr);
7834#else
7835 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
7836 __desr);
7837#endif
7838}
7839
7840inline _LIBCPP_INLINE_VISIBILITY
7841bool
7842__choose_compare_exchange_strong_acq_rel_acquire(unsigned long volatile* __obj,
7843 unsigned long* __exp,
7844 unsigned long __desr)
7845{
7846#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_m)
7847 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
7848 __desr);
7849#else
7850 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
7851 __desr);
7852#endif
7853}
7854
7855inline _LIBCPP_INLINE_VISIBILITY
7856bool
7857__choose_compare_exchange_strong_acq_rel_consume(unsigned long volatile* __obj,
7858 unsigned long* __exp,
7859 unsigned long __desr)
7860{
7861#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_m)
7862 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
7863 __desr);
7864#else
7865 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
7866 __desr);
7867#endif
7868}
7869
7870inline _LIBCPP_INLINE_VISIBILITY
7871bool
7872__choose_compare_exchange_strong_acq_rel_relaxed(unsigned long volatile* __obj,
7873 unsigned long* __exp,
7874 unsigned long __desr)
7875{
7876#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_m)
7877 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
7878 __desr);
7879#else
7880 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
7881 __desr);
7882#endif
7883}
7884
7885inline _LIBCPP_INLINE_VISIBILITY
7886bool
7887__choose_compare_exchange_strong_release_acquire(unsigned long volatile* __obj,
7888 unsigned long* __exp,
7889 unsigned long __desr)
7890{
7891#if __has_feature(__atomic_compare_exchange_strong_release_acquire_m)
7892 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
7893 __desr);
7894#else
7895 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
7896 __desr);
7897#endif
7898}
7899
7900inline _LIBCPP_INLINE_VISIBILITY
7901bool
7902__choose_compare_exchange_strong_release_consume(unsigned long volatile* __obj,
7903 unsigned long* __exp,
7904 unsigned long __desr)
7905{
7906#if __has_feature(__atomic_compare_exchange_strong_release_consume_m)
7907 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
7908 __desr);
7909#else
7910 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
7911 __desr);
7912#endif
7913}
7914
7915inline _LIBCPP_INLINE_VISIBILITY
7916bool
7917__choose_compare_exchange_strong_release_relaxed(unsigned long volatile* __obj,
7918 unsigned long* __exp,
7919 unsigned long __desr)
7920{
7921#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_m)
7922 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
7923 __desr);
7924#else
7925 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
7926 __desr);
7927#endif
7928}
7929
7930inline _LIBCPP_INLINE_VISIBILITY
7931bool
7932__choose_compare_exchange_strong_acquire_acquire(unsigned long volatile* __obj,
7933 unsigned long* __exp,
7934 unsigned long __desr)
7935{
7936#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_m)
7937 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
7938 __desr);
7939#else
7940 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
7941 __desr);
7942#endif
7943}
7944
7945inline _LIBCPP_INLINE_VISIBILITY
7946bool
7947__choose_compare_exchange_strong_acquire_consume(unsigned long volatile* __obj,
7948 unsigned long* __exp,
7949 unsigned long __desr)
7950{
7951#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_m)
7952 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
7953 __desr);
7954#else
7955 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
7956 __desr);
7957#endif
7958}
7959
7960inline _LIBCPP_INLINE_VISIBILITY
7961bool
7962__choose_compare_exchange_strong_acquire_relaxed(unsigned long volatile* __obj,
7963 unsigned long* __exp,
7964 unsigned long __desr)
7965{
7966#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_m)
7967 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
7968 __desr);
7969#else
7970 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
7971 __desr);
7972#endif
7973}
7974
7975inline _LIBCPP_INLINE_VISIBILITY
7976bool
7977__choose_compare_exchange_strong_consume_consume(unsigned long volatile* __obj,
7978 unsigned long* __exp,
7979 unsigned long __desr)
7980{
7981#if __has_feature(__atomic_compare_exchange_strong_consume_consume_m)
7982 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
7983 __desr);
7984#else
7985 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
7986 __desr);
7987#endif
7988}
7989
7990inline _LIBCPP_INLINE_VISIBILITY
7991bool
7992__choose_compare_exchange_strong_consume_relaxed(unsigned long volatile* __obj,
7993 unsigned long* __exp,
7994 unsigned long __desr)
7995{
7996#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_m)
7997 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
7998 __desr);
7999#else
8000 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
8001 __desr);
8002#endif
8003}
8004
8005inline _LIBCPP_INLINE_VISIBILITY
8006bool
8007__choose_compare_exchange_strong_relaxed_relaxed(unsigned long volatile* __obj,
8008 unsigned long* __exp,
8009 unsigned long __desr)
8010{
8011#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_m)
8012 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
8013 __desr);
8014#else
8015 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
8016 __desr);
8017#endif
8018}
8019
8020// compare_exchange_strong long long
8021
8022inline _LIBCPP_INLINE_VISIBILITY
8023bool
8024__choose_compare_exchange_strong_seq_cst_seq_cst(long long volatile* __obj,
8025 long long* __exp,
8026 long long __desr)
8027{
8028#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_x)
8029 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
8030 __desr);
8031#else
8032 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
8033#endif
8034}
8035
8036inline _LIBCPP_INLINE_VISIBILITY
8037bool
8038__choose_compare_exchange_strong_seq_cst_acquire(long long volatile* __obj,
8039 long long* __exp,
8040 long long __desr)
8041{
8042#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_x)
8043 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
8044 __desr);
8045#else
8046 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
8047 __desr);
8048#endif
8049}
8050
8051inline _LIBCPP_INLINE_VISIBILITY
8052bool
8053__choose_compare_exchange_strong_seq_cst_consume(long long volatile* __obj,
8054 long long* __exp,
8055 long long __desr)
8056{
8057#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_x)
8058 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
8059 __desr);
8060#else
8061 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
8062 __desr);
8063#endif
8064}
8065
8066inline _LIBCPP_INLINE_VISIBILITY
8067bool
8068__choose_compare_exchange_strong_seq_cst_relaxed(long long volatile* __obj,
8069 long long* __exp,
8070 long long __desr)
8071{
8072#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_x)
8073 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
8074 __desr);
8075#else
8076 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
8077 __desr);
8078#endif
8079}
8080
8081inline _LIBCPP_INLINE_VISIBILITY
8082bool
8083__choose_compare_exchange_strong_acq_rel_acquire(long long volatile* __obj,
8084 long long* __exp,
8085 long long __desr)
8086{
8087#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_x)
8088 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
8089 __desr);
8090#else
8091 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
8092 __desr);
8093#endif
8094}
8095
8096inline _LIBCPP_INLINE_VISIBILITY
8097bool
8098__choose_compare_exchange_strong_acq_rel_consume(long long volatile* __obj,
8099 long long* __exp,
8100 long long __desr)
8101{
8102#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_x)
8103 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
8104 __desr);
8105#else
8106 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
8107 __desr);
8108#endif
8109}
8110
8111inline _LIBCPP_INLINE_VISIBILITY
8112bool
8113__choose_compare_exchange_strong_acq_rel_relaxed(long long volatile* __obj,
8114 long long* __exp,
8115 long long __desr)
8116{
8117#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_x)
8118 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
8119 __desr);
8120#else
8121 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
8122 __desr);
8123#endif
8124}
8125
8126inline _LIBCPP_INLINE_VISIBILITY
8127bool
8128__choose_compare_exchange_strong_release_acquire(long long volatile* __obj,
8129 long long* __exp,
8130 long long __desr)
8131{
8132#if __has_feature(__atomic_compare_exchange_strong_release_acquire_x)
8133 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
8134 __desr);
8135#else
8136 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
8137 __desr);
8138#endif
8139}
8140
8141inline _LIBCPP_INLINE_VISIBILITY
8142bool
8143__choose_compare_exchange_strong_release_consume(long long volatile* __obj,
8144 long long* __exp,
8145 long long __desr)
8146{
8147#if __has_feature(__atomic_compare_exchange_strong_release_consume_x)
8148 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
8149 __desr);
8150#else
8151 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
8152 __desr);
8153#endif
8154}
8155
8156inline _LIBCPP_INLINE_VISIBILITY
8157bool
8158__choose_compare_exchange_strong_release_relaxed(long long volatile* __obj,
8159 long long* __exp,
8160 long long __desr)
8161{
8162#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_x)
8163 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
8164 __desr);
8165#else
8166 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
8167 __desr);
8168#endif
8169}
8170
8171inline _LIBCPP_INLINE_VISIBILITY
8172bool
8173__choose_compare_exchange_strong_acquire_acquire(long long volatile* __obj,
8174 long long* __exp,
8175 long long __desr)
8176{
8177#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_x)
8178 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
8179 __desr);
8180#else
8181 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
8182 __desr);
8183#endif
8184}
8185
8186inline _LIBCPP_INLINE_VISIBILITY
8187bool
8188__choose_compare_exchange_strong_acquire_consume(long long volatile* __obj,
8189 long long* __exp,
8190 long long __desr)
8191{
8192#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_x)
8193 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
8194 __desr);
8195#else
8196 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
8197 __desr);
8198#endif
8199}
8200
8201inline _LIBCPP_INLINE_VISIBILITY
8202bool
8203__choose_compare_exchange_strong_acquire_relaxed(long long volatile* __obj,
8204 long long* __exp,
8205 long long __desr)
8206{
8207#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_x)
8208 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
8209 __desr);
8210#else
8211 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
8212 __desr);
8213#endif
8214}
8215
8216inline _LIBCPP_INLINE_VISIBILITY
8217bool
8218__choose_compare_exchange_strong_consume_consume(long long volatile* __obj,
8219 long long* __exp,
8220 long long __desr)
8221{
8222#if __has_feature(__atomic_compare_exchange_strong_consume_consume_x)
8223 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
8224 __desr);
8225#else
8226 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
8227 __desr);
8228#endif
8229}
8230
8231inline _LIBCPP_INLINE_VISIBILITY
8232bool
8233__choose_compare_exchange_strong_consume_relaxed(long long volatile* __obj,
8234 long long* __exp,
8235 long long __desr)
8236{
8237#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_x)
8238 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
8239 __desr);
8240#else
8241 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
8242 __desr);
8243#endif
8244}
8245
8246inline _LIBCPP_INLINE_VISIBILITY
8247bool
8248__choose_compare_exchange_strong_relaxed_relaxed(long long volatile* __obj,
8249 long long* __exp,
8250 long long __desr)
8251{
8252#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_x)
8253 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
8254 __desr);
8255#else
8256 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
8257 __desr);
8258#endif
8259}
8260
8261// compare_exchange_strong unsigned long long
8262
8263inline _LIBCPP_INLINE_VISIBILITY
8264bool
8265__choose_compare_exchange_strong_seq_cst_seq_cst(unsigned long long volatile* __obj,
8266 unsigned long long* __exp,
8267 unsigned long long __desr)
8268{
8269#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_y)
8270 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
8271 __desr);
8272#else
8273 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
8274#endif
8275}
8276
8277inline _LIBCPP_INLINE_VISIBILITY
8278bool
8279__choose_compare_exchange_strong_seq_cst_acquire(unsigned long long volatile* __obj,
8280 unsigned long long* __exp,
8281 unsigned long long __desr)
8282{
8283#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_y)
8284 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
8285 __desr);
8286#else
8287 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
8288 __desr);
8289#endif
8290}
8291
8292inline _LIBCPP_INLINE_VISIBILITY
8293bool
8294__choose_compare_exchange_strong_seq_cst_consume(unsigned long long volatile* __obj,
8295 unsigned long long* __exp,
8296 unsigned long long __desr)
8297{
8298#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_y)
8299 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
8300 __desr);
8301#else
8302 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
8303 __desr);
8304#endif
8305}
8306
8307inline _LIBCPP_INLINE_VISIBILITY
8308bool
8309__choose_compare_exchange_strong_seq_cst_relaxed(unsigned long long volatile* __obj,
8310 unsigned long long* __exp,
8311 unsigned long long __desr)
8312{
8313#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_y)
8314 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
8315 __desr);
8316#else
8317 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
8318 __desr);
8319#endif
8320}
8321
8322inline _LIBCPP_INLINE_VISIBILITY
8323bool
8324__choose_compare_exchange_strong_acq_rel_acquire(unsigned long long volatile* __obj,
8325 unsigned long long* __exp,
8326 unsigned long long __desr)
8327{
8328#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_y)
8329 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
8330 __desr);
8331#else
8332 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
8333 __desr);
8334#endif
8335}
8336
8337inline _LIBCPP_INLINE_VISIBILITY
8338bool
8339__choose_compare_exchange_strong_acq_rel_consume(unsigned long long volatile* __obj,
8340 unsigned long long* __exp,
8341 unsigned long long __desr)
8342{
8343#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_y)
8344 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
8345 __desr);
8346#else
8347 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
8348 __desr);
8349#endif
8350}
8351
8352inline _LIBCPP_INLINE_VISIBILITY
8353bool
8354__choose_compare_exchange_strong_acq_rel_relaxed(unsigned long long volatile* __obj,
8355 unsigned long long* __exp,
8356 unsigned long long __desr)
8357{
8358#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_y)
8359 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
8360 __desr);
8361#else
8362 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
8363 __desr);
8364#endif
8365}
8366
8367inline _LIBCPP_INLINE_VISIBILITY
8368bool
8369__choose_compare_exchange_strong_release_acquire(unsigned long long volatile* __obj,
8370 unsigned long long* __exp,
8371 unsigned long long __desr)
8372{
8373#if __has_feature(__atomic_compare_exchange_strong_release_acquire_y)
8374 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
8375 __desr);
8376#else
8377 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
8378 __desr);
8379#endif
8380}
8381
8382inline _LIBCPP_INLINE_VISIBILITY
8383bool
8384__choose_compare_exchange_strong_release_consume(unsigned long long volatile* __obj,
8385 unsigned long long* __exp,
8386 unsigned long long __desr)
8387{
8388#if __has_feature(__atomic_compare_exchange_strong_release_consume_y)
8389 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
8390 __desr);
8391#else
8392 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
8393 __desr);
8394#endif
8395}
8396
8397inline _LIBCPP_INLINE_VISIBILITY
8398bool
8399__choose_compare_exchange_strong_release_relaxed(unsigned long long volatile* __obj,
8400 unsigned long long* __exp,
8401 unsigned long long __desr)
8402{
8403#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_y)
8404 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
8405 __desr);
8406#else
8407 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
8408 __desr);
8409#endif
8410}
8411
8412inline _LIBCPP_INLINE_VISIBILITY
8413bool
8414__choose_compare_exchange_strong_acquire_acquire(unsigned long long volatile* __obj,
8415 unsigned long long* __exp,
8416 unsigned long long __desr)
8417{
8418#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_y)
8419 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
8420 __desr);
8421#else
8422 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
8423 __desr);
8424#endif
8425}
8426
8427inline _LIBCPP_INLINE_VISIBILITY
8428bool
8429__choose_compare_exchange_strong_acquire_consume(unsigned long long volatile* __obj,
8430 unsigned long long* __exp,
8431 unsigned long long __desr)
8432{
8433#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_y)
8434 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
8435 __desr);
8436#else
8437 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
8438 __desr);
8439#endif
8440}
8441
8442inline _LIBCPP_INLINE_VISIBILITY
8443bool
8444__choose_compare_exchange_strong_acquire_relaxed(unsigned long long volatile* __obj,
8445 unsigned long long* __exp,
8446 unsigned long long __desr)
8447{
8448#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_y)
8449 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
8450 __desr);
8451#else
8452 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
8453 __desr);
8454#endif
8455}
8456
8457inline _LIBCPP_INLINE_VISIBILITY
8458bool
8459__choose_compare_exchange_strong_consume_consume(unsigned long long volatile* __obj,
8460 unsigned long long* __exp,
8461 unsigned long long __desr)
8462{
8463#if __has_feature(__atomic_compare_exchange_strong_consume_consume_y)
8464 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
8465 __desr);
8466#else
8467 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
8468 __desr);
8469#endif
8470}
8471
8472inline _LIBCPP_INLINE_VISIBILITY
8473bool
8474__choose_compare_exchange_strong_consume_relaxed(unsigned long long volatile* __obj,
8475 unsigned long long* __exp,
8476 unsigned long long __desr)
8477{
8478#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_y)
8479 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
8480 __desr);
8481#else
8482 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
8483 __desr);
8484#endif
8485}
8486
8487inline _LIBCPP_INLINE_VISIBILITY
8488bool
8489__choose_compare_exchange_strong_relaxed_relaxed(unsigned long long volatile* __obj,
8490 unsigned long long* __exp,
8491 unsigned long long __desr)
8492{
8493#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_y)
8494 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
8495 __desr);
8496#else
8497 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
8498 __desr);
8499#endif
8500}
8501
8502// compare_exchange_strong void*
8503
8504inline _LIBCPP_INLINE_VISIBILITY
8505bool
8506__choose_compare_exchange_strong_seq_cst_seq_cst(void* volatile* __obj,
8507 void** __exp,
8508 void* __desr)
8509{
8510#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_Py)
8511 return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
8512 __desr);
8513#else
8514 return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
8515#endif
8516}
8517
8518inline _LIBCPP_INLINE_VISIBILITY
8519bool
8520__choose_compare_exchange_strong_seq_cst_acquire(void* volatile* __obj,
8521 void** __exp,
8522 void* __desr)
8523{
8524#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_Py)
8525 return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
8526 __desr);
8527#else
8528 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
8529 __desr);
8530#endif
8531}
8532
8533inline _LIBCPP_INLINE_VISIBILITY
8534bool
8535__choose_compare_exchange_strong_seq_cst_consume(void* volatile* __obj,
8536 void** __exp,
8537 void* __desr)
8538{
8539#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_Py)
8540 return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
8541 __desr);
8542#else
8543 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
8544 __desr);
8545#endif
8546}
8547
8548inline _LIBCPP_INLINE_VISIBILITY
8549bool
8550__choose_compare_exchange_strong_seq_cst_relaxed(void* volatile* __obj,
8551 void** __exp,
8552 void* __desr)
8553{
8554#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_Py)
8555 return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
8556 __desr);
8557#else
8558 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
8559 __desr);
8560#endif
8561}
8562
8563inline _LIBCPP_INLINE_VISIBILITY
8564bool
8565__choose_compare_exchange_strong_acq_rel_acquire(void* volatile* __obj,
8566 void** __exp,
8567 void* __desr)
8568{
8569#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_Py)
8570 return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
8571 __desr);
8572#else
8573 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
8574 __desr);
8575#endif
8576}
8577
8578inline _LIBCPP_INLINE_VISIBILITY
8579bool
8580__choose_compare_exchange_strong_acq_rel_consume(void* volatile* __obj,
8581 void** __exp,
8582 void* __desr)
8583{
8584#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_Py)
8585 return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
8586 __desr);
8587#else
8588 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
8589 __desr);
8590#endif
8591}
8592
8593inline _LIBCPP_INLINE_VISIBILITY
8594bool
8595__choose_compare_exchange_strong_acq_rel_relaxed(void* volatile* __obj,
8596 void** __exp,
8597 void* __desr)
8598{
8599#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_Py)
8600 return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
8601 __desr);
8602#else
8603 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
8604 __desr);
8605#endif
8606}
8607
8608inline _LIBCPP_INLINE_VISIBILITY
8609bool
8610__choose_compare_exchange_strong_release_acquire(void* volatile* __obj,
8611 void** __exp,
8612 void* __desr)
8613{
8614#if __has_feature(__atomic_compare_exchange_strong_release_acquire_Py)
8615 return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
8616 __desr);
8617#else
8618 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
8619 __desr);
8620#endif
8621}
8622
8623inline _LIBCPP_INLINE_VISIBILITY
8624bool
8625__choose_compare_exchange_strong_release_consume(void* volatile* __obj,
8626 void** __exp,
8627 void* __desr)
8628{
8629#if __has_feature(__atomic_compare_exchange_strong_release_consume_Py)
8630 return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
8631 __desr);
8632#else
8633 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
8634 __desr);
8635#endif
8636}
8637
8638inline _LIBCPP_INLINE_VISIBILITY
8639bool
8640__choose_compare_exchange_strong_release_relaxed(void* volatile* __obj,
8641 void** __exp,
8642 void* __desr)
8643{
8644#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_Py)
8645 return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
8646 __desr);
8647#else
8648 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
8649 __desr);
8650#endif
8651}
8652
8653inline _LIBCPP_INLINE_VISIBILITY
8654bool
8655__choose_compare_exchange_strong_acquire_acquire(void* volatile* __obj,
8656 void** __exp,
8657 void* __desr)
8658{
8659#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_Py)
8660 return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
8661 __desr);
8662#else
8663 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
8664 __desr);
8665#endif
8666}
8667
8668inline _LIBCPP_INLINE_VISIBILITY
8669bool
8670__choose_compare_exchange_strong_acquire_consume(void* volatile* __obj,
8671 void** __exp,
8672 void* __desr)
8673{
8674#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_Py)
8675 return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
8676 __desr);
8677#else
8678 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
8679 __desr);
8680#endif
8681}
8682
8683inline _LIBCPP_INLINE_VISIBILITY
8684bool
8685__choose_compare_exchange_strong_acquire_relaxed(void* volatile* __obj,
8686 void** __exp,
8687 void* __desr)
8688{
8689#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_Py)
8690 return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
8691 __desr);
8692#else
8693 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
8694 __desr);
8695#endif
8696}
8697
8698inline _LIBCPP_INLINE_VISIBILITY
8699bool
8700__choose_compare_exchange_strong_consume_consume(void* volatile* __obj,
8701 void** __exp,
8702 void* __desr)
8703{
8704#if __has_feature(__atomic_compare_exchange_strong_consume_consume_Py)
8705 return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
8706 __desr);
8707#else
8708 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
8709 __desr);
8710#endif
8711}
8712
8713inline _LIBCPP_INLINE_VISIBILITY
8714bool
8715__choose_compare_exchange_strong_consume_relaxed(void* volatile* __obj,
8716 void** __exp,
8717 void* __desr)
8718{
8719#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_Py)
8720 return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
8721 __desr);
8722#else
8723 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
8724 __desr);
8725#endif
8726}
8727
8728inline _LIBCPP_INLINE_VISIBILITY
8729bool
8730__choose_compare_exchange_strong_relaxed_relaxed(void* volatile* __obj,
8731 void** __exp,
8732 void* __desr)
8733{
8734#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_Py)
8735 return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
8736 __desr);
8737#else
8738 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
8739 __desr);
8740#endif
8741}
8742
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008743// compare_exchange_weak bool
8744
8745inline _LIBCPP_INLINE_VISIBILITY
8746bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008747__choose_compare_exchange_weak_seq_cst_seq_cst(bool volatile* __obj,
8748 bool* __exp,
8749 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008750{
8751#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_b)
8752 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
8753 __desr);
8754#else
8755 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
8756 __desr);
8757#endif
8758}
8759
8760inline _LIBCPP_INLINE_VISIBILITY
8761bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008762__choose_compare_exchange_weak_seq_cst_acquire(bool volatile* __obj,
8763 bool* __exp,
8764 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008765{
8766#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_b)
8767 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
8768 __desr);
8769#else
8770 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
8771 __desr);
8772#endif
8773}
8774
8775inline _LIBCPP_INLINE_VISIBILITY
8776bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008777__choose_compare_exchange_weak_seq_cst_consume(bool volatile* __obj,
8778 bool* __exp,
8779 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008780{
8781#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_b)
8782 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
8783 __desr);
8784#else
8785 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
8786 __desr);
8787#endif
8788}
8789
8790inline _LIBCPP_INLINE_VISIBILITY
8791bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008792__choose_compare_exchange_weak_seq_cst_relaxed(bool volatile* __obj,
8793 bool* __exp,
8794 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008795{
8796#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_b)
8797 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
8798 __desr);
8799#else
8800 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
8801 __desr);
8802#endif
8803}
8804
8805inline _LIBCPP_INLINE_VISIBILITY
8806bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008807__choose_compare_exchange_weak_acq_rel_acquire(bool volatile* __obj,
8808 bool* __exp,
8809 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008810{
8811#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_b)
8812 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
8813 __desr);
8814#else
8815 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
8816 __desr);
8817#endif
8818}
8819
8820inline _LIBCPP_INLINE_VISIBILITY
8821bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008822__choose_compare_exchange_weak_acq_rel_consume(bool volatile* __obj,
8823 bool* __exp,
8824 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008825{
8826#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_b)
8827 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
8828 __desr);
8829#else
8830 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
8831 __desr);
8832#endif
8833}
8834
8835inline _LIBCPP_INLINE_VISIBILITY
8836bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008837__choose_compare_exchange_weak_acq_rel_relaxed(bool volatile* __obj,
8838 bool* __exp,
8839 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008840{
8841#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_b)
8842 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
8843 __desr);
8844#else
8845 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
8846 __desr);
8847#endif
8848}
8849
8850inline _LIBCPP_INLINE_VISIBILITY
8851bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008852__choose_compare_exchange_weak_release_acquire(bool volatile* __obj,
8853 bool* __exp,
8854 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008855{
8856#if __has_feature(__atomic_compare_exchange_weak_release_acquire_b)
8857 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
8858 __desr);
8859#else
8860 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
8861 __desr);
8862#endif
8863}
8864
8865inline _LIBCPP_INLINE_VISIBILITY
8866bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008867__choose_compare_exchange_weak_release_consume(bool volatile* __obj,
8868 bool* __exp,
8869 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008870{
8871#if __has_feature(__atomic_compare_exchange_weak_release_consume_b)
8872 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
8873 __desr);
8874#else
8875 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
8876 __desr);
8877#endif
8878}
8879
8880inline _LIBCPP_INLINE_VISIBILITY
8881bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008882__choose_compare_exchange_weak_release_relaxed(bool volatile* __obj,
8883 bool* __exp,
8884 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008885{
8886#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_b)
8887 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
8888 __desr);
8889#else
8890 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
8891 __desr);
8892#endif
8893}
8894
8895inline _LIBCPP_INLINE_VISIBILITY
8896bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008897__choose_compare_exchange_weak_acquire_acquire(bool volatile* __obj,
8898 bool* __exp,
8899 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008900{
8901#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_b)
8902 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
8903 __desr);
8904#else
8905 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
8906 __desr);
8907#endif
8908}
8909
8910inline _LIBCPP_INLINE_VISIBILITY
8911bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008912__choose_compare_exchange_weak_acquire_consume(bool volatile* __obj,
8913 bool* __exp,
8914 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008915{
8916#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_b)
8917 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
8918 __desr);
8919#else
8920 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
8921 __desr);
8922#endif
8923}
8924
8925inline _LIBCPP_INLINE_VISIBILITY
8926bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008927__choose_compare_exchange_weak_acquire_relaxed(bool volatile* __obj,
8928 bool* __exp,
8929 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008930{
8931#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_b)
8932 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
8933 __desr);
8934#else
8935 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
8936 __desr);
8937#endif
8938}
8939
8940inline _LIBCPP_INLINE_VISIBILITY
8941bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008942__choose_compare_exchange_weak_consume_consume(bool volatile* __obj,
8943 bool* __exp,
8944 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008945{
8946#if __has_feature(__atomic_compare_exchange_weak_consume_consume_b)
8947 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
8948 __desr);
8949#else
8950 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
8951 __desr);
8952#endif
8953}
8954
8955inline _LIBCPP_INLINE_VISIBILITY
8956bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008957__choose_compare_exchange_weak_consume_relaxed(bool volatile* __obj,
8958 bool* __exp,
8959 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008960{
8961#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_b)
8962 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
8963 __desr);
8964#else
8965 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
8966 __desr);
8967#endif
8968}
8969
8970inline _LIBCPP_INLINE_VISIBILITY
8971bool
Howard Hinnant002f1d32010-10-04 23:55:35 +00008972__choose_compare_exchange_weak_relaxed_relaxed(bool volatile* __obj,
8973 bool* __exp,
8974 bool __desr)
Howard Hinnant611fdaf2010-10-04 18:52:54 +00008975{
8976#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_b)
8977 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
8978 __desr);
8979#else
8980 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
8981 __desr);
8982#endif
8983}
8984
Howard Hinnant002f1d32010-10-04 23:55:35 +00008985// compare_exchange_weak signed char
8986
8987inline _LIBCPP_INLINE_VISIBILITY
8988bool
8989__choose_compare_exchange_weak_seq_cst_seq_cst(signed char volatile* __obj,
8990 signed char* __exp,
8991 signed char __desr)
8992{
8993#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_a)
8994 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
8995 __desr);
8996#else
8997 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
8998 __desr);
8999#endif
9000}
9001
9002inline _LIBCPP_INLINE_VISIBILITY
9003bool
9004__choose_compare_exchange_weak_seq_cst_acquire(signed char volatile* __obj,
9005 signed char* __exp,
9006 signed char __desr)
9007{
9008#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_a)
9009 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
9010 __desr);
9011#else
9012 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
9013 __desr);
9014#endif
9015}
9016
9017inline _LIBCPP_INLINE_VISIBILITY
9018bool
9019__choose_compare_exchange_weak_seq_cst_consume(signed char volatile* __obj,
9020 signed char* __exp,
9021 signed char __desr)
9022{
9023#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_a)
9024 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
9025 __desr);
9026#else
9027 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
9028 __desr);
9029#endif
9030}
9031
9032inline _LIBCPP_INLINE_VISIBILITY
9033bool
9034__choose_compare_exchange_weak_seq_cst_relaxed(signed char volatile* __obj,
9035 signed char* __exp,
9036 signed char __desr)
9037{
9038#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_a)
9039 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
9040 __desr);
9041#else
9042 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
9043 __desr);
9044#endif
9045}
9046
9047inline _LIBCPP_INLINE_VISIBILITY
9048bool
9049__choose_compare_exchange_weak_acq_rel_acquire(signed char volatile* __obj,
9050 signed char* __exp,
9051 signed char __desr)
9052{
9053#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_a)
9054 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
9055 __desr);
9056#else
9057 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
9058 __desr);
9059#endif
9060}
9061
9062inline _LIBCPP_INLINE_VISIBILITY
9063bool
9064__choose_compare_exchange_weak_acq_rel_consume(signed char volatile* __obj,
9065 signed char* __exp,
9066 signed char __desr)
9067{
9068#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_a)
9069 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
9070 __desr);
9071#else
9072 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
9073 __desr);
9074#endif
9075}
9076
9077inline _LIBCPP_INLINE_VISIBILITY
9078bool
9079__choose_compare_exchange_weak_acq_rel_relaxed(signed char volatile* __obj,
9080 signed char* __exp,
9081 signed char __desr)
9082{
9083#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_a)
9084 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
9085 __desr);
9086#else
9087 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
9088 __desr);
9089#endif
9090}
9091
9092inline _LIBCPP_INLINE_VISIBILITY
9093bool
9094__choose_compare_exchange_weak_release_acquire(signed char volatile* __obj,
9095 signed char* __exp,
9096 signed char __desr)
9097{
9098#if __has_feature(__atomic_compare_exchange_weak_release_acquire_a)
9099 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
9100 __desr);
9101#else
9102 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
9103 __desr);
9104#endif
9105}
9106
9107inline _LIBCPP_INLINE_VISIBILITY
9108bool
9109__choose_compare_exchange_weak_release_consume(signed char volatile* __obj,
9110 signed char* __exp,
9111 signed char __desr)
9112{
9113#if __has_feature(__atomic_compare_exchange_weak_release_consume_a)
9114 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
9115 __desr);
9116#else
9117 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
9118 __desr);
9119#endif
9120}
9121
9122inline _LIBCPP_INLINE_VISIBILITY
9123bool
9124__choose_compare_exchange_weak_release_relaxed(signed char volatile* __obj,
9125 signed char* __exp,
9126 signed char __desr)
9127{
9128#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_a)
9129 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
9130 __desr);
9131#else
9132 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
9133 __desr);
9134#endif
9135}
9136
9137inline _LIBCPP_INLINE_VISIBILITY
9138bool
9139__choose_compare_exchange_weak_acquire_acquire(signed char volatile* __obj,
9140 signed char* __exp,
9141 signed char __desr)
9142{
9143#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_a)
9144 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
9145 __desr);
9146#else
9147 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
9148 __desr);
9149#endif
9150}
9151
9152inline _LIBCPP_INLINE_VISIBILITY
9153bool
9154__choose_compare_exchange_weak_acquire_consume(signed char volatile* __obj,
9155 signed char* __exp,
9156 signed char __desr)
9157{
9158#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_a)
9159 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
9160 __desr);
9161#else
9162 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
9163 __desr);
9164#endif
9165}
9166
9167inline _LIBCPP_INLINE_VISIBILITY
9168bool
9169__choose_compare_exchange_weak_acquire_relaxed(signed char volatile* __obj,
9170 signed char* __exp,
9171 signed char __desr)
9172{
9173#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_a)
9174 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
9175 __desr);
9176#else
9177 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
9178 __desr);
9179#endif
9180}
9181
9182inline _LIBCPP_INLINE_VISIBILITY
9183bool
9184__choose_compare_exchange_weak_consume_consume(signed char volatile* __obj,
9185 signed char* __exp,
9186 signed char __desr)
9187{
9188#if __has_feature(__atomic_compare_exchange_weak_consume_consume_a)
9189 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
9190 __desr);
9191#else
9192 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
9193 __desr);
9194#endif
9195}
9196
9197inline _LIBCPP_INLINE_VISIBILITY
9198bool
9199__choose_compare_exchange_weak_consume_relaxed(signed char volatile* __obj,
9200 signed char* __exp,
9201 signed char __desr)
9202{
9203#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_a)
9204 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
9205 __desr);
9206#else
9207 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
9208 __desr);
9209#endif
9210}
9211
9212inline _LIBCPP_INLINE_VISIBILITY
9213bool
9214__choose_compare_exchange_weak_relaxed_relaxed(signed char volatile* __obj,
9215 signed char* __exp,
9216 signed char __desr)
9217{
9218#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_a)
9219 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
9220 __desr);
9221#else
9222 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
9223 __desr);
9224#endif
9225}
9226
9227// compare_exchange_weak unsigned char
9228
9229inline _LIBCPP_INLINE_VISIBILITY
9230bool
9231__choose_compare_exchange_weak_seq_cst_seq_cst(unsigned char volatile* __obj,
9232 unsigned char* __exp,
9233 unsigned char __desr)
9234{
9235#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_h)
9236 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
9237 __desr);
9238#else
9239 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
9240 __desr);
9241#endif
9242}
9243
9244inline _LIBCPP_INLINE_VISIBILITY
9245bool
9246__choose_compare_exchange_weak_seq_cst_acquire(unsigned char volatile* __obj,
9247 unsigned char* __exp,
9248 unsigned char __desr)
9249{
9250#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_h)
9251 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
9252 __desr);
9253#else
9254 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
9255 __desr);
9256#endif
9257}
9258
9259inline _LIBCPP_INLINE_VISIBILITY
9260bool
9261__choose_compare_exchange_weak_seq_cst_consume(unsigned char volatile* __obj,
9262 unsigned char* __exp,
9263 unsigned char __desr)
9264{
9265#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_h)
9266 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
9267 __desr);
9268#else
9269 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
9270 __desr);
9271#endif
9272}
9273
9274inline _LIBCPP_INLINE_VISIBILITY
9275bool
9276__choose_compare_exchange_weak_seq_cst_relaxed(unsigned char volatile* __obj,
9277 unsigned char* __exp,
9278 unsigned char __desr)
9279{
9280#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_h)
9281 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
9282 __desr);
9283#else
9284 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
9285 __desr);
9286#endif
9287}
9288
9289inline _LIBCPP_INLINE_VISIBILITY
9290bool
9291__choose_compare_exchange_weak_acq_rel_acquire(unsigned char volatile* __obj,
9292 unsigned char* __exp,
9293 unsigned char __desr)
9294{
9295#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_h)
9296 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
9297 __desr);
9298#else
9299 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
9300 __desr);
9301#endif
9302}
9303
9304inline _LIBCPP_INLINE_VISIBILITY
9305bool
9306__choose_compare_exchange_weak_acq_rel_consume(unsigned char volatile* __obj,
9307 unsigned char* __exp,
9308 unsigned char __desr)
9309{
9310#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_h)
9311 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
9312 __desr);
9313#else
9314 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
9315 __desr);
9316#endif
9317}
9318
9319inline _LIBCPP_INLINE_VISIBILITY
9320bool
9321__choose_compare_exchange_weak_acq_rel_relaxed(unsigned char volatile* __obj,
9322 unsigned char* __exp,
9323 unsigned char __desr)
9324{
9325#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_h)
9326 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
9327 __desr);
9328#else
9329 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
9330 __desr);
9331#endif
9332}
9333
9334inline _LIBCPP_INLINE_VISIBILITY
9335bool
9336__choose_compare_exchange_weak_release_acquire(unsigned char volatile* __obj,
9337 unsigned char* __exp,
9338 unsigned char __desr)
9339{
9340#if __has_feature(__atomic_compare_exchange_weak_release_acquire_h)
9341 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
9342 __desr);
9343#else
9344 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
9345 __desr);
9346#endif
9347}
9348
9349inline _LIBCPP_INLINE_VISIBILITY
9350bool
9351__choose_compare_exchange_weak_release_consume(unsigned char volatile* __obj,
9352 unsigned char* __exp,
9353 unsigned char __desr)
9354{
9355#if __has_feature(__atomic_compare_exchange_weak_release_consume_h)
9356 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
9357 __desr);
9358#else
9359 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
9360 __desr);
9361#endif
9362}
9363
9364inline _LIBCPP_INLINE_VISIBILITY
9365bool
9366__choose_compare_exchange_weak_release_relaxed(unsigned char volatile* __obj,
9367 unsigned char* __exp,
9368 unsigned char __desr)
9369{
9370#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_h)
9371 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
9372 __desr);
9373#else
9374 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
9375 __desr);
9376#endif
9377}
9378
9379inline _LIBCPP_INLINE_VISIBILITY
9380bool
9381__choose_compare_exchange_weak_acquire_acquire(unsigned char volatile* __obj,
9382 unsigned char* __exp,
9383 unsigned char __desr)
9384{
9385#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_h)
9386 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
9387 __desr);
9388#else
9389 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
9390 __desr);
9391#endif
9392}
9393
9394inline _LIBCPP_INLINE_VISIBILITY
9395bool
9396__choose_compare_exchange_weak_acquire_consume(unsigned char volatile* __obj,
9397 unsigned char* __exp,
9398 unsigned char __desr)
9399{
9400#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_h)
9401 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
9402 __desr);
9403#else
9404 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
9405 __desr);
9406#endif
9407}
9408
9409inline _LIBCPP_INLINE_VISIBILITY
9410bool
9411__choose_compare_exchange_weak_acquire_relaxed(unsigned char volatile* __obj,
9412 unsigned char* __exp,
9413 unsigned char __desr)
9414{
9415#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_h)
9416 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
9417 __desr);
9418#else
9419 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
9420 __desr);
9421#endif
9422}
9423
9424inline _LIBCPP_INLINE_VISIBILITY
9425bool
9426__choose_compare_exchange_weak_consume_consume(unsigned char volatile* __obj,
9427 unsigned char* __exp,
9428 unsigned char __desr)
9429{
9430#if __has_feature(__atomic_compare_exchange_weak_consume_consume_h)
9431 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
9432 __desr);
9433#else
9434 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
9435 __desr);
9436#endif
9437}
9438
9439inline _LIBCPP_INLINE_VISIBILITY
9440bool
9441__choose_compare_exchange_weak_consume_relaxed(unsigned char volatile* __obj,
9442 unsigned char* __exp,
9443 unsigned char __desr)
9444{
9445#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_h)
9446 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
9447 __desr);
9448#else
9449 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
9450 __desr);
9451#endif
9452}
9453
9454inline _LIBCPP_INLINE_VISIBILITY
9455bool
9456__choose_compare_exchange_weak_relaxed_relaxed(unsigned char volatile* __obj,
9457 unsigned char* __exp,
9458 unsigned char __desr)
9459{
9460#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_h)
9461 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
9462 __desr);
9463#else
9464 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
9465 __desr);
9466#endif
9467}
9468
9469#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
9470
9471// compare_exchange_weak char16_t
9472
9473inline _LIBCPP_INLINE_VISIBILITY
9474bool
9475__choose_compare_exchange_weak_seq_cst_seq_cst(char16_t volatile* __obj,
9476 char16_t* __exp,
9477 char16_t __desr)
9478{
9479#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_Ds)
9480 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
9481 __desr);
9482#else
9483 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
9484 __desr);
9485#endif
9486}
9487
9488inline _LIBCPP_INLINE_VISIBILITY
9489bool
9490__choose_compare_exchange_weak_seq_cst_acquire(char16_t volatile* __obj,
9491 char16_t* __exp,
9492 char16_t __desr)
9493{
9494#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_Ds)
9495 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
9496 __desr);
9497#else
9498 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
9499 __desr);
9500#endif
9501}
9502
9503inline _LIBCPP_INLINE_VISIBILITY
9504bool
9505__choose_compare_exchange_weak_seq_cst_consume(char16_t volatile* __obj,
9506 char16_t* __exp,
9507 char16_t __desr)
9508{
9509#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_Ds)
9510 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
9511 __desr);
9512#else
9513 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
9514 __desr);
9515#endif
9516}
9517
9518inline _LIBCPP_INLINE_VISIBILITY
9519bool
9520__choose_compare_exchange_weak_seq_cst_relaxed(char16_t volatile* __obj,
9521 char16_t* __exp,
9522 char16_t __desr)
9523{
9524#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_Ds)
9525 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
9526 __desr);
9527#else
9528 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
9529 __desr);
9530#endif
9531}
9532
9533inline _LIBCPP_INLINE_VISIBILITY
9534bool
9535__choose_compare_exchange_weak_acq_rel_acquire(char16_t volatile* __obj,
9536 char16_t* __exp,
9537 char16_t __desr)
9538{
9539#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_Ds)
9540 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
9541 __desr);
9542#else
9543 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
9544 __desr);
9545#endif
9546}
9547
9548inline _LIBCPP_INLINE_VISIBILITY
9549bool
9550__choose_compare_exchange_weak_acq_rel_consume(char16_t volatile* __obj,
9551 char16_t* __exp,
9552 char16_t __desr)
9553{
9554#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_Ds)
9555 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
9556 __desr);
9557#else
9558 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
9559 __desr);
9560#endif
9561}
9562
9563inline _LIBCPP_INLINE_VISIBILITY
9564bool
9565__choose_compare_exchange_weak_acq_rel_relaxed(char16_t volatile* __obj,
9566 char16_t* __exp,
9567 char16_t __desr)
9568{
9569#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_Ds)
9570 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
9571 __desr);
9572#else
9573 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
9574 __desr);
9575#endif
9576}
9577
9578inline _LIBCPP_INLINE_VISIBILITY
9579bool
9580__choose_compare_exchange_weak_release_acquire(char16_t volatile* __obj,
9581 char16_t* __exp,
9582 char16_t __desr)
9583{
9584#if __has_feature(__atomic_compare_exchange_weak_release_acquire_Ds)
9585 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
9586 __desr);
9587#else
9588 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
9589 __desr);
9590#endif
9591}
9592
9593inline _LIBCPP_INLINE_VISIBILITY
9594bool
9595__choose_compare_exchange_weak_release_consume(char16_t volatile* __obj,
9596 char16_t* __exp,
9597 char16_t __desr)
9598{
9599#if __has_feature(__atomic_compare_exchange_weak_release_consume_Ds)
9600 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
9601 __desr);
9602#else
9603 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
9604 __desr);
9605#endif
9606}
9607
9608inline _LIBCPP_INLINE_VISIBILITY
9609bool
9610__choose_compare_exchange_weak_release_relaxed(char16_t volatile* __obj,
9611 char16_t* __exp,
9612 char16_t __desr)
9613{
9614#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_Ds)
9615 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
9616 __desr);
9617#else
9618 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
9619 __desr);
9620#endif
9621}
9622
9623inline _LIBCPP_INLINE_VISIBILITY
9624bool
9625__choose_compare_exchange_weak_acquire_acquire(char16_t volatile* __obj,
9626 char16_t* __exp,
9627 char16_t __desr)
9628{
9629#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_Ds)
9630 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
9631 __desr);
9632#else
9633 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
9634 __desr);
9635#endif
9636}
9637
9638inline _LIBCPP_INLINE_VISIBILITY
9639bool
9640__choose_compare_exchange_weak_acquire_consume(char16_t volatile* __obj,
9641 char16_t* __exp,
9642 char16_t __desr)
9643{
9644#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_Ds)
9645 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
9646 __desr);
9647#else
9648 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
9649 __desr);
9650#endif
9651}
9652
9653inline _LIBCPP_INLINE_VISIBILITY
9654bool
9655__choose_compare_exchange_weak_acquire_relaxed(char16_t volatile* __obj,
9656 char16_t* __exp,
9657 char16_t __desr)
9658{
9659#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_Ds)
9660 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
9661 __desr);
9662#else
9663 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
9664 __desr);
9665#endif
9666}
9667
9668inline _LIBCPP_INLINE_VISIBILITY
9669bool
9670__choose_compare_exchange_weak_consume_consume(char16_t volatile* __obj,
9671 char16_t* __exp,
9672 char16_t __desr)
9673{
9674#if __has_feature(__atomic_compare_exchange_weak_consume_consume_Ds)
9675 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
9676 __desr);
9677#else
9678 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
9679 __desr);
9680#endif
9681}
9682
9683inline _LIBCPP_INLINE_VISIBILITY
9684bool
9685__choose_compare_exchange_weak_consume_relaxed(char16_t volatile* __obj,
9686 char16_t* __exp,
9687 char16_t __desr)
9688{
9689#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_Ds)
9690 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
9691 __desr);
9692#else
9693 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
9694 __desr);
9695#endif
9696}
9697
9698inline _LIBCPP_INLINE_VISIBILITY
9699bool
9700__choose_compare_exchange_weak_relaxed_relaxed(char16_t volatile* __obj,
9701 char16_t* __exp,
9702 char16_t __desr)
9703{
9704#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_Ds)
9705 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
9706 __desr);
9707#else
9708 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
9709 __desr);
9710#endif
9711}
9712
9713// compare_exchange_weak char32_t
9714
9715inline _LIBCPP_INLINE_VISIBILITY
9716bool
9717__choose_compare_exchange_weak_seq_cst_seq_cst(char32_t volatile* __obj,
9718 char32_t* __exp,
9719 char32_t __desr)
9720{
9721#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_Di)
9722 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
9723 __desr);
9724#else
9725 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
9726 __desr);
9727#endif
9728}
9729
9730inline _LIBCPP_INLINE_VISIBILITY
9731bool
9732__choose_compare_exchange_weak_seq_cst_acquire(char32_t volatile* __obj,
9733 char32_t* __exp,
9734 char32_t __desr)
9735{
9736#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_Di)
9737 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
9738 __desr);
9739#else
9740 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
9741 __desr);
9742#endif
9743}
9744
9745inline _LIBCPP_INLINE_VISIBILITY
9746bool
9747__choose_compare_exchange_weak_seq_cst_consume(char32_t volatile* __obj,
9748 char32_t* __exp,
9749 char32_t __desr)
9750{
9751#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_Di)
9752 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
9753 __desr);
9754#else
9755 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
9756 __desr);
9757#endif
9758}
9759
9760inline _LIBCPP_INLINE_VISIBILITY
9761bool
9762__choose_compare_exchange_weak_seq_cst_relaxed(char32_t volatile* __obj,
9763 char32_t* __exp,
9764 char32_t __desr)
9765{
9766#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_Di)
9767 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
9768 __desr);
9769#else
9770 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
9771 __desr);
9772#endif
9773}
9774
9775inline _LIBCPP_INLINE_VISIBILITY
9776bool
9777__choose_compare_exchange_weak_acq_rel_acquire(char32_t volatile* __obj,
9778 char32_t* __exp,
9779 char32_t __desr)
9780{
9781#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_Di)
9782 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
9783 __desr);
9784#else
9785 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
9786 __desr);
9787#endif
9788}
9789
9790inline _LIBCPP_INLINE_VISIBILITY
9791bool
9792__choose_compare_exchange_weak_acq_rel_consume(char32_t volatile* __obj,
9793 char32_t* __exp,
9794 char32_t __desr)
9795{
9796#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_Di)
9797 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
9798 __desr);
9799#else
9800 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
9801 __desr);
9802#endif
9803}
9804
9805inline _LIBCPP_INLINE_VISIBILITY
9806bool
9807__choose_compare_exchange_weak_acq_rel_relaxed(char32_t volatile* __obj,
9808 char32_t* __exp,
9809 char32_t __desr)
9810{
9811#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_Di)
9812 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
9813 __desr);
9814#else
9815 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
9816 __desr);
9817#endif
9818}
9819
9820inline _LIBCPP_INLINE_VISIBILITY
9821bool
9822__choose_compare_exchange_weak_release_acquire(char32_t volatile* __obj,
9823 char32_t* __exp,
9824 char32_t __desr)
9825{
9826#if __has_feature(__atomic_compare_exchange_weak_release_acquire_Di)
9827 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
9828 __desr);
9829#else
9830 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
9831 __desr);
9832#endif
9833}
9834
9835inline _LIBCPP_INLINE_VISIBILITY
9836bool
9837__choose_compare_exchange_weak_release_consume(char32_t volatile* __obj,
9838 char32_t* __exp,
9839 char32_t __desr)
9840{
9841#if __has_feature(__atomic_compare_exchange_weak_release_consume_Di)
9842 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
9843 __desr);
9844#else
9845 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
9846 __desr);
9847#endif
9848}
9849
9850inline _LIBCPP_INLINE_VISIBILITY
9851bool
9852__choose_compare_exchange_weak_release_relaxed(char32_t volatile* __obj,
9853 char32_t* __exp,
9854 char32_t __desr)
9855{
9856#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_Di)
9857 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
9858 __desr);
9859#else
9860 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
9861 __desr);
9862#endif
9863}
9864
9865inline _LIBCPP_INLINE_VISIBILITY
9866bool
9867__choose_compare_exchange_weak_acquire_acquire(char32_t volatile* __obj,
9868 char32_t* __exp,
9869 char32_t __desr)
9870{
9871#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_Di)
9872 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
9873 __desr);
9874#else
9875 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
9876 __desr);
9877#endif
9878}
9879
9880inline _LIBCPP_INLINE_VISIBILITY
9881bool
9882__choose_compare_exchange_weak_acquire_consume(char32_t volatile* __obj,
9883 char32_t* __exp,
9884 char32_t __desr)
9885{
9886#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_Di)
9887 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
9888 __desr);
9889#else
9890 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
9891 __desr);
9892#endif
9893}
9894
9895inline _LIBCPP_INLINE_VISIBILITY
9896bool
9897__choose_compare_exchange_weak_acquire_relaxed(char32_t volatile* __obj,
9898 char32_t* __exp,
9899 char32_t __desr)
9900{
9901#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_Di)
9902 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
9903 __desr);
9904#else
9905 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
9906 __desr);
9907#endif
9908}
9909
9910inline _LIBCPP_INLINE_VISIBILITY
9911bool
9912__choose_compare_exchange_weak_consume_consume(char32_t volatile* __obj,
9913 char32_t* __exp,
9914 char32_t __desr)
9915{
9916#if __has_feature(__atomic_compare_exchange_weak_consume_consume_Di)
9917 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
9918 __desr);
9919#else
9920 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
9921 __desr);
9922#endif
9923}
9924
9925inline _LIBCPP_INLINE_VISIBILITY
9926bool
9927__choose_compare_exchange_weak_consume_relaxed(char32_t volatile* __obj,
9928 char32_t* __exp,
9929 char32_t __desr)
9930{
9931#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_Di)
9932 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
9933 __desr);
9934#else
9935 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
9936 __desr);
9937#endif
9938}
9939
9940inline _LIBCPP_INLINE_VISIBILITY
9941bool
9942__choose_compare_exchange_weak_relaxed_relaxed(char32_t volatile* __obj,
9943 char32_t* __exp,
9944 char32_t __desr)
9945{
9946#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_Di)
9947 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
9948 __desr);
9949#else
9950 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
9951 __desr);
9952#endif
9953}
9954
9955#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
9956
9957// compare_exchange_weak wchar_t
9958
9959inline _LIBCPP_INLINE_VISIBILITY
9960bool
9961__choose_compare_exchange_weak_seq_cst_seq_cst(wchar_t volatile* __obj,
9962 wchar_t* __exp,
9963 wchar_t __desr)
9964{
9965#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_w)
9966 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
9967 __desr);
9968#else
9969 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
9970 __desr);
9971#endif
9972}
9973
9974inline _LIBCPP_INLINE_VISIBILITY
9975bool
9976__choose_compare_exchange_weak_seq_cst_acquire(wchar_t volatile* __obj,
9977 wchar_t* __exp,
9978 wchar_t __desr)
9979{
9980#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_w)
9981 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
9982 __desr);
9983#else
9984 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
9985 __desr);
9986#endif
9987}
9988
9989inline _LIBCPP_INLINE_VISIBILITY
9990bool
9991__choose_compare_exchange_weak_seq_cst_consume(wchar_t volatile* __obj,
9992 wchar_t* __exp,
9993 wchar_t __desr)
9994{
9995#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_w)
9996 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
9997 __desr);
9998#else
9999 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
10000 __desr);
10001#endif
10002}
10003
10004inline _LIBCPP_INLINE_VISIBILITY
10005bool
10006__choose_compare_exchange_weak_seq_cst_relaxed(wchar_t volatile* __obj,
10007 wchar_t* __exp,
10008 wchar_t __desr)
10009{
10010#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_w)
10011 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
10012 __desr);
10013#else
10014 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
10015 __desr);
10016#endif
10017}
10018
10019inline _LIBCPP_INLINE_VISIBILITY
10020bool
10021__choose_compare_exchange_weak_acq_rel_acquire(wchar_t volatile* __obj,
10022 wchar_t* __exp,
10023 wchar_t __desr)
10024{
10025#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_w)
10026 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
10027 __desr);
10028#else
10029 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
10030 __desr);
10031#endif
10032}
10033
10034inline _LIBCPP_INLINE_VISIBILITY
10035bool
10036__choose_compare_exchange_weak_acq_rel_consume(wchar_t volatile* __obj,
10037 wchar_t* __exp,
10038 wchar_t __desr)
10039{
10040#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_w)
10041 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
10042 __desr);
10043#else
10044 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
10045 __desr);
10046#endif
10047}
10048
10049inline _LIBCPP_INLINE_VISIBILITY
10050bool
10051__choose_compare_exchange_weak_acq_rel_relaxed(wchar_t volatile* __obj,
10052 wchar_t* __exp,
10053 wchar_t __desr)
10054{
10055#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_w)
10056 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
10057 __desr);
10058#else
10059 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
10060 __desr);
10061#endif
10062}
10063
10064inline _LIBCPP_INLINE_VISIBILITY
10065bool
10066__choose_compare_exchange_weak_release_acquire(wchar_t volatile* __obj,
10067 wchar_t* __exp,
10068 wchar_t __desr)
10069{
10070#if __has_feature(__atomic_compare_exchange_weak_release_acquire_w)
10071 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
10072 __desr);
10073#else
10074 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
10075 __desr);
10076#endif
10077}
10078
10079inline _LIBCPP_INLINE_VISIBILITY
10080bool
10081__choose_compare_exchange_weak_release_consume(wchar_t volatile* __obj,
10082 wchar_t* __exp,
10083 wchar_t __desr)
10084{
10085#if __has_feature(__atomic_compare_exchange_weak_release_consume_w)
10086 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
10087 __desr);
10088#else
10089 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
10090 __desr);
10091#endif
10092}
10093
10094inline _LIBCPP_INLINE_VISIBILITY
10095bool
10096__choose_compare_exchange_weak_release_relaxed(wchar_t volatile* __obj,
10097 wchar_t* __exp,
10098 wchar_t __desr)
10099{
10100#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_w)
10101 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
10102 __desr);
10103#else
10104 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
10105 __desr);
10106#endif
10107}
10108
10109inline _LIBCPP_INLINE_VISIBILITY
10110bool
10111__choose_compare_exchange_weak_acquire_acquire(wchar_t volatile* __obj,
10112 wchar_t* __exp,
10113 wchar_t __desr)
10114{
10115#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_w)
10116 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
10117 __desr);
10118#else
10119 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
10120 __desr);
10121#endif
10122}
10123
10124inline _LIBCPP_INLINE_VISIBILITY
10125bool
10126__choose_compare_exchange_weak_acquire_consume(wchar_t volatile* __obj,
10127 wchar_t* __exp,
10128 wchar_t __desr)
10129{
10130#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_w)
10131 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
10132 __desr);
10133#else
10134 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
10135 __desr);
10136#endif
10137}
10138
10139inline _LIBCPP_INLINE_VISIBILITY
10140bool
10141__choose_compare_exchange_weak_acquire_relaxed(wchar_t volatile* __obj,
10142 wchar_t* __exp,
10143 wchar_t __desr)
10144{
10145#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_w)
10146 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
10147 __desr);
10148#else
10149 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
10150 __desr);
10151#endif
10152}
10153
10154inline _LIBCPP_INLINE_VISIBILITY
10155bool
10156__choose_compare_exchange_weak_consume_consume(wchar_t volatile* __obj,
10157 wchar_t* __exp,
10158 wchar_t __desr)
10159{
10160#if __has_feature(__atomic_compare_exchange_weak_consume_consume_w)
10161 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
10162 __desr);
10163#else
10164 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
10165 __desr);
10166#endif
10167}
10168
10169inline _LIBCPP_INLINE_VISIBILITY
10170bool
10171__choose_compare_exchange_weak_consume_relaxed(wchar_t volatile* __obj,
10172 wchar_t* __exp,
10173 wchar_t __desr)
10174{
10175#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_w)
10176 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
10177 __desr);
10178#else
10179 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
10180 __desr);
10181#endif
10182}
10183
10184inline _LIBCPP_INLINE_VISIBILITY
10185bool
10186__choose_compare_exchange_weak_relaxed_relaxed(wchar_t volatile* __obj,
10187 wchar_t* __exp,
10188 wchar_t __desr)
10189{
10190#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_w)
10191 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
10192 __desr);
10193#else
10194 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
10195 __desr);
10196#endif
10197}
10198
10199// compare_exchange_weak short
10200
10201inline _LIBCPP_INLINE_VISIBILITY
10202bool
10203__choose_compare_exchange_weak_seq_cst_seq_cst(short volatile* __obj,
10204 short* __exp,
10205 short __desr)
10206{
10207#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_s)
10208 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
10209 __desr);
10210#else
10211 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
10212 __desr);
10213#endif
10214}
10215
10216inline _LIBCPP_INLINE_VISIBILITY
10217bool
10218__choose_compare_exchange_weak_seq_cst_acquire(short volatile* __obj,
10219 short* __exp,
10220 short __desr)
10221{
10222#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_s)
10223 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
10224 __desr);
10225#else
10226 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
10227 __desr);
10228#endif
10229}
10230
10231inline _LIBCPP_INLINE_VISIBILITY
10232bool
10233__choose_compare_exchange_weak_seq_cst_consume(short volatile* __obj,
10234 short* __exp,
10235 short __desr)
10236{
10237#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_s)
10238 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
10239 __desr);
10240#else
10241 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
10242 __desr);
10243#endif
10244}
10245
10246inline _LIBCPP_INLINE_VISIBILITY
10247bool
10248__choose_compare_exchange_weak_seq_cst_relaxed(short volatile* __obj,
10249 short* __exp,
10250 short __desr)
10251{
10252#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_s)
10253 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
10254 __desr);
10255#else
10256 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
10257 __desr);
10258#endif
10259}
10260
10261inline _LIBCPP_INLINE_VISIBILITY
10262bool
10263__choose_compare_exchange_weak_acq_rel_acquire(short volatile* __obj,
10264 short* __exp,
10265 short __desr)
10266{
10267#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_s)
10268 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
10269 __desr);
10270#else
10271 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
10272 __desr);
10273#endif
10274}
10275
10276inline _LIBCPP_INLINE_VISIBILITY
10277bool
10278__choose_compare_exchange_weak_acq_rel_consume(short volatile* __obj,
10279 short* __exp,
10280 short __desr)
10281{
10282#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_s)
10283 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
10284 __desr);
10285#else
10286 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
10287 __desr);
10288#endif
10289}
10290
10291inline _LIBCPP_INLINE_VISIBILITY
10292bool
10293__choose_compare_exchange_weak_acq_rel_relaxed(short volatile* __obj,
10294 short* __exp,
10295 short __desr)
10296{
10297#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_s)
10298 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
10299 __desr);
10300#else
10301 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
10302 __desr);
10303#endif
10304}
10305
10306inline _LIBCPP_INLINE_VISIBILITY
10307bool
10308__choose_compare_exchange_weak_release_acquire(short volatile* __obj,
10309 short* __exp,
10310 short __desr)
10311{
10312#if __has_feature(__atomic_compare_exchange_weak_release_acquire_s)
10313 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
10314 __desr);
10315#else
10316 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
10317 __desr);
10318#endif
10319}
10320
10321inline _LIBCPP_INLINE_VISIBILITY
10322bool
10323__choose_compare_exchange_weak_release_consume(short volatile* __obj,
10324 short* __exp,
10325 short __desr)
10326{
10327#if __has_feature(__atomic_compare_exchange_weak_release_consume_s)
10328 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
10329 __desr);
10330#else
10331 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
10332 __desr);
10333#endif
10334}
10335
10336inline _LIBCPP_INLINE_VISIBILITY
10337bool
10338__choose_compare_exchange_weak_release_relaxed(short volatile* __obj,
10339 short* __exp,
10340 short __desr)
10341{
10342#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_s)
10343 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
10344 __desr);
10345#else
10346 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
10347 __desr);
10348#endif
10349}
10350
10351inline _LIBCPP_INLINE_VISIBILITY
10352bool
10353__choose_compare_exchange_weak_acquire_acquire(short volatile* __obj,
10354 short* __exp,
10355 short __desr)
10356{
10357#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_s)
10358 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
10359 __desr);
10360#else
10361 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
10362 __desr);
10363#endif
10364}
10365
10366inline _LIBCPP_INLINE_VISIBILITY
10367bool
10368__choose_compare_exchange_weak_acquire_consume(short volatile* __obj,
10369 short* __exp,
10370 short __desr)
10371{
10372#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_s)
10373 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
10374 __desr);
10375#else
10376 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
10377 __desr);
10378#endif
10379}
10380
10381inline _LIBCPP_INLINE_VISIBILITY
10382bool
10383__choose_compare_exchange_weak_acquire_relaxed(short volatile* __obj,
10384 short* __exp,
10385 short __desr)
10386{
10387#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_s)
10388 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
10389 __desr);
10390#else
10391 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
10392 __desr);
10393#endif
10394}
10395
10396inline _LIBCPP_INLINE_VISIBILITY
10397bool
10398__choose_compare_exchange_weak_consume_consume(short volatile* __obj,
10399 short* __exp,
10400 short __desr)
10401{
10402#if __has_feature(__atomic_compare_exchange_weak_consume_consume_s)
10403 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
10404 __desr);
10405#else
10406 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
10407 __desr);
10408#endif
10409}
10410
10411inline _LIBCPP_INLINE_VISIBILITY
10412bool
10413__choose_compare_exchange_weak_consume_relaxed(short volatile* __obj,
10414 short* __exp,
10415 short __desr)
10416{
10417#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_s)
10418 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
10419 __desr);
10420#else
10421 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
10422 __desr);
10423#endif
10424}
10425
10426inline _LIBCPP_INLINE_VISIBILITY
10427bool
10428__choose_compare_exchange_weak_relaxed_relaxed(short volatile* __obj,
10429 short* __exp,
10430 short __desr)
10431{
10432#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_s)
10433 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
10434 __desr);
10435#else
10436 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
10437 __desr);
10438#endif
10439}
10440
10441// compare_exchange_weak unsigned short
10442
10443inline _LIBCPP_INLINE_VISIBILITY
10444bool
10445__choose_compare_exchange_weak_seq_cst_seq_cst(unsigned short volatile* __obj,
10446 unsigned short* __exp,
10447 unsigned short __desr)
10448{
10449#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_t)
10450 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
10451 __desr);
10452#else
10453 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
10454 __desr);
10455#endif
10456}
10457
10458inline _LIBCPP_INLINE_VISIBILITY
10459bool
10460__choose_compare_exchange_weak_seq_cst_acquire(unsigned short volatile* __obj,
10461 unsigned short* __exp,
10462 unsigned short __desr)
10463{
10464#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_t)
10465 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
10466 __desr);
10467#else
10468 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
10469 __desr);
10470#endif
10471}
10472
10473inline _LIBCPP_INLINE_VISIBILITY
10474bool
10475__choose_compare_exchange_weak_seq_cst_consume(unsigned short volatile* __obj,
10476 unsigned short* __exp,
10477 unsigned short __desr)
10478{
10479#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_t)
10480 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
10481 __desr);
10482#else
10483 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
10484 __desr);
10485#endif
10486}
10487
10488inline _LIBCPP_INLINE_VISIBILITY
10489bool
10490__choose_compare_exchange_weak_seq_cst_relaxed(unsigned short volatile* __obj,
10491 unsigned short* __exp,
10492 unsigned short __desr)
10493{
10494#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_t)
10495 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
10496 __desr);
10497#else
10498 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
10499 __desr);
10500#endif
10501}
10502
10503inline _LIBCPP_INLINE_VISIBILITY
10504bool
10505__choose_compare_exchange_weak_acq_rel_acquire(unsigned short volatile* __obj,
10506 unsigned short* __exp,
10507 unsigned short __desr)
10508{
10509#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_t)
10510 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
10511 __desr);
10512#else
10513 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
10514 __desr);
10515#endif
10516}
10517
10518inline _LIBCPP_INLINE_VISIBILITY
10519bool
10520__choose_compare_exchange_weak_acq_rel_consume(unsigned short volatile* __obj,
10521 unsigned short* __exp,
10522 unsigned short __desr)
10523{
10524#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_t)
10525 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
10526 __desr);
10527#else
10528 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
10529 __desr);
10530#endif
10531}
10532
10533inline _LIBCPP_INLINE_VISIBILITY
10534bool
10535__choose_compare_exchange_weak_acq_rel_relaxed(unsigned short volatile* __obj,
10536 unsigned short* __exp,
10537 unsigned short __desr)
10538{
10539#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_t)
10540 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
10541 __desr);
10542#else
10543 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
10544 __desr);
10545#endif
10546}
10547
10548inline _LIBCPP_INLINE_VISIBILITY
10549bool
10550__choose_compare_exchange_weak_release_acquire(unsigned short volatile* __obj,
10551 unsigned short* __exp,
10552 unsigned short __desr)
10553{
10554#if __has_feature(__atomic_compare_exchange_weak_release_acquire_t)
10555 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
10556 __desr);
10557#else
10558 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
10559 __desr);
10560#endif
10561}
10562
10563inline _LIBCPP_INLINE_VISIBILITY
10564bool
10565__choose_compare_exchange_weak_release_consume(unsigned short volatile* __obj,
10566 unsigned short* __exp,
10567 unsigned short __desr)
10568{
10569#if __has_feature(__atomic_compare_exchange_weak_release_consume_t)
10570 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
10571 __desr);
10572#else
10573 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
10574 __desr);
10575#endif
10576}
10577
10578inline _LIBCPP_INLINE_VISIBILITY
10579bool
10580__choose_compare_exchange_weak_release_relaxed(unsigned short volatile* __obj,
10581 unsigned short* __exp,
10582 unsigned short __desr)
10583{
10584#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_t)
10585 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
10586 __desr);
10587#else
10588 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
10589 __desr);
10590#endif
10591}
10592
10593inline _LIBCPP_INLINE_VISIBILITY
10594bool
10595__choose_compare_exchange_weak_acquire_acquire(unsigned short volatile* __obj,
10596 unsigned short* __exp,
10597 unsigned short __desr)
10598{
10599#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_t)
10600 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
10601 __desr);
10602#else
10603 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
10604 __desr);
10605#endif
10606}
10607
10608inline _LIBCPP_INLINE_VISIBILITY
10609bool
10610__choose_compare_exchange_weak_acquire_consume(unsigned short volatile* __obj,
10611 unsigned short* __exp,
10612 unsigned short __desr)
10613{
10614#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_t)
10615 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
10616 __desr);
10617#else
10618 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
10619 __desr);
10620#endif
10621}
10622
10623inline _LIBCPP_INLINE_VISIBILITY
10624bool
10625__choose_compare_exchange_weak_acquire_relaxed(unsigned short volatile* __obj,
10626 unsigned short* __exp,
10627 unsigned short __desr)
10628{
10629#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_t)
10630 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
10631 __desr);
10632#else
10633 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
10634 __desr);
10635#endif
10636}
10637
10638inline _LIBCPP_INLINE_VISIBILITY
10639bool
10640__choose_compare_exchange_weak_consume_consume(unsigned short volatile* __obj,
10641 unsigned short* __exp,
10642 unsigned short __desr)
10643{
10644#if __has_feature(__atomic_compare_exchange_weak_consume_consume_t)
10645 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
10646 __desr);
10647#else
10648 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
10649 __desr);
10650#endif
10651}
10652
10653inline _LIBCPP_INLINE_VISIBILITY
10654bool
10655__choose_compare_exchange_weak_consume_relaxed(unsigned short volatile* __obj,
10656 unsigned short* __exp,
10657 unsigned short __desr)
10658{
10659#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_t)
10660 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
10661 __desr);
10662#else
10663 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
10664 __desr);
10665#endif
10666}
10667
10668inline _LIBCPP_INLINE_VISIBILITY
10669bool
10670__choose_compare_exchange_weak_relaxed_relaxed(unsigned short volatile* __obj,
10671 unsigned short* __exp,
10672 unsigned short __desr)
10673{
10674#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_t)
10675 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
10676 __desr);
10677#else
10678 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
10679 __desr);
10680#endif
10681}
10682
10683// compare_exchange_weak int
10684
10685inline _LIBCPP_INLINE_VISIBILITY
10686bool
10687__choose_compare_exchange_weak_seq_cst_seq_cst(int volatile* __obj,
10688 int* __exp,
10689 int __desr)
10690{
10691#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_i)
10692 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
10693 __desr);
10694#else
10695 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
10696 __desr);
10697#endif
10698}
10699
10700inline _LIBCPP_INLINE_VISIBILITY
10701bool
10702__choose_compare_exchange_weak_seq_cst_acquire(int volatile* __obj,
10703 int* __exp,
10704 int __desr)
10705{
10706#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_i)
10707 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
10708 __desr);
10709#else
10710 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
10711 __desr);
10712#endif
10713}
10714
10715inline _LIBCPP_INLINE_VISIBILITY
10716bool
10717__choose_compare_exchange_weak_seq_cst_consume(int volatile* __obj,
10718 int* __exp,
10719 int __desr)
10720{
10721#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_i)
10722 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
10723 __desr);
10724#else
10725 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
10726 __desr);
10727#endif
10728}
10729
10730inline _LIBCPP_INLINE_VISIBILITY
10731bool
10732__choose_compare_exchange_weak_seq_cst_relaxed(int volatile* __obj,
10733 int* __exp,
10734 int __desr)
10735{
10736#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_i)
10737 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
10738 __desr);
10739#else
10740 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
10741 __desr);
10742#endif
10743}
10744
10745inline _LIBCPP_INLINE_VISIBILITY
10746bool
10747__choose_compare_exchange_weak_acq_rel_acquire(int volatile* __obj,
10748 int* __exp,
10749 int __desr)
10750{
10751#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_i)
10752 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
10753 __desr);
10754#else
10755 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
10756 __desr);
10757#endif
10758}
10759
10760inline _LIBCPP_INLINE_VISIBILITY
10761bool
10762__choose_compare_exchange_weak_acq_rel_consume(int volatile* __obj,
10763 int* __exp,
10764 int __desr)
10765{
10766#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_i)
10767 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
10768 __desr);
10769#else
10770 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
10771 __desr);
10772#endif
10773}
10774
10775inline _LIBCPP_INLINE_VISIBILITY
10776bool
10777__choose_compare_exchange_weak_acq_rel_relaxed(int volatile* __obj,
10778 int* __exp,
10779 int __desr)
10780{
10781#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_i)
10782 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
10783 __desr);
10784#else
10785 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
10786 __desr);
10787#endif
10788}
10789
10790inline _LIBCPP_INLINE_VISIBILITY
10791bool
10792__choose_compare_exchange_weak_release_acquire(int volatile* __obj,
10793 int* __exp,
10794 int __desr)
10795{
10796#if __has_feature(__atomic_compare_exchange_weak_release_acquire_i)
10797 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
10798 __desr);
10799#else
10800 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
10801 __desr);
10802#endif
10803}
10804
10805inline _LIBCPP_INLINE_VISIBILITY
10806bool
10807__choose_compare_exchange_weak_release_consume(int volatile* __obj,
10808 int* __exp,
10809 int __desr)
10810{
10811#if __has_feature(__atomic_compare_exchange_weak_release_consume_i)
10812 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
10813 __desr);
10814#else
10815 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
10816 __desr);
10817#endif
10818}
10819
10820inline _LIBCPP_INLINE_VISIBILITY
10821bool
10822__choose_compare_exchange_weak_release_relaxed(int volatile* __obj,
10823 int* __exp,
10824 int __desr)
10825{
10826#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_i)
10827 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
10828 __desr);
10829#else
10830 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
10831 __desr);
10832#endif
10833}
10834
10835inline _LIBCPP_INLINE_VISIBILITY
10836bool
10837__choose_compare_exchange_weak_acquire_acquire(int volatile* __obj,
10838 int* __exp,
10839 int __desr)
10840{
10841#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_i)
10842 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
10843 __desr);
10844#else
10845 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
10846 __desr);
10847#endif
10848}
10849
10850inline _LIBCPP_INLINE_VISIBILITY
10851bool
10852__choose_compare_exchange_weak_acquire_consume(int volatile* __obj,
10853 int* __exp,
10854 int __desr)
10855{
10856#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_i)
10857 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
10858 __desr);
10859#else
10860 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
10861 __desr);
10862#endif
10863}
10864
10865inline _LIBCPP_INLINE_VISIBILITY
10866bool
10867__choose_compare_exchange_weak_acquire_relaxed(int volatile* __obj,
10868 int* __exp,
10869 int __desr)
10870{
10871#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_i)
10872 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
10873 __desr);
10874#else
10875 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
10876 __desr);
10877#endif
10878}
10879
10880inline _LIBCPP_INLINE_VISIBILITY
10881bool
10882__choose_compare_exchange_weak_consume_consume(int volatile* __obj,
10883 int* __exp,
10884 int __desr)
10885{
10886#if __has_feature(__atomic_compare_exchange_weak_consume_consume_i)
10887 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
10888 __desr);
10889#else
10890 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
10891 __desr);
10892#endif
10893}
10894
10895inline _LIBCPP_INLINE_VISIBILITY
10896bool
10897__choose_compare_exchange_weak_consume_relaxed(int volatile* __obj,
10898 int* __exp,
10899 int __desr)
10900{
10901#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_i)
10902 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
10903 __desr);
10904#else
10905 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
10906 __desr);
10907#endif
10908}
10909
10910inline _LIBCPP_INLINE_VISIBILITY
10911bool
10912__choose_compare_exchange_weak_relaxed_relaxed(int volatile* __obj,
10913 int* __exp,
10914 int __desr)
10915{
10916#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_i)
10917 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
10918 __desr);
10919#else
10920 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
10921 __desr);
10922#endif
10923}
10924
10925// compare_exchange_weak unsigned int
10926
10927inline _LIBCPP_INLINE_VISIBILITY
10928bool
10929__choose_compare_exchange_weak_seq_cst_seq_cst(unsigned int volatile* __obj,
10930 unsigned int* __exp,
10931 unsigned int __desr)
10932{
10933#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_j)
10934 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
10935 __desr);
10936#else
10937 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
10938 __desr);
10939#endif
10940}
10941
10942inline _LIBCPP_INLINE_VISIBILITY
10943bool
10944__choose_compare_exchange_weak_seq_cst_acquire(unsigned int volatile* __obj,
10945 unsigned int* __exp,
10946 unsigned int __desr)
10947{
10948#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_j)
10949 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
10950 __desr);
10951#else
10952 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
10953 __desr);
10954#endif
10955}
10956
10957inline _LIBCPP_INLINE_VISIBILITY
10958bool
10959__choose_compare_exchange_weak_seq_cst_consume(unsigned int volatile* __obj,
10960 unsigned int* __exp,
10961 unsigned int __desr)
10962{
10963#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_j)
10964 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
10965 __desr);
10966#else
10967 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
10968 __desr);
10969#endif
10970}
10971
10972inline _LIBCPP_INLINE_VISIBILITY
10973bool
10974__choose_compare_exchange_weak_seq_cst_relaxed(unsigned int volatile* __obj,
10975 unsigned int* __exp,
10976 unsigned int __desr)
10977{
10978#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_j)
10979 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
10980 __desr);
10981#else
10982 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
10983 __desr);
10984#endif
10985}
10986
10987inline _LIBCPP_INLINE_VISIBILITY
10988bool
10989__choose_compare_exchange_weak_acq_rel_acquire(unsigned int volatile* __obj,
10990 unsigned int* __exp,
10991 unsigned int __desr)
10992{
10993#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_j)
10994 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
10995 __desr);
10996#else
10997 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
10998 __desr);
10999#endif
11000}
11001
11002inline _LIBCPP_INLINE_VISIBILITY
11003bool
11004__choose_compare_exchange_weak_acq_rel_consume(unsigned int volatile* __obj,
11005 unsigned int* __exp,
11006 unsigned int __desr)
11007{
11008#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_j)
11009 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
11010 __desr);
11011#else
11012 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
11013 __desr);
11014#endif
11015}
11016
11017inline _LIBCPP_INLINE_VISIBILITY
11018bool
11019__choose_compare_exchange_weak_acq_rel_relaxed(unsigned int volatile* __obj,
11020 unsigned int* __exp,
11021 unsigned int __desr)
11022{
11023#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_j)
11024 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
11025 __desr);
11026#else
11027 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
11028 __desr);
11029#endif
11030}
11031
11032inline _LIBCPP_INLINE_VISIBILITY
11033bool
11034__choose_compare_exchange_weak_release_acquire(unsigned int volatile* __obj,
11035 unsigned int* __exp,
11036 unsigned int __desr)
11037{
11038#if __has_feature(__atomic_compare_exchange_weak_release_acquire_j)
11039 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
11040 __desr);
11041#else
11042 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
11043 __desr);
11044#endif
11045}
11046
11047inline _LIBCPP_INLINE_VISIBILITY
11048bool
11049__choose_compare_exchange_weak_release_consume(unsigned int volatile* __obj,
11050 unsigned int* __exp,
11051 unsigned int __desr)
11052{
11053#if __has_feature(__atomic_compare_exchange_weak_release_consume_j)
11054 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
11055 __desr);
11056#else
11057 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
11058 __desr);
11059#endif
11060}
11061
11062inline _LIBCPP_INLINE_VISIBILITY
11063bool
11064__choose_compare_exchange_weak_release_relaxed(unsigned int volatile* __obj,
11065 unsigned int* __exp,
11066 unsigned int __desr)
11067{
11068#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_j)
11069 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
11070 __desr);
11071#else
11072 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
11073 __desr);
11074#endif
11075}
11076
11077inline _LIBCPP_INLINE_VISIBILITY
11078bool
11079__choose_compare_exchange_weak_acquire_acquire(unsigned int volatile* __obj,
11080 unsigned int* __exp,
11081 unsigned int __desr)
11082{
11083#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_j)
11084 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
11085 __desr);
11086#else
11087 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
11088 __desr);
11089#endif
11090}
11091
11092inline _LIBCPP_INLINE_VISIBILITY
11093bool
11094__choose_compare_exchange_weak_acquire_consume(unsigned int volatile* __obj,
11095 unsigned int* __exp,
11096 unsigned int __desr)
11097{
11098#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_j)
11099 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
11100 __desr);
11101#else
11102 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
11103 __desr);
11104#endif
11105}
11106
11107inline _LIBCPP_INLINE_VISIBILITY
11108bool
11109__choose_compare_exchange_weak_acquire_relaxed(unsigned int volatile* __obj,
11110 unsigned int* __exp,
11111 unsigned int __desr)
11112{
11113#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_j)
11114 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
11115 __desr);
11116#else
11117 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
11118 __desr);
11119#endif
11120}
11121
11122inline _LIBCPP_INLINE_VISIBILITY
11123bool
11124__choose_compare_exchange_weak_consume_consume(unsigned int volatile* __obj,
11125 unsigned int* __exp,
11126 unsigned int __desr)
11127{
11128#if __has_feature(__atomic_compare_exchange_weak_consume_consume_j)
11129 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
11130 __desr);
11131#else
11132 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
11133 __desr);
11134#endif
11135}
11136
11137inline _LIBCPP_INLINE_VISIBILITY
11138bool
11139__choose_compare_exchange_weak_consume_relaxed(unsigned int volatile* __obj,
11140 unsigned int* __exp,
11141 unsigned int __desr)
11142{
11143#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_j)
11144 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
11145 __desr);
11146#else
11147 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
11148 __desr);
11149#endif
11150}
11151
11152inline _LIBCPP_INLINE_VISIBILITY
11153bool
11154__choose_compare_exchange_weak_relaxed_relaxed(unsigned int volatile* __obj,
11155 unsigned int* __exp,
11156 unsigned int __desr)
11157{
11158#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_j)
11159 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
11160 __desr);
11161#else
11162 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
11163 __desr);
11164#endif
11165}
11166
11167// compare_exchange_weak long
11168
11169inline _LIBCPP_INLINE_VISIBILITY
11170bool
11171__choose_compare_exchange_weak_seq_cst_seq_cst(long volatile* __obj,
11172 long* __exp,
11173 long __desr)
11174{
11175#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_l)
11176 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
11177 __desr);
11178#else
11179 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
11180 __desr);
11181#endif
11182}
11183
11184inline _LIBCPP_INLINE_VISIBILITY
11185bool
11186__choose_compare_exchange_weak_seq_cst_acquire(long volatile* __obj,
11187 long* __exp,
11188 long __desr)
11189{
11190#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_l)
11191 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
11192 __desr);
11193#else
11194 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
11195 __desr);
11196#endif
11197}
11198
11199inline _LIBCPP_INLINE_VISIBILITY
11200bool
11201__choose_compare_exchange_weak_seq_cst_consume(long volatile* __obj,
11202 long* __exp,
11203 long __desr)
11204{
11205#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_l)
11206 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
11207 __desr);
11208#else
11209 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
11210 __desr);
11211#endif
11212}
11213
11214inline _LIBCPP_INLINE_VISIBILITY
11215bool
11216__choose_compare_exchange_weak_seq_cst_relaxed(long volatile* __obj,
11217 long* __exp,
11218 long __desr)
11219{
11220#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_l)
11221 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
11222 __desr);
11223#else
11224 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
11225 __desr);
11226#endif
11227}
11228
11229inline _LIBCPP_INLINE_VISIBILITY
11230bool
11231__choose_compare_exchange_weak_acq_rel_acquire(long volatile* __obj,
11232 long* __exp,
11233 long __desr)
11234{
11235#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_l)
11236 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
11237 __desr);
11238#else
11239 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
11240 __desr);
11241#endif
11242}
11243
11244inline _LIBCPP_INLINE_VISIBILITY
11245bool
11246__choose_compare_exchange_weak_acq_rel_consume(long volatile* __obj,
11247 long* __exp,
11248 long __desr)
11249{
11250#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_l)
11251 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
11252 __desr);
11253#else
11254 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
11255 __desr);
11256#endif
11257}
11258
11259inline _LIBCPP_INLINE_VISIBILITY
11260bool
11261__choose_compare_exchange_weak_acq_rel_relaxed(long volatile* __obj,
11262 long* __exp,
11263 long __desr)
11264{
11265#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_l)
11266 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
11267 __desr);
11268#else
11269 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
11270 __desr);
11271#endif
11272}
11273
11274inline _LIBCPP_INLINE_VISIBILITY
11275bool
11276__choose_compare_exchange_weak_release_acquire(long volatile* __obj,
11277 long* __exp,
11278 long __desr)
11279{
11280#if __has_feature(__atomic_compare_exchange_weak_release_acquire_l)
11281 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
11282 __desr);
11283#else
11284 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
11285 __desr);
11286#endif
11287}
11288
11289inline _LIBCPP_INLINE_VISIBILITY
11290bool
11291__choose_compare_exchange_weak_release_consume(long volatile* __obj,
11292 long* __exp,
11293 long __desr)
11294{
11295#if __has_feature(__atomic_compare_exchange_weak_release_consume_l)
11296 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
11297 __desr);
11298#else
11299 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
11300 __desr);
11301#endif
11302}
11303
11304inline _LIBCPP_INLINE_VISIBILITY
11305bool
11306__choose_compare_exchange_weak_release_relaxed(long volatile* __obj,
11307 long* __exp,
11308 long __desr)
11309{
11310#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_l)
11311 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
11312 __desr);
11313#else
11314 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
11315 __desr);
11316#endif
11317}
11318
11319inline _LIBCPP_INLINE_VISIBILITY
11320bool
11321__choose_compare_exchange_weak_acquire_acquire(long volatile* __obj,
11322 long* __exp,
11323 long __desr)
11324{
11325#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_l)
11326 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
11327 __desr);
11328#else
11329 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
11330 __desr);
11331#endif
11332}
11333
11334inline _LIBCPP_INLINE_VISIBILITY
11335bool
11336__choose_compare_exchange_weak_acquire_consume(long volatile* __obj,
11337 long* __exp,
11338 long __desr)
11339{
11340#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_l)
11341 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
11342 __desr);
11343#else
11344 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
11345 __desr);
11346#endif
11347}
11348
11349inline _LIBCPP_INLINE_VISIBILITY
11350bool
11351__choose_compare_exchange_weak_acquire_relaxed(long volatile* __obj,
11352 long* __exp,
11353 long __desr)
11354{
11355#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_l)
11356 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
11357 __desr);
11358#else
11359 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
11360 __desr);
11361#endif
11362}
11363
11364inline _LIBCPP_INLINE_VISIBILITY
11365bool
11366__choose_compare_exchange_weak_consume_consume(long volatile* __obj,
11367 long* __exp,
11368 long __desr)
11369{
11370#if __has_feature(__atomic_compare_exchange_weak_consume_consume_l)
11371 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
11372 __desr);
11373#else
11374 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
11375 __desr);
11376#endif
11377}
11378
11379inline _LIBCPP_INLINE_VISIBILITY
11380bool
11381__choose_compare_exchange_weak_consume_relaxed(long volatile* __obj,
11382 long* __exp,
11383 long __desr)
11384{
11385#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_l)
11386 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
11387 __desr);
11388#else
11389 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
11390 __desr);
11391#endif
11392}
11393
11394inline _LIBCPP_INLINE_VISIBILITY
11395bool
11396__choose_compare_exchange_weak_relaxed_relaxed(long volatile* __obj,
11397 long* __exp,
11398 long __desr)
11399{
11400#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_l)
11401 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
11402 __desr);
11403#else
11404 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
11405 __desr);
11406#endif
11407}
11408
11409// compare_exchange_weak unsigned long
11410
11411inline _LIBCPP_INLINE_VISIBILITY
11412bool
11413__choose_compare_exchange_weak_seq_cst_seq_cst(unsigned long volatile* __obj,
11414 unsigned long* __exp,
11415 unsigned long __desr)
11416{
11417#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_m)
11418 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
11419 __desr);
11420#else
11421 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
11422 __desr);
11423#endif
11424}
11425
11426inline _LIBCPP_INLINE_VISIBILITY
11427bool
11428__choose_compare_exchange_weak_seq_cst_acquire(unsigned long volatile* __obj,
11429 unsigned long* __exp,
11430 unsigned long __desr)
11431{
11432#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_m)
11433 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
11434 __desr);
11435#else
11436 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
11437 __desr);
11438#endif
11439}
11440
11441inline _LIBCPP_INLINE_VISIBILITY
11442bool
11443__choose_compare_exchange_weak_seq_cst_consume(unsigned long volatile* __obj,
11444 unsigned long* __exp,
11445 unsigned long __desr)
11446{
11447#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_m)
11448 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
11449 __desr);
11450#else
11451 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
11452 __desr);
11453#endif
11454}
11455
11456inline _LIBCPP_INLINE_VISIBILITY
11457bool
11458__choose_compare_exchange_weak_seq_cst_relaxed(unsigned long volatile* __obj,
11459 unsigned long* __exp,
11460 unsigned long __desr)
11461{
11462#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_m)
11463 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
11464 __desr);
11465#else
11466 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
11467 __desr);
11468#endif
11469}
11470
11471inline _LIBCPP_INLINE_VISIBILITY
11472bool
11473__choose_compare_exchange_weak_acq_rel_acquire(unsigned long volatile* __obj,
11474 unsigned long* __exp,
11475 unsigned long __desr)
11476{
11477#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_m)
11478 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
11479 __desr);
11480#else
11481 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
11482 __desr);
11483#endif
11484}
11485
11486inline _LIBCPP_INLINE_VISIBILITY
11487bool
11488__choose_compare_exchange_weak_acq_rel_consume(unsigned long volatile* __obj,
11489 unsigned long* __exp,
11490 unsigned long __desr)
11491{
11492#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_m)
11493 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
11494 __desr);
11495#else
11496 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
11497 __desr);
11498#endif
11499}
11500
11501inline _LIBCPP_INLINE_VISIBILITY
11502bool
11503__choose_compare_exchange_weak_acq_rel_relaxed(unsigned long volatile* __obj,
11504 unsigned long* __exp,
11505 unsigned long __desr)
11506{
11507#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_m)
11508 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
11509 __desr);
11510#else
11511 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
11512 __desr);
11513#endif
11514}
11515
11516inline _LIBCPP_INLINE_VISIBILITY
11517bool
11518__choose_compare_exchange_weak_release_acquire(unsigned long volatile* __obj,
11519 unsigned long* __exp,
11520 unsigned long __desr)
11521{
11522#if __has_feature(__atomic_compare_exchange_weak_release_acquire_m)
11523 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
11524 __desr);
11525#else
11526 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
11527 __desr);
11528#endif
11529}
11530
11531inline _LIBCPP_INLINE_VISIBILITY
11532bool
11533__choose_compare_exchange_weak_release_consume(unsigned long volatile* __obj,
11534 unsigned long* __exp,
11535 unsigned long __desr)
11536{
11537#if __has_feature(__atomic_compare_exchange_weak_release_consume_m)
11538 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
11539 __desr);
11540#else
11541 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
11542 __desr);
11543#endif
11544}
11545
11546inline _LIBCPP_INLINE_VISIBILITY
11547bool
11548__choose_compare_exchange_weak_release_relaxed(unsigned long volatile* __obj,
11549 unsigned long* __exp,
11550 unsigned long __desr)
11551{
11552#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_m)
11553 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
11554 __desr);
11555#else
11556 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
11557 __desr);
11558#endif
11559}
11560
11561inline _LIBCPP_INLINE_VISIBILITY
11562bool
11563__choose_compare_exchange_weak_acquire_acquire(unsigned long volatile* __obj,
11564 unsigned long* __exp,
11565 unsigned long __desr)
11566{
11567#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_m)
11568 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
11569 __desr);
11570#else
11571 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
11572 __desr);
11573#endif
11574}
11575
11576inline _LIBCPP_INLINE_VISIBILITY
11577bool
11578__choose_compare_exchange_weak_acquire_consume(unsigned long volatile* __obj,
11579 unsigned long* __exp,
11580 unsigned long __desr)
11581{
11582#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_m)
11583 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
11584 __desr);
11585#else
11586 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
11587 __desr);
11588#endif
11589}
11590
11591inline _LIBCPP_INLINE_VISIBILITY
11592bool
11593__choose_compare_exchange_weak_acquire_relaxed(unsigned long volatile* __obj,
11594 unsigned long* __exp,
11595 unsigned long __desr)
11596{
11597#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_m)
11598 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
11599 __desr);
11600#else
11601 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
11602 __desr);
11603#endif
11604}
11605
11606inline _LIBCPP_INLINE_VISIBILITY
11607bool
11608__choose_compare_exchange_weak_consume_consume(unsigned long volatile* __obj,
11609 unsigned long* __exp,
11610 unsigned long __desr)
11611{
11612#if __has_feature(__atomic_compare_exchange_weak_consume_consume_m)
11613 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
11614 __desr);
11615#else
11616 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
11617 __desr);
11618#endif
11619}
11620
11621inline _LIBCPP_INLINE_VISIBILITY
11622bool
11623__choose_compare_exchange_weak_consume_relaxed(unsigned long volatile* __obj,
11624 unsigned long* __exp,
11625 unsigned long __desr)
11626{
11627#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_m)
11628 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
11629 __desr);
11630#else
11631 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
11632 __desr);
11633#endif
11634}
11635
11636inline _LIBCPP_INLINE_VISIBILITY
11637bool
11638__choose_compare_exchange_weak_relaxed_relaxed(unsigned long volatile* __obj,
11639 unsigned long* __exp,
11640 unsigned long __desr)
11641{
11642#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_m)
11643 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
11644 __desr);
11645#else
11646 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
11647 __desr);
11648#endif
11649}
11650
11651// compare_exchange_weak long long
11652
11653inline _LIBCPP_INLINE_VISIBILITY
11654bool
11655__choose_compare_exchange_weak_seq_cst_seq_cst(long long volatile* __obj,
11656 long long* __exp,
11657 long long __desr)
11658{
11659#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_x)
11660 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
11661 __desr);
11662#else
11663 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
11664 __desr);
11665#endif
11666}
11667
11668inline _LIBCPP_INLINE_VISIBILITY
11669bool
11670__choose_compare_exchange_weak_seq_cst_acquire(long long volatile* __obj,
11671 long long* __exp,
11672 long long __desr)
11673{
11674#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_x)
11675 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
11676 __desr);
11677#else
11678 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
11679 __desr);
11680#endif
11681}
11682
11683inline _LIBCPP_INLINE_VISIBILITY
11684bool
11685__choose_compare_exchange_weak_seq_cst_consume(long long volatile* __obj,
11686 long long* __exp,
11687 long long __desr)
11688{
11689#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_x)
11690 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
11691 __desr);
11692#else
11693 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
11694 __desr);
11695#endif
11696}
11697
11698inline _LIBCPP_INLINE_VISIBILITY
11699bool
11700__choose_compare_exchange_weak_seq_cst_relaxed(long long volatile* __obj,
11701 long long* __exp,
11702 long long __desr)
11703{
11704#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_x)
11705 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
11706 __desr);
11707#else
11708 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
11709 __desr);
11710#endif
11711}
11712
11713inline _LIBCPP_INLINE_VISIBILITY
11714bool
11715__choose_compare_exchange_weak_acq_rel_acquire(long long volatile* __obj,
11716 long long* __exp,
11717 long long __desr)
11718{
11719#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_x)
11720 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
11721 __desr);
11722#else
11723 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
11724 __desr);
11725#endif
11726}
11727
11728inline _LIBCPP_INLINE_VISIBILITY
11729bool
11730__choose_compare_exchange_weak_acq_rel_consume(long long volatile* __obj,
11731 long long* __exp,
11732 long long __desr)
11733{
11734#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_x)
11735 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
11736 __desr);
11737#else
11738 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
11739 __desr);
11740#endif
11741}
11742
11743inline _LIBCPP_INLINE_VISIBILITY
11744bool
11745__choose_compare_exchange_weak_acq_rel_relaxed(long long volatile* __obj,
11746 long long* __exp,
11747 long long __desr)
11748{
11749#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_x)
11750 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
11751 __desr);
11752#else
11753 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
11754 __desr);
11755#endif
11756}
11757
11758inline _LIBCPP_INLINE_VISIBILITY
11759bool
11760__choose_compare_exchange_weak_release_acquire(long long volatile* __obj,
11761 long long* __exp,
11762 long long __desr)
11763{
11764#if __has_feature(__atomic_compare_exchange_weak_release_acquire_x)
11765 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
11766 __desr);
11767#else
11768 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
11769 __desr);
11770#endif
11771}
11772
11773inline _LIBCPP_INLINE_VISIBILITY
11774bool
11775__choose_compare_exchange_weak_release_consume(long long volatile* __obj,
11776 long long* __exp,
11777 long long __desr)
11778{
11779#if __has_feature(__atomic_compare_exchange_weak_release_consume_x)
11780 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
11781 __desr);
11782#else
11783 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
11784 __desr);
11785#endif
11786}
11787
11788inline _LIBCPP_INLINE_VISIBILITY
11789bool
11790__choose_compare_exchange_weak_release_relaxed(long long volatile* __obj,
11791 long long* __exp,
11792 long long __desr)
11793{
11794#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_x)
11795 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
11796 __desr);
11797#else
11798 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
11799 __desr);
11800#endif
11801}
11802
11803inline _LIBCPP_INLINE_VISIBILITY
11804bool
11805__choose_compare_exchange_weak_acquire_acquire(long long volatile* __obj,
11806 long long* __exp,
11807 long long __desr)
11808{
11809#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_x)
11810 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
11811 __desr);
11812#else
11813 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
11814 __desr);
11815#endif
11816}
11817
11818inline _LIBCPP_INLINE_VISIBILITY
11819bool
11820__choose_compare_exchange_weak_acquire_consume(long long volatile* __obj,
11821 long long* __exp,
11822 long long __desr)
11823{
11824#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_x)
11825 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
11826 __desr);
11827#else
11828 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
11829 __desr);
11830#endif
11831}
11832
11833inline _LIBCPP_INLINE_VISIBILITY
11834bool
11835__choose_compare_exchange_weak_acquire_relaxed(long long volatile* __obj,
11836 long long* __exp,
11837 long long __desr)
11838{
11839#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_x)
11840 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
11841 __desr);
11842#else
11843 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
11844 __desr);
11845#endif
11846}
11847
11848inline _LIBCPP_INLINE_VISIBILITY
11849bool
11850__choose_compare_exchange_weak_consume_consume(long long volatile* __obj,
11851 long long* __exp,
11852 long long __desr)
11853{
11854#if __has_feature(__atomic_compare_exchange_weak_consume_consume_x)
11855 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
11856 __desr);
11857#else
11858 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
11859 __desr);
11860#endif
11861}
11862
11863inline _LIBCPP_INLINE_VISIBILITY
11864bool
11865__choose_compare_exchange_weak_consume_relaxed(long long volatile* __obj,
11866 long long* __exp,
11867 long long __desr)
11868{
11869#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_x)
11870 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
11871 __desr);
11872#else
11873 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
11874 __desr);
11875#endif
11876}
11877
11878inline _LIBCPP_INLINE_VISIBILITY
11879bool
11880__choose_compare_exchange_weak_relaxed_relaxed(long long volatile* __obj,
11881 long long* __exp,
11882 long long __desr)
11883{
11884#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_x)
11885 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
11886 __desr);
11887#else
11888 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
11889 __desr);
11890#endif
11891}
11892
11893// compare_exchange_weak unsigned long long
11894
11895inline _LIBCPP_INLINE_VISIBILITY
11896bool
11897__choose_compare_exchange_weak_seq_cst_seq_cst(unsigned long long volatile* __obj,
11898 unsigned long long* __exp,
11899 unsigned long long __desr)
11900{
11901#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_y)
11902 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
11903 __desr);
11904#else
11905 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
11906 __desr);
11907#endif
11908}
11909
11910inline _LIBCPP_INLINE_VISIBILITY
11911bool
11912__choose_compare_exchange_weak_seq_cst_acquire(unsigned long long volatile* __obj,
11913 unsigned long long* __exp,
11914 unsigned long long __desr)
11915{
11916#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_y)
11917 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
11918 __desr);
11919#else
11920 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
11921 __desr);
11922#endif
11923}
11924
11925inline _LIBCPP_INLINE_VISIBILITY
11926bool
11927__choose_compare_exchange_weak_seq_cst_consume(unsigned long long volatile* __obj,
11928 unsigned long long* __exp,
11929 unsigned long long __desr)
11930{
11931#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_y)
11932 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
11933 __desr);
11934#else
11935 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
11936 __desr);
11937#endif
11938}
11939
11940inline _LIBCPP_INLINE_VISIBILITY
11941bool
11942__choose_compare_exchange_weak_seq_cst_relaxed(unsigned long long volatile* __obj,
11943 unsigned long long* __exp,
11944 unsigned long long __desr)
11945{
11946#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_y)
11947 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
11948 __desr);
11949#else
11950 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
11951 __desr);
11952#endif
11953}
11954
11955inline _LIBCPP_INLINE_VISIBILITY
11956bool
11957__choose_compare_exchange_weak_acq_rel_acquire(unsigned long long volatile* __obj,
11958 unsigned long long* __exp,
11959 unsigned long long __desr)
11960{
11961#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_y)
11962 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
11963 __desr);
11964#else
11965 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
11966 __desr);
11967#endif
11968}
11969
11970inline _LIBCPP_INLINE_VISIBILITY
11971bool
11972__choose_compare_exchange_weak_acq_rel_consume(unsigned long long volatile* __obj,
11973 unsigned long long* __exp,
11974 unsigned long long __desr)
11975{
11976#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_y)
11977 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
11978 __desr);
11979#else
11980 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
11981 __desr);
11982#endif
11983}
11984
11985inline _LIBCPP_INLINE_VISIBILITY
11986bool
11987__choose_compare_exchange_weak_acq_rel_relaxed(unsigned long long volatile* __obj,
11988 unsigned long long* __exp,
11989 unsigned long long __desr)
11990{
11991#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_y)
11992 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
11993 __desr);
11994#else
11995 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
11996 __desr);
11997#endif
11998}
11999
12000inline _LIBCPP_INLINE_VISIBILITY
12001bool
12002__choose_compare_exchange_weak_release_acquire(unsigned long long volatile* __obj,
12003 unsigned long long* __exp,
12004 unsigned long long __desr)
12005{
12006#if __has_feature(__atomic_compare_exchange_weak_release_acquire_y)
12007 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
12008 __desr);
12009#else
12010 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
12011 __desr);
12012#endif
12013}
12014
12015inline _LIBCPP_INLINE_VISIBILITY
12016bool
12017__choose_compare_exchange_weak_release_consume(unsigned long long volatile* __obj,
12018 unsigned long long* __exp,
12019 unsigned long long __desr)
12020{
12021#if __has_feature(__atomic_compare_exchange_weak_release_consume_y)
12022 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
12023 __desr);
12024#else
12025 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
12026 __desr);
12027#endif
12028}
12029
12030inline _LIBCPP_INLINE_VISIBILITY
12031bool
12032__choose_compare_exchange_weak_release_relaxed(unsigned long long volatile* __obj,
12033 unsigned long long* __exp,
12034 unsigned long long __desr)
12035{
12036#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_y)
12037 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
12038 __desr);
12039#else
12040 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
12041 __desr);
12042#endif
12043}
12044
12045inline _LIBCPP_INLINE_VISIBILITY
12046bool
12047__choose_compare_exchange_weak_acquire_acquire(unsigned long long volatile* __obj,
12048 unsigned long long* __exp,
12049 unsigned long long __desr)
12050{
12051#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_y)
12052 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
12053 __desr);
12054#else
12055 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
12056 __desr);
12057#endif
12058}
12059
12060inline _LIBCPP_INLINE_VISIBILITY
12061bool
12062__choose_compare_exchange_weak_acquire_consume(unsigned long long volatile* __obj,
12063 unsigned long long* __exp,
12064 unsigned long long __desr)
12065{
12066#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_y)
12067 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
12068 __desr);
12069#else
12070 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
12071 __desr);
12072#endif
12073}
12074
12075inline _LIBCPP_INLINE_VISIBILITY
12076bool
12077__choose_compare_exchange_weak_acquire_relaxed(unsigned long long volatile* __obj,
12078 unsigned long long* __exp,
12079 unsigned long long __desr)
12080{
12081#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_y)
12082 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
12083 __desr);
12084#else
12085 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
12086 __desr);
12087#endif
12088}
12089
12090inline _LIBCPP_INLINE_VISIBILITY
12091bool
12092__choose_compare_exchange_weak_consume_consume(unsigned long long volatile* __obj,
12093 unsigned long long* __exp,
12094 unsigned long long __desr)
12095{
12096#if __has_feature(__atomic_compare_exchange_weak_consume_consume_y)
12097 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
12098 __desr);
12099#else
12100 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
12101 __desr);
12102#endif
12103}
12104
12105inline _LIBCPP_INLINE_VISIBILITY
12106bool
12107__choose_compare_exchange_weak_consume_relaxed(unsigned long long volatile* __obj,
12108 unsigned long long* __exp,
12109 unsigned long long __desr)
12110{
12111#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_y)
12112 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
12113 __desr);
12114#else
12115 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
12116 __desr);
12117#endif
12118}
12119
12120inline _LIBCPP_INLINE_VISIBILITY
12121bool
12122__choose_compare_exchange_weak_relaxed_relaxed(unsigned long long volatile* __obj,
12123 unsigned long long* __exp,
12124 unsigned long long __desr)
12125{
12126#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_y)
12127 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
12128 __desr);
12129#else
12130 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
12131 __desr);
12132#endif
12133}
12134
12135// compare_exchange_weak void*
12136
12137inline _LIBCPP_INLINE_VISIBILITY
12138bool
12139__choose_compare_exchange_weak_seq_cst_seq_cst(void* volatile* __obj,
12140 void** __exp,
12141 void* __desr)
12142{
12143#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_Py)
12144 return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
12145 __desr);
12146#else
12147 return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
12148 __desr);
12149#endif
12150}
12151
12152inline _LIBCPP_INLINE_VISIBILITY
12153bool
12154__choose_compare_exchange_weak_seq_cst_acquire(void* volatile* __obj,
12155 void** __exp,
12156 void* __desr)
12157{
12158#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_Py)
12159 return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
12160 __desr);
12161#else
12162 return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
12163 __desr);
12164#endif
12165}
12166
12167inline _LIBCPP_INLINE_VISIBILITY
12168bool
12169__choose_compare_exchange_weak_seq_cst_consume(void* volatile* __obj,
12170 void** __exp,
12171 void* __desr)
12172{
12173#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_Py)
12174 return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
12175 __desr);
12176#else
12177 return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
12178 __desr);
12179#endif
12180}
12181
12182inline _LIBCPP_INLINE_VISIBILITY
12183bool
12184__choose_compare_exchange_weak_seq_cst_relaxed(void* volatile* __obj,
12185 void** __exp,
12186 void* __desr)
12187{
12188#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_Py)
12189 return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
12190 __desr);
12191#else
12192 return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
12193 __desr);
12194#endif
12195}
12196
12197inline _LIBCPP_INLINE_VISIBILITY
12198bool
12199__choose_compare_exchange_weak_acq_rel_acquire(void* volatile* __obj,
12200 void** __exp,
12201 void* __desr)
12202{
12203#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_Py)
12204 return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
12205 __desr);
12206#else
12207 return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
12208 __desr);
12209#endif
12210}
12211
12212inline _LIBCPP_INLINE_VISIBILITY
12213bool
12214__choose_compare_exchange_weak_acq_rel_consume(void* volatile* __obj,
12215 void** __exp,
12216 void* __desr)
12217{
12218#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_Py)
12219 return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
12220 __desr);
12221#else
12222 return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
12223 __desr);
12224#endif
12225}
12226
12227inline _LIBCPP_INLINE_VISIBILITY
12228bool
12229__choose_compare_exchange_weak_acq_rel_relaxed(void* volatile* __obj,
12230 void** __exp,
12231 void* __desr)
12232{
12233#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_Py)
12234 return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
12235 __desr);
12236#else
12237 return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
12238 __desr);
12239#endif
12240}
12241
12242inline _LIBCPP_INLINE_VISIBILITY
12243bool
12244__choose_compare_exchange_weak_release_acquire(void* volatile* __obj,
12245 void** __exp,
12246 void* __desr)
12247{
12248#if __has_feature(__atomic_compare_exchange_weak_release_acquire_Py)
12249 return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
12250 __desr);
12251#else
12252 return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
12253 __desr);
12254#endif
12255}
12256
12257inline _LIBCPP_INLINE_VISIBILITY
12258bool
12259__choose_compare_exchange_weak_release_consume(void* volatile* __obj,
12260 void** __exp,
12261 void* __desr)
12262{
12263#if __has_feature(__atomic_compare_exchange_weak_release_consume_Py)
12264 return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
12265 __desr);
12266#else
12267 return __choose_compare_exchange_strong_release_consume(__obj, __exp,
12268 __desr);
12269#endif
12270}
12271
12272inline _LIBCPP_INLINE_VISIBILITY
12273bool
12274__choose_compare_exchange_weak_release_relaxed(void* volatile* __obj,
12275 void** __exp,
12276 void* __desr)
12277{
12278#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_Py)
12279 return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
12280 __desr);
12281#else
12282 return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
12283 __desr);
12284#endif
12285}
12286
12287inline _LIBCPP_INLINE_VISIBILITY
12288bool
12289__choose_compare_exchange_weak_acquire_acquire(void* volatile* __obj,
12290 void** __exp,
12291 void* __desr)
12292{
12293#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_Py)
12294 return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
12295 __desr);
12296#else
12297 return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
12298 __desr);
12299#endif
12300}
12301
12302inline _LIBCPP_INLINE_VISIBILITY
12303bool
12304__choose_compare_exchange_weak_acquire_consume(void* volatile* __obj,
12305 void** __exp,
12306 void* __desr)
12307{
12308#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_Py)
12309 return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
12310 __desr);
12311#else
12312 return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
12313 __desr);
12314#endif
12315}
12316
12317inline _LIBCPP_INLINE_VISIBILITY
12318bool
12319__choose_compare_exchange_weak_acquire_relaxed(void* volatile* __obj,
12320 void** __exp,
12321 void* __desr)
12322{
12323#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_Py)
12324 return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
12325 __desr);
12326#else
12327 return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
12328 __desr);
12329#endif
12330}
12331
12332inline _LIBCPP_INLINE_VISIBILITY
12333bool
12334__choose_compare_exchange_weak_consume_consume(void* volatile* __obj,
12335 void** __exp,
12336 void* __desr)
12337{
12338#if __has_feature(__atomic_compare_exchange_weak_consume_consume_Py)
12339 return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
12340 __desr);
12341#else
12342 return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
12343 __desr);
12344#endif
12345}
12346
12347inline _LIBCPP_INLINE_VISIBILITY
12348bool
12349__choose_compare_exchange_weak_consume_relaxed(void* volatile* __obj,
12350 void** __exp,
12351 void* __desr)
12352{
12353#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_Py)
12354 return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
12355 __desr);
12356#else
12357 return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
12358 __desr);
12359#endif
12360}
12361
12362inline _LIBCPP_INLINE_VISIBILITY
12363bool
12364__choose_compare_exchange_weak_relaxed_relaxed(void* volatile* __obj,
12365 void** __exp,
12366 void* __desr)
12367{
12368#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_Py)
12369 return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
12370 __desr);
12371#else
12372 return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
12373 __desr);
12374#endif
12375}
12376
Howard Hinnanted760f42010-09-29 18:13:54 +000012377// flag type and operations
12378
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012379#if !__has_feature(__atomic_flag)
12380 typedef bool __atomic_flag__;
12381#endif
12382
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012383struct atomic_flag;
Howard Hinnanted760f42010-09-29 18:13:54 +000012384
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012385bool atomic_flag_test_and_set(volatile atomic_flag*);
12386bool atomic_flag_test_and_set(atomic_flag*);
12387bool atomic_flag_test_and_set_explicit(volatile atomic_flag*, memory_order);
12388bool atomic_flag_test_and_set_explicit(atomic_flag*, memory_order);
12389void atomic_flag_clear(volatile atomic_flag*);
12390void atomic_flag_clear(atomic_flag*);
12391void atomic_flag_clear_explicit(volatile atomic_flag*, memory_order);
12392void atomic_flag_clear_explicit(atomic_flag*, memory_order);
12393
12394typedef struct _LIBCPP_VISIBLE atomic_flag
Howard Hinnanted760f42010-09-29 18:13:54 +000012395{
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012396 __atomic_flag__ __flg_;
Howard Hinnanted760f42010-09-29 18:13:54 +000012397
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012398 _LIBCPP_INLINE_VISIBILITY
12399 bool test_and_set() volatile
12400 {return atomic_flag_test_and_set(this);}
12401 _LIBCPP_INLINE_VISIBILITY
12402 bool test_and_set(memory_order __o) volatile
12403 {return atomic_flag_test_and_set_explicit(this, __o);}
12404 _LIBCPP_INLINE_VISIBILITY
12405 bool test_and_set()
12406 {return atomic_flag_test_and_set(this);}
12407 _LIBCPP_INLINE_VISIBILITY
12408 bool test_and_set(memory_order __o)
12409 {return atomic_flag_test_and_set_explicit(this, __o);}
Howard Hinnanted760f42010-09-29 18:13:54 +000012410
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012411 _LIBCPP_INLINE_VISIBILITY
12412 void clear() volatile
12413 {atomic_flag_clear(this);}
12414 _LIBCPP_INLINE_VISIBILITY
12415 void clear(memory_order __o) volatile
12416 {atomic_flag_clear_explicit(this, __o);}
12417 _LIBCPP_INLINE_VISIBILITY
12418 void clear()
12419 {atomic_flag_clear(this);}
12420 _LIBCPP_INLINE_VISIBILITY
12421 void clear(memory_order __o)
12422 {atomic_flag_clear_explicit(this, __o);}
Howard Hinnanted760f42010-09-29 18:13:54 +000012423
12424#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
12425 atomic_flag() = default;
12426#else
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012427 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant79101ae2010-09-30 21:05:29 +000012428 atomic_flag() {};
Howard Hinnanted760f42010-09-29 18:13:54 +000012429#endif
12430
Howard Hinnanted760f42010-09-29 18:13:54 +000012431#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
12432 atomic_flag(const atomic_flag&) = delete;
12433 atomic_flag& operator=(const atomic_flag&) = delete;
12434 atomic_flag& operator=(const atomic_flag&) volatile = delete;
12435#else
12436private:
12437 atomic_flag(const atomic_flag&);
12438 atomic_flag& operator=(const atomic_flag&);
12439 atomic_flag& operator=(const atomic_flag&) volatile;
12440public:
12441#endif
Howard Hinnanted760f42010-09-29 18:13:54 +000012442} atomic_flag;
12443
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012444inline _LIBCPP_INLINE_VISIBILITY
12445bool
12446atomic_flag_test_and_set(volatile atomic_flag* __f)
12447{
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012448 return __choose_exchange_seq_cst(&__f->__flg_, __atomic_flag__(true))
12449 == __atomic_flag__(true);
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012450}
Howard Hinnanted760f42010-09-29 18:13:54 +000012451
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012452inline _LIBCPP_INLINE_VISIBILITY
12453bool
12454atomic_flag_test_and_set(atomic_flag* __f)
12455{
12456 return atomic_flag_test_and_set(const_cast<volatile atomic_flag*>(__f));
12457}
12458
12459inline _LIBCPP_INLINE_VISIBILITY
12460bool
12461atomic_flag_test_and_set_explicit(volatile atomic_flag* __f, memory_order __o)
12462{
12463 switch (__o)
12464 {
12465 case memory_order_relaxed:
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012466 return __choose_exchange_relaxed(&__f->__flg_, __atomic_flag__(true))
12467 == __atomic_flag__(true);
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012468 case memory_order_consume:
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012469 return __choose_exchange_consume(&__f->__flg_, __atomic_flag__(true))
12470 == __atomic_flag__(true);
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012471 case memory_order_acquire:
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012472 return __choose_exchange_acquire(&__f->__flg_, __atomic_flag__(true))
12473 == __atomic_flag__(true);
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012474 case memory_order_release:
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012475 return __choose_exchange_release(&__f->__flg_, __atomic_flag__(true))
12476 == __atomic_flag__(true);
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012477 case memory_order_acq_rel:
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012478 return __choose_exchange_acq_rel(&__f->__flg_, __atomic_flag__(true))
12479 == __atomic_flag__(true);
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012480 case memory_order_seq_cst:
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012481 return __choose_exchange_seq_cst(&__f->__flg_, __atomic_flag__(true))
12482 == __atomic_flag__(true);
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012483 }
12484}
12485
12486inline _LIBCPP_INLINE_VISIBILITY
12487bool
12488atomic_flag_test_and_set_explicit(atomic_flag* __f, memory_order __o)
12489{
Howard Hinnant611fdaf2010-10-04 18:52:54 +000012490 return atomic_flag_test_and_set_explicit(const_cast<volatile atomic_flag*>
12491 (__f), __o);
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012492}
12493
12494inline _LIBCPP_INLINE_VISIBILITY
12495void
12496atomic_flag_clear(volatile atomic_flag* __f)
12497{
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012498 __choose_store_seq_cst(&__f->__flg_, __atomic_flag__(false));
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012499}
12500
12501inline _LIBCPP_INLINE_VISIBILITY
12502void
12503atomic_flag_clear(atomic_flag* __f)
12504{
12505 atomic_flag_clear(const_cast<volatile atomic_flag*>(__f));
12506}
12507
12508inline _LIBCPP_INLINE_VISIBILITY
12509void
12510atomic_flag_clear_explicit(volatile atomic_flag* __f, memory_order __o)
12511{
12512 switch (__o)
12513 {
12514 case memory_order_relaxed:
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012515 __choose_store_relaxed(&__f->__flg_, __atomic_flag__(false));
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012516 break;
12517 case memory_order_release:
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012518 __choose_store_release(&__f->__flg_, __atomic_flag__(false));
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012519 break;
12520 case memory_order_seq_cst:
Howard Hinnant6cac2c22010-10-05 14:02:23 +000012521 __choose_store_seq_cst(&__f->__flg_, __atomic_flag__(false));
Howard Hinnant767ae2b2010-09-29 21:20:03 +000012522 break;
12523 }
12524}
12525
12526inline _LIBCPP_INLINE_VISIBILITY
12527void
12528atomic_flag_clear_explicit(atomic_flag* __f, memory_order __o)
12529{
12530 atomic_flag_clear_explicit(const_cast<volatile atomic_flag*>(__f), __o);
12531}
12532
12533#define ATOMIC_FLAG_INIT {false}
Howard Hinnant611fdaf2010-10-04 18:52:54 +000012534#define ATOMIC_VAR_INIT(__v) {__v}
12535
12536inline _LIBCPP_INLINE_VISIBILITY
12537memory_order
12538__translate_memory_order(memory_order __o)
12539{
12540 switch (__o)
12541 {
12542 case memory_order_acq_rel:
12543 return memory_order_acquire;
12544 case memory_order_release:
12545 return memory_order_relaxed;
12546 }
12547 return __o;
12548}
12549
12550// atomic_bool
12551
12552struct atomic_bool;
12553
12554bool atomic_is_lock_free(const volatile atomic_bool*);
12555bool atomic_is_lock_free(const atomic_bool*);
12556void atomic_init(volatile atomic_bool*, bool);
12557void atomic_init(atomic_bool*, bool);
12558void atomic_store(volatile atomic_bool*, bool);
12559void atomic_store(atomic_bool*, bool);
12560void atomic_store_explicit(volatile atomic_bool*, bool, memory_order);
12561void atomic_store_explicit(atomic_bool*, bool, memory_order);
12562bool atomic_load(const volatile atomic_bool*);
12563bool atomic_load(const atomic_bool*);
12564bool atomic_load_explicit(const volatile atomic_bool*, memory_order);
12565bool atomic_load_explicit(const atomic_bool*, memory_order);
12566bool atomic_exchange(volatile atomic_bool*, bool);
12567bool atomic_exchange(atomic_bool*, bool);
12568bool atomic_exchange_explicit(volatile atomic_bool*, bool, memory_order);
12569bool atomic_exchange_explicit(atomic_bool*, bool, memory_order);
12570bool atomic_compare_exchange_weak(volatile atomic_bool*, bool*, bool);
12571bool atomic_compare_exchange_weak(atomic_bool*, bool*, bool);
12572bool atomic_compare_exchange_strong(volatile atomic_bool*, bool*, bool);
12573bool atomic_compare_exchange_strong(atomic_bool*, bool*, bool);
12574bool atomic_compare_exchange_weak_explicit(volatile atomic_bool*, bool*, bool,
12575 memory_order, memory_order);
12576bool atomic_compare_exchange_weak_explicit(atomic_bool*, bool*, bool,
12577 memory_order, memory_order);
12578bool atomic_compare_exchange_strong_explicit(volatile atomic_bool*, bool*, bool,
12579 memory_order, memory_order);
12580bool atomic_compare_exchange_strong_explicit(atomic_bool*, bool*, bool,
12581 memory_order, memory_order);
12582
12583typedef struct atomic_bool
12584{
12585 bool __v_;
12586
12587 _LIBCPP_INLINE_VISIBILITY
12588 bool is_lock_free() const volatile
12589 {return atomic_is_lock_free(this);}
12590 _LIBCPP_INLINE_VISIBILITY
12591 bool is_lock_free() const
12592 {return atomic_is_lock_free(this);}
12593 _LIBCPP_INLINE_VISIBILITY
12594 void store(bool __v) volatile
12595 {atomic_store(this, __v);}
12596 _LIBCPP_INLINE_VISIBILITY
12597 void store(bool __v, memory_order __o) volatile
12598 {atomic_store_explicit(this, __v, __o);}
12599 _LIBCPP_INLINE_VISIBILITY
12600 void store(bool __v)
12601 {atomic_store(this, __v);}
12602 _LIBCPP_INLINE_VISIBILITY
12603 void store(bool __v, memory_order __o)
12604 {atomic_store_explicit(this, __v, __o);}
12605 _LIBCPP_INLINE_VISIBILITY
12606 bool load() const volatile
12607 {return atomic_load(this);}
12608 _LIBCPP_INLINE_VISIBILITY
12609 bool load(memory_order __o) const volatile
12610 {return atomic_load_explicit(this, __o);}
12611 _LIBCPP_INLINE_VISIBILITY
12612 bool load() const
12613 {return atomic_load(this);}
12614 _LIBCPP_INLINE_VISIBILITY
12615 bool load(memory_order __o) const
12616 {return atomic_load_explicit(this, __o);}
12617 _LIBCPP_INLINE_VISIBILITY
12618 operator bool() const volatile
12619 {return load();}
12620 _LIBCPP_INLINE_VISIBILITY
12621 operator bool() const
12622 {return load();}
12623 _LIBCPP_INLINE_VISIBILITY
12624 bool exchange(bool __v) volatile
12625 {return atomic_exchange(this, __v);}
12626 _LIBCPP_INLINE_VISIBILITY
12627 bool exchange(bool __v, memory_order __o) volatile
12628 {return atomic_exchange_explicit(this, __v, __o);}
12629 _LIBCPP_INLINE_VISIBILITY
12630 bool exchange(bool __v)
12631 {return atomic_exchange(this, __v);}
12632 _LIBCPP_INLINE_VISIBILITY
12633 bool exchange(bool __v, memory_order __o)
12634 {return atomic_exchange_explicit(this, __v, __o);}
12635 _LIBCPP_INLINE_VISIBILITY
12636 bool compare_exchange_weak(bool& __v, bool __e, memory_order __s,
12637 memory_order __f) volatile
12638 {return atomic_compare_exchange_weak_explicit(this, &__v, __e, __s,
12639 __f);}
12640 _LIBCPP_INLINE_VISIBILITY
12641 bool compare_exchange_weak(bool& __v, bool __e, memory_order __s) volatile
12642 {return atomic_compare_exchange_weak_explicit(this, &__v, __e, __s,
12643 __s);}
12644 _LIBCPP_INLINE_VISIBILITY
12645 bool compare_exchange_weak(bool& __v, bool __e) volatile
12646 {return atomic_compare_exchange_weak(this, &__v, __e);}
12647 _LIBCPP_INLINE_VISIBILITY
12648 bool compare_exchange_weak(bool& __v, bool __e, memory_order __s,
12649 memory_order __f)
12650 {return atomic_compare_exchange_weak_explicit(this, &__v, __e, __s,
12651 __f);}
12652 _LIBCPP_INLINE_VISIBILITY
12653 bool compare_exchange_weak(bool& __v, bool __e, memory_order __s)
12654 {return atomic_compare_exchange_weak_explicit(this, &__v, __e, __s,
12655 __s);}
12656 _LIBCPP_INLINE_VISIBILITY
12657 bool compare_exchange_weak(bool& __v, bool __e)
12658 {return atomic_compare_exchange_weak(this, &__v, __e);}
12659 _LIBCPP_INLINE_VISIBILITY
12660 bool compare_exchange_strong(bool& __v, bool __e, memory_order __s,
12661 memory_order __f) volatile
12662 {return atomic_compare_exchange_strong_explicit(this, &__v, __e, __s,
12663 __f);}
12664 _LIBCPP_INLINE_VISIBILITY
12665 bool compare_exchange_strong(bool& __v, bool __e, memory_order __s) volatile
12666 {return atomic_compare_exchange_strong_explicit(this, &__v, __e, __s,
12667 __s);}
12668 _LIBCPP_INLINE_VISIBILITY
12669 bool compare_exchange_strong(bool& __v, bool __e) volatile
12670 {return atomic_compare_exchange_strong(this, &__v, __e);}
12671 _LIBCPP_INLINE_VISIBILITY
12672 bool compare_exchange_strong(bool& __v, bool __e, memory_order __s,
12673 memory_order __f)
12674 {return atomic_compare_exchange_strong_explicit(this, &__v, __e, __s,
12675 __f);}
12676 _LIBCPP_INLINE_VISIBILITY
12677 bool compare_exchange_strong(bool& __v, bool __e, memory_order __s)
12678 {return atomic_compare_exchange_strong_explicit(this, &__v, __e, __s,
12679 __s);}
12680 _LIBCPP_INLINE_VISIBILITY
12681 bool compare_exchange_strong(bool& __v, bool __e)
12682 {return atomic_compare_exchange_strong(this, &__v, __e);}
12683#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
12684 atomic_bool() = default;
12685#else
12686 _LIBCPP_INLINE_VISIBILITY
12687 atomic_bool() {}
12688#endif
12689 _LIBCPP_INLINE_VISIBILITY
12690 /*constexpr*/ atomic_bool(bool __v)
12691 : __v_(__v) {}
12692#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
12693 atomic_bool(const atomic_bool&) = delete;
12694 atomic_bool& operator=(const atomic_bool&) = delete;
12695 atomic_bool& operator=(const atomic_bool&) volatile = delete;
12696#else
12697private:
12698 atomic_bool(const atomic_bool&);
12699 atomic_bool& operator=(const atomic_bool&);
12700 atomic_bool& operator=(const atomic_bool&) volatile;
12701public:
12702#endif
12703 _LIBCPP_INLINE_VISIBILITY
12704 bool operator=(bool __v) volatile
12705 {store(__v); return __v;}
12706} atomic_bool;
12707
12708inline _LIBCPP_INLINE_VISIBILITY
12709bool atomic_is_lock_free(const volatile atomic_bool*)
12710{
12711#if __has_feature(__atomic_store_seq_cst_b) && \
12712 __has_feature(__atomic_load_seq_cst_b) && \
12713 __has_feature(__atomic_exchange_seq_cst_b) && \
12714 __has_feature(__atomic_compare_strong_weak_seq_cst_seq_cst_b)
12715 return true;
12716#else
12717 return false;
12718#endif
12719}
12720
12721inline _LIBCPP_INLINE_VISIBILITY
12722bool atomic_is_lock_free(const atomic_bool* __obj)
12723{
12724 return atomic_is_lock_free(const_cast<const volatile atomic_bool*>(__obj));
12725}
12726
12727inline _LIBCPP_INLINE_VISIBILITY
12728void atomic_init(volatile atomic_bool* __obj, bool __desr)
12729{
12730 __obj->__v_ = __desr;
12731}
12732
12733inline _LIBCPP_INLINE_VISIBILITY
12734void atomic_init(atomic_bool* __obj, bool __desr)
12735{
12736 __obj->__v_ = __desr;
12737}
12738
12739inline _LIBCPP_INLINE_VISIBILITY
12740void atomic_store(volatile atomic_bool* __obj, bool __desr)
12741{
12742 __choose_store_seq_cst(&__obj->__v_, __desr);
12743}
12744
12745inline _LIBCPP_INLINE_VISIBILITY
12746void atomic_store(atomic_bool* __obj, bool __desr)
12747{
12748 atomic_store(const_cast<volatile atomic_bool*>(__obj), __desr);
12749}
12750
12751inline _LIBCPP_INLINE_VISIBILITY
12752void atomic_store_explicit(volatile atomic_bool* __obj, bool __desr,
12753 memory_order __o)
12754{
12755 switch (__o)
12756 {
12757 case memory_order_relaxed:
12758 __choose_store_relaxed(&__obj->__v_, __desr);
12759 break;
12760 case memory_order_release:
12761 __choose_store_release(&__obj->__v_, __desr);
12762 break;
12763 case memory_order_seq_cst:
12764 __choose_store_seq_cst(&__obj->__v_, __desr);
12765 break;
12766 }
12767}
12768
12769inline _LIBCPP_INLINE_VISIBILITY
12770void atomic_store_explicit(atomic_bool* __obj, bool __desr, memory_order __o)
12771{
12772 atomic_store_explicit(const_cast<volatile atomic_bool*>(__obj), __desr,
12773 __o);
12774}
12775
12776inline _LIBCPP_INLINE_VISIBILITY
12777bool atomic_load(const volatile atomic_bool* __obj)
12778{
12779 return __choose_load_seq_cst(&__obj->__v_);
12780}
12781
12782inline _LIBCPP_INLINE_VISIBILITY
12783bool atomic_load(const atomic_bool* __obj)
12784{
12785 return atomic_load(const_cast<const volatile atomic_bool*>(__obj));
12786}
12787
12788inline _LIBCPP_INLINE_VISIBILITY
12789bool atomic_load_explicit(const volatile atomic_bool* __obj, memory_order __o)
12790{
12791 switch (__o)
12792 {
12793 case memory_order_relaxed:
12794 return __choose_load_relaxed(&__obj->__v_);
12795 case memory_order_consume:
12796 return __choose_load_consume(&__obj->__v_);
12797 case memory_order_acquire:
12798 return __choose_load_acquire(&__obj->__v_);
12799 case memory_order_seq_cst:
12800 return __choose_load_seq_cst(&__obj->__v_);
12801 }
12802}
12803
12804inline _LIBCPP_INLINE_VISIBILITY
12805bool atomic_load_explicit(const atomic_bool* __obj, memory_order __o)
12806{
12807 return atomic_load_explicit(const_cast<const volatile atomic_bool*>
12808 (__obj), __o);
12809}
12810
12811inline _LIBCPP_INLINE_VISIBILITY
12812bool atomic_exchange(volatile atomic_bool* __obj, bool __desr)
12813{
12814 return __choose_exchange_seq_cst(&__obj->__v_, __desr);
12815}
12816
12817inline _LIBCPP_INLINE_VISIBILITY
12818bool atomic_exchange(atomic_bool* __obj, bool __desr)
12819{
12820 return atomic_exchange(const_cast<volatile atomic_bool*>(__obj), __desr);
12821}
12822
12823inline _LIBCPP_INLINE_VISIBILITY
12824bool atomic_exchange_explicit(volatile atomic_bool* __obj, bool __desr,
12825 memory_order __o)
12826{
12827 switch (__o)
12828 {
12829 case memory_order_relaxed:
12830 return __choose_exchange_relaxed(&__obj->__v_, __desr);
12831 case memory_order_consume:
12832 return __choose_exchange_consume(&__obj->__v_, __desr);
12833 case memory_order_acquire:
12834 return __choose_exchange_acquire(&__obj->__v_, __desr);
12835 case memory_order_release:
12836 return __choose_exchange_release(&__obj->__v_, __desr);
12837 case memory_order_acq_rel:
12838 return __choose_exchange_acq_rel(&__obj->__v_, __desr);
12839 case memory_order_seq_cst:
12840 return __choose_exchange_seq_cst(&__obj->__v_, __desr);
12841 }
12842}
12843
12844inline _LIBCPP_INLINE_VISIBILITY
12845bool atomic_exchange_explicit(atomic_bool* __obj, bool __desr, memory_order __o)
12846{
12847 return atomic_exchange_explicit(const_cast<volatile atomic_bool*>
12848 (__obj), __desr, __o);
12849}
12850
12851inline _LIBCPP_INLINE_VISIBILITY
12852bool atomic_compare_exchange_weak(volatile atomic_bool* __obj, bool* __exp,
12853 bool __desr)
12854{
12855 return __choose_compare_exchange_weak_seq_cst_seq_cst(&__obj->__v_, __exp,
12856 __desr);
12857}
12858
12859inline _LIBCPP_INLINE_VISIBILITY
12860bool atomic_compare_exchange_weak(atomic_bool* __obj, bool* __exp, bool __desr)
12861{
12862 return atomic_compare_exchange_weak(const_cast<volatile atomic_bool*>
12863 (__obj), __exp, __desr);
12864}
12865
12866inline _LIBCPP_INLINE_VISIBILITY
12867bool atomic_compare_exchange_weak_explicit(volatile atomic_bool* __obj,
12868 bool* __exp, bool __desr,
12869 memory_order __s, memory_order __f)
12870{
12871 __f = __translate_memory_order(__f);
12872 switch (__s)
12873 {
12874 case memory_order_relaxed:
12875 return __choose_compare_exchange_weak_relaxed_relaxed(&__obj->__v_,
12876 __exp, __desr);
12877 case memory_order_consume:
12878 switch (__f)
12879 {
12880 case memory_order_relaxed:
12881 return __choose_compare_exchange_weak_consume_relaxed(
12882 &__obj->__v_, __exp, __desr);
12883 case memory_order_consume:
12884 return __choose_compare_exchange_weak_consume_consume(
12885 &__obj->__v_, __exp, __desr);
12886 }
12887 case memory_order_acquire:
12888 switch (__f)
12889 {
12890 case memory_order_relaxed:
12891 return __choose_compare_exchange_weak_acquire_relaxed(
12892 &__obj->__v_, __exp, __desr);
12893 case memory_order_consume:
12894 return __choose_compare_exchange_weak_acquire_consume(
12895 &__obj->__v_, __exp, __desr);
12896 case memory_order_acquire:
12897 return __choose_compare_exchange_weak_acquire_acquire(
12898 &__obj->__v_, __exp, __desr);
12899 }
12900 case memory_order_release:
12901 switch (__f)
12902 {
12903 case memory_order_relaxed:
12904 return __choose_compare_exchange_weak_release_relaxed(
12905 &__obj->__v_, __exp, __desr);
12906 case memory_order_consume:
12907 return __choose_compare_exchange_weak_release_consume(
12908 &__obj->__v_, __exp, __desr);
12909 case memory_order_acquire:
12910 return __choose_compare_exchange_weak_release_acquire(
12911 &__obj->__v_, __exp, __desr);
12912 }
12913 case memory_order_acq_rel:
12914 switch (__f)
12915 {
12916 case memory_order_relaxed:
12917 return __choose_compare_exchange_weak_acq_rel_relaxed(
12918 &__obj->__v_, __exp, __desr);
12919 case memory_order_consume:
12920 return __choose_compare_exchange_weak_acq_rel_consume(
12921 &__obj->__v_, __exp, __desr);
12922 case memory_order_acquire:
12923 return __choose_compare_exchange_weak_acq_rel_acquire(
12924 &__obj->__v_, __exp, __desr);
12925 }
12926 case memory_order_seq_cst:
12927 switch (__f)
12928 {
12929 case memory_order_relaxed:
12930 return __choose_compare_exchange_weak_seq_cst_relaxed(
12931 &__obj->__v_, __exp, __desr);
12932 case memory_order_consume:
12933 return __choose_compare_exchange_weak_seq_cst_consume(
12934 &__obj->__v_, __exp, __desr);
12935 case memory_order_acquire:
12936 return __choose_compare_exchange_weak_seq_cst_acquire(
12937 &__obj->__v_, __exp, __desr);
12938 case memory_order_seq_cst:
12939 return __choose_compare_exchange_weak_seq_cst_seq_cst(
12940 &__obj->__v_, __exp, __desr);
12941 }
12942 }
12943}
12944
12945inline _LIBCPP_INLINE_VISIBILITY
12946bool atomic_compare_exchange_weak_explicit(atomic_bool* __obj, bool* __exp,
12947 bool __desr,
12948 memory_order __s, memory_order __f)
12949{
12950 return atomic_compare_exchange_weak_explicit(
12951 const_cast<volatile atomic_bool*>(__obj), __exp, __desr, __s, __f);
12952}
12953
12954inline _LIBCPP_INLINE_VISIBILITY
12955bool atomic_compare_exchange_strong(volatile atomic_bool* __obj, bool* __exp,
12956 bool __desr)
12957{
12958 return __choose_compare_exchange_strong_seq_cst_seq_cst(&__obj->__v_, __exp,
12959 __desr);
12960}
12961
12962inline _LIBCPP_INLINE_VISIBILITY
12963bool atomic_compare_exchange_strong(atomic_bool* __obj, bool* __exp,
12964 bool __desr)
12965{
12966 return atomic_compare_exchange_strong(const_cast<volatile atomic_bool*>
12967 (__obj), __exp, __desr);
12968}
12969
12970inline _LIBCPP_INLINE_VISIBILITY
12971bool atomic_compare_exchange_strong_explicit(volatile atomic_bool* __obj,
12972 bool* __exp, bool __desr,
12973 memory_order __s, memory_order __f)
12974{
12975 __f = __translate_memory_order(__f);
12976 switch (__s)
12977 {
12978 case memory_order_relaxed:
12979 return __choose_compare_exchange_strong_relaxed_relaxed(&__obj->__v_,
12980 __exp, __desr);
12981 case memory_order_consume:
12982 switch (__f)
12983 {
12984 case memory_order_relaxed:
12985 return __choose_compare_exchange_strong_consume_relaxed(
12986 &__obj->__v_, __exp, __desr);
12987 case memory_order_consume:
12988 return __choose_compare_exchange_strong_consume_consume(
12989 &__obj->__v_, __exp, __desr);
12990 }
12991 case memory_order_acquire:
12992 switch (__f)
12993 {
12994 case memory_order_relaxed:
12995 return __choose_compare_exchange_strong_acquire_relaxed(
12996 &__obj->__v_, __exp, __desr);
12997 case memory_order_consume:
12998 return __choose_compare_exchange_strong_acquire_consume(
12999 &__obj->__v_, __exp, __desr);
13000 case memory_order_acquire:
13001 return __choose_compare_exchange_strong_acquire_acquire(
13002 &__obj->__v_, __exp, __desr);
13003 }
13004 case memory_order_release:
13005 switch (__f)
13006 {
13007 case memory_order_relaxed:
13008 return __choose_compare_exchange_strong_release_relaxed(
13009 &__obj->__v_, __exp, __desr);
13010 case memory_order_consume:
13011 return __choose_compare_exchange_strong_release_consume(
13012 &__obj->__v_, __exp, __desr);
13013 case memory_order_acquire:
13014 return __choose_compare_exchange_strong_release_acquire(
13015 &__obj->__v_, __exp, __desr);
13016 }
13017 case memory_order_acq_rel:
13018 switch (__f)
13019 {
13020 case memory_order_relaxed:
13021 return __choose_compare_exchange_strong_acq_rel_relaxed(
13022 &__obj->__v_, __exp, __desr);
13023 case memory_order_consume:
13024 return __choose_compare_exchange_strong_acq_rel_consume(
13025 &__obj->__v_, __exp, __desr);
13026 case memory_order_acquire:
13027 return __choose_compare_exchange_strong_acq_rel_acquire(
13028 &__obj->__v_, __exp, __desr);
13029 }
13030 case memory_order_seq_cst:
13031 switch (__f)
13032 {
13033 case memory_order_relaxed:
13034 return __choose_compare_exchange_strong_seq_cst_relaxed(
13035 &__obj->__v_, __exp, __desr);
13036 case memory_order_consume:
13037 return __choose_compare_exchange_strong_seq_cst_consume(
13038 &__obj->__v_, __exp, __desr);
13039 case memory_order_acquire:
13040 return __choose_compare_exchange_strong_seq_cst_acquire(
13041 &__obj->__v_, __exp, __desr);
13042 case memory_order_seq_cst:
13043 return __choose_compare_exchange_strong_seq_cst_seq_cst(
13044 &__obj->__v_, __exp, __desr);
13045 }
13046 }
13047}
13048
13049inline _LIBCPP_INLINE_VISIBILITY
13050bool atomic_compare_exchange_strong_explicit(atomic_bool* __obj, bool* __exp,
13051 bool __desr,
13052 memory_order __s, memory_order __f)
13053{
13054 return atomic_compare_exchange_strong_explicit(
13055 const_cast<volatile atomic_bool*>(__obj), __exp, __desr, __s, __f);
13056}
Howard Hinnanted760f42010-09-29 18:13:54 +000013057
Howard Hinnant8f73c632010-09-27 21:17:38 +000013058_LIBCPP_END_NAMESPACE_STD
13059
13060#endif // _LIBCPP_ATOMIC