Warning: This file is not a C or C++ file. It does not have highlighting.

1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef _LIBCPP___CXX03___ATOMIC_ATOMIC_H
10#define _LIBCPP___CXX03___ATOMIC_ATOMIC_H
11
12#include <__cxx03/__atomic/atomic_base.h>
13#include <__cxx03/__atomic/check_memory_order.h>
14#include <__cxx03/__atomic/cxx_atomic_impl.h>
15#include <__cxx03/__atomic/memory_order.h>
16#include <__cxx03/__config>
17#include <__cxx03/__functional/operations.h>
18#include <__cxx03/__memory/addressof.h>
19#include <__cxx03/__type_traits/is_floating_point.h>
20#include <__cxx03/__type_traits/is_function.h>
21#include <__cxx03/__type_traits/is_same.h>
22#include <__cxx03/__type_traits/remove_const.h>
23#include <__cxx03/__type_traits/remove_pointer.h>
24#include <__cxx03/__type_traits/remove_volatile.h>
25#include <__cxx03/__utility/forward.h>
26#include <__cxx03/cstddef>
27#include <__cxx03/cstring>
28
29#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
30# pragma GCC system_header
31#endif
32
33_LIBCPP_BEGIN_NAMESPACE_STD
34
35template <class _Tp>
36struct atomic : public __atomic_base<_Tp> {
37 using __base = __atomic_base<_Tp>;
38 using value_type = _Tp;
39 using difference_type = value_type;
40
41 _LIBCPP_HIDE_FROM_ABI atomic() _NOEXCEPT = default;
42
43 _LIBCPP_HIDE_FROM_ABI atomic(_Tp __d) _NOEXCEPT : __base(__d) {}
44
45 _LIBCPP_HIDE_FROM_ABI _Tp operator=(_Tp __d) volatile _NOEXCEPT {
46 __base::store(__d);
47 return __d;
48 }
49 _LIBCPP_HIDE_FROM_ABI _Tp operator=(_Tp __d) _NOEXCEPT {
50 __base::store(__d);
51 return __d;
52 }
53
54 atomic& operator=(const atomic&) = delete;
55 atomic& operator=(const atomic&) volatile = delete;
56};
57
58// atomic<T*>
59
60template <class _Tp>
61struct atomic<_Tp*> : public __atomic_base<_Tp*> {
62 using __base = __atomic_base<_Tp*>;
63 using value_type = _Tp*;
64 using difference_type = ptrdiff_t;
65
66 _LIBCPP_HIDE_FROM_ABI atomic() _NOEXCEPT = default;
67
68 _LIBCPP_HIDE_FROM_ABI atomic(_Tp* __d) _NOEXCEPT : __base(__d) {}
69
70 _LIBCPP_HIDE_FROM_ABI _Tp* operator=(_Tp* __d) volatile _NOEXCEPT {
71 __base::store(__d);
72 return __d;
73 }
74 _LIBCPP_HIDE_FROM_ABI _Tp* operator=(_Tp* __d) _NOEXCEPT {
75 __base::store(__d);
76 return __d;
77 }
78
79 _LIBCPP_HIDE_FROM_ABI _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT {
80 // __atomic_fetch_add accepts function pointers, guard against them.
81 static_assert(!is_function<__remove_pointer_t<_Tp> >::value, "Pointer to function isn't allowed");
82 return std::__cxx_atomic_fetch_add(std::addressof(this->__a_), __op, __m);
83 }
84
85 _LIBCPP_HIDE_FROM_ABI _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
86 // __atomic_fetch_add accepts function pointers, guard against them.
87 static_assert(!is_function<__remove_pointer_t<_Tp> >::value, "Pointer to function isn't allowed");
88 return std::__cxx_atomic_fetch_add(std::addressof(this->__a_), __op, __m);
89 }
90
91 _LIBCPP_HIDE_FROM_ABI _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT {
92 // __atomic_fetch_add accepts function pointers, guard against them.
93 static_assert(!is_function<__remove_pointer_t<_Tp> >::value, "Pointer to function isn't allowed");
94 return std::__cxx_atomic_fetch_sub(std::addressof(this->__a_), __op, __m);
95 }
96
97 _LIBCPP_HIDE_FROM_ABI _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
98 // __atomic_fetch_add accepts function pointers, guard against them.
99 static_assert(!is_function<__remove_pointer_t<_Tp> >::value, "Pointer to function isn't allowed");
100 return std::__cxx_atomic_fetch_sub(std::addressof(this->__a_), __op, __m);
101 }
102
103 _LIBCPP_HIDE_FROM_ABI _Tp* operator++(int) volatile _NOEXCEPT { return fetch_add(1); }
104 _LIBCPP_HIDE_FROM_ABI _Tp* operator++(int) _NOEXCEPT { return fetch_add(1); }
105 _LIBCPP_HIDE_FROM_ABI _Tp* operator--(int) volatile _NOEXCEPT { return fetch_sub(1); }
106 _LIBCPP_HIDE_FROM_ABI _Tp* operator--(int) _NOEXCEPT { return fetch_sub(1); }
107 _LIBCPP_HIDE_FROM_ABI _Tp* operator++() volatile _NOEXCEPT { return fetch_add(1) + 1; }
108 _LIBCPP_HIDE_FROM_ABI _Tp* operator++() _NOEXCEPT { return fetch_add(1) + 1; }
109 _LIBCPP_HIDE_FROM_ABI _Tp* operator--() volatile _NOEXCEPT { return fetch_sub(1) - 1; }
110 _LIBCPP_HIDE_FROM_ABI _Tp* operator--() _NOEXCEPT { return fetch_sub(1) - 1; }
111 _LIBCPP_HIDE_FROM_ABI _Tp* operator+=(ptrdiff_t __op) volatile _NOEXCEPT { return fetch_add(__op) + __op; }
112 _LIBCPP_HIDE_FROM_ABI _Tp* operator+=(ptrdiff_t __op) _NOEXCEPT { return fetch_add(__op) + __op; }
113 _LIBCPP_HIDE_FROM_ABI _Tp* operator-=(ptrdiff_t __op) volatile _NOEXCEPT { return fetch_sub(__op) - __op; }
114 _LIBCPP_HIDE_FROM_ABI _Tp* operator-=(ptrdiff_t __op) _NOEXCEPT { return fetch_sub(__op) - __op; }
115
116 atomic& operator=(const atomic&) = delete;
117 atomic& operator=(const atomic&) volatile = delete;
118};
119
120// atomic_is_lock_free
121
122template <class _Tp>
123_LIBCPP_HIDE_FROM_ABI bool atomic_is_lock_free(const volatile atomic<_Tp>* __o) _NOEXCEPT {
124 return __o->is_lock_free();
125}
126
127template <class _Tp>
128_LIBCPP_HIDE_FROM_ABI bool atomic_is_lock_free(const atomic<_Tp>* __o) _NOEXCEPT {
129 return __o->is_lock_free();
130}
131
132// atomic_init
133
134template <class _Tp>
135_LIBCPP_HIDE_FROM_ABI void atomic_init(volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __d) _NOEXCEPT {
136 std::__cxx_atomic_init(std::addressof(__o->__a_), __d);
137}
138
139template <class _Tp>
140_LIBCPP_HIDE_FROM_ABI void atomic_init(atomic<_Tp>* __o, typename atomic<_Tp>::value_type __d) _NOEXCEPT {
141 std::__cxx_atomic_init(std::addressof(__o->__a_), __d);
142}
143
144// atomic_store
145
146template <class _Tp>
147_LIBCPP_HIDE_FROM_ABI void atomic_store(volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __d) _NOEXCEPT {
148 __o->store(__d);
149}
150
151template <class _Tp>
152_LIBCPP_HIDE_FROM_ABI void atomic_store(atomic<_Tp>* __o, typename atomic<_Tp>::value_type __d) _NOEXCEPT {
153 __o->store(__d);
154}
155
156// atomic_store_explicit
157
158template <class _Tp>
159_LIBCPP_HIDE_FROM_ABI void
160atomic_store_explicit(volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __d, memory_order __m) _NOEXCEPT
161 _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m) {
162 __o->store(__d, __m);
163}
164
165template <class _Tp>
166_LIBCPP_HIDE_FROM_ABI void
167atomic_store_explicit(atomic<_Tp>* __o, typename atomic<_Tp>::value_type __d, memory_order __m) _NOEXCEPT
168 _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m) {
169 __o->store(__d, __m);
170}
171
172// atomic_load
173
174template <class _Tp>
175_LIBCPP_HIDE_FROM_ABI _Tp atomic_load(const volatile atomic<_Tp>* __o) _NOEXCEPT {
176 return __o->load();
177}
178
179template <class _Tp>
180_LIBCPP_HIDE_FROM_ABI _Tp atomic_load(const atomic<_Tp>* __o) _NOEXCEPT {
181 return __o->load();
182}
183
184// atomic_load_explicit
185
186template <class _Tp>
187_LIBCPP_HIDE_FROM_ABI _Tp atomic_load_explicit(const volatile atomic<_Tp>* __o, memory_order __m) _NOEXCEPT
188 _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m) {
189 return __o->load(__m);
190}
191
192template <class _Tp>
193_LIBCPP_HIDE_FROM_ABI _Tp atomic_load_explicit(const atomic<_Tp>* __o, memory_order __m) _NOEXCEPT
194 _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m) {
195 return __o->load(__m);
196}
197
198// atomic_exchange
199
200template <class _Tp>
201_LIBCPP_HIDE_FROM_ABI _Tp atomic_exchange(volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __d) _NOEXCEPT {
202 return __o->exchange(__d);
203}
204
205template <class _Tp>
206_LIBCPP_HIDE_FROM_ABI _Tp atomic_exchange(atomic<_Tp>* __o, typename atomic<_Tp>::value_type __d) _NOEXCEPT {
207 return __o->exchange(__d);
208}
209
210// atomic_exchange_explicit
211
212template <class _Tp>
213_LIBCPP_HIDE_FROM_ABI _Tp
214atomic_exchange_explicit(volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __d, memory_order __m) _NOEXCEPT {
215 return __o->exchange(__d, __m);
216}
217
218template <class _Tp>
219_LIBCPP_HIDE_FROM_ABI _Tp
220atomic_exchange_explicit(atomic<_Tp>* __o, typename atomic<_Tp>::value_type __d, memory_order __m) _NOEXCEPT {
221 return __o->exchange(__d, __m);
222}
223
224// atomic_compare_exchange_weak
225
226template <class _Tp>
227_LIBCPP_HIDE_FROM_ABI bool atomic_compare_exchange_weak(
228 volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type* __e, typename atomic<_Tp>::value_type __d) _NOEXCEPT {
229 return __o->compare_exchange_weak(*__e, __d);
230}
231
232template <class _Tp>
233_LIBCPP_HIDE_FROM_ABI bool atomic_compare_exchange_weak(
234 atomic<_Tp>* __o, typename atomic<_Tp>::value_type* __e, typename atomic<_Tp>::value_type __d) _NOEXCEPT {
235 return __o->compare_exchange_weak(*__e, __d);
236}
237
238// atomic_compare_exchange_strong
239
240template <class _Tp>
241_LIBCPP_HIDE_FROM_ABI bool atomic_compare_exchange_strong(
242 volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type* __e, typename atomic<_Tp>::value_type __d) _NOEXCEPT {
243 return __o->compare_exchange_strong(*__e, __d);
244}
245
246template <class _Tp>
247_LIBCPP_HIDE_FROM_ABI bool atomic_compare_exchange_strong(
248 atomic<_Tp>* __o, typename atomic<_Tp>::value_type* __e, typename atomic<_Tp>::value_type __d) _NOEXCEPT {
249 return __o->compare_exchange_strong(*__e, __d);
250}
251
252// atomic_compare_exchange_weak_explicit
253
254template <class _Tp>
255_LIBCPP_HIDE_FROM_ABI bool atomic_compare_exchange_weak_explicit(
256 volatile atomic<_Tp>* __o,
257 typename atomic<_Tp>::value_type* __e,
258 typename atomic<_Tp>::value_type __d,
259 memory_order __s,
260 memory_order __f) _NOEXCEPT _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f) {
261 return __o->compare_exchange_weak(*__e, __d, __s, __f);
262}
263
264template <class _Tp>
265_LIBCPP_HIDE_FROM_ABI bool atomic_compare_exchange_weak_explicit(
266 atomic<_Tp>* __o,
267 typename atomic<_Tp>::value_type* __e,
268 typename atomic<_Tp>::value_type __d,
269 memory_order __s,
270 memory_order __f) _NOEXCEPT _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f) {
271 return __o->compare_exchange_weak(*__e, __d, __s, __f);
272}
273
274// atomic_compare_exchange_strong_explicit
275
276template <class _Tp>
277_LIBCPP_HIDE_FROM_ABI bool atomic_compare_exchange_strong_explicit(
278 volatile atomic<_Tp>* __o,
279 typename atomic<_Tp>::value_type* __e,
280 typename atomic<_Tp>::value_type __d,
281 memory_order __s,
282 memory_order __f) _NOEXCEPT _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f) {
283 return __o->compare_exchange_strong(*__e, __d, __s, __f);
284}
285
286template <class _Tp>
287_LIBCPP_HIDE_FROM_ABI bool atomic_compare_exchange_strong_explicit(
288 atomic<_Tp>* __o,
289 typename atomic<_Tp>::value_type* __e,
290 typename atomic<_Tp>::value_type __d,
291 memory_order __s,
292 memory_order __f) _NOEXCEPT _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER(__s, __f) {
293 return __o->compare_exchange_strong(*__e, __d, __s, __f);
294}
295
296// atomic_wait
297
298template <class _Tp>
299_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void
300atomic_wait(const volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __v) _NOEXCEPT {
301 return __o->wait(__v);
302}
303
304template <class _Tp>
305_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void
306atomic_wait(const atomic<_Tp>* __o, typename atomic<_Tp>::value_type __v) _NOEXCEPT {
307 return __o->wait(__v);
308}
309
310// atomic_wait_explicit
311
312template <class _Tp>
313_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void
314atomic_wait_explicit(const volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __v, memory_order __m) _NOEXCEPT
315 _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m) {
316 return __o->wait(__v, __m);
317}
318
319template <class _Tp>
320_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void
321atomic_wait_explicit(const atomic<_Tp>* __o, typename atomic<_Tp>::value_type __v, memory_order __m) _NOEXCEPT
322 _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m) {
323 return __o->wait(__v, __m);
324}
325
326// atomic_notify_one
327
328template <class _Tp>
329_LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void
330atomic_notify_one(volatile atomic<_Tp>* __o) _NOEXCEPT {
331 __o->notify_one();
332}
333template <class _Tp>
334_LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void
335atomic_notify_one(atomic<_Tp>* __o) _NOEXCEPT {
336 __o->notify_one();
337}
338
339// atomic_notify_all
340
341template <class _Tp>
342_LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void
343atomic_notify_all(volatile atomic<_Tp>* __o) _NOEXCEPT {
344 __o->notify_all();
345}
346template <class _Tp>
347_LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void
348atomic_notify_all(atomic<_Tp>* __o) _NOEXCEPT {
349 __o->notify_all();
350}
351
352// atomic_fetch_add
353
354template <class _Tp>
355_LIBCPP_HIDE_FROM_ABI _Tp
356atomic_fetch_add(volatile atomic<_Tp>* __o, typename atomic<_Tp>::difference_type __op) _NOEXCEPT {
357 return __o->fetch_add(__op);
358}
359
360template <class _Tp>
361_LIBCPP_HIDE_FROM_ABI _Tp atomic_fetch_add(atomic<_Tp>* __o, typename atomic<_Tp>::difference_type __op) _NOEXCEPT {
362 return __o->fetch_add(__op);
363}
364
365// atomic_fetch_add_explicit
366
367template <class _Tp>
368_LIBCPP_HIDE_FROM_ABI _Tp atomic_fetch_add_explicit(
369 volatile atomic<_Tp>* __o, typename atomic<_Tp>::difference_type __op, memory_order __m) _NOEXCEPT {
370 return __o->fetch_add(__op, __m);
371}
372
373template <class _Tp>
374_LIBCPP_HIDE_FROM_ABI _Tp
375atomic_fetch_add_explicit(atomic<_Tp>* __o, typename atomic<_Tp>::difference_type __op, memory_order __m) _NOEXCEPT {
376 return __o->fetch_add(__op, __m);
377}
378
379// atomic_fetch_sub
380
381template <class _Tp>
382_LIBCPP_HIDE_FROM_ABI _Tp
383atomic_fetch_sub(volatile atomic<_Tp>* __o, typename atomic<_Tp>::difference_type __op) _NOEXCEPT {
384 return __o->fetch_sub(__op);
385}
386
387template <class _Tp>
388_LIBCPP_HIDE_FROM_ABI _Tp atomic_fetch_sub(atomic<_Tp>* __o, typename atomic<_Tp>::difference_type __op) _NOEXCEPT {
389 return __o->fetch_sub(__op);
390}
391
392// atomic_fetch_sub_explicit
393
394template <class _Tp>
395_LIBCPP_HIDE_FROM_ABI _Tp atomic_fetch_sub_explicit(
396 volatile atomic<_Tp>* __o, typename atomic<_Tp>::difference_type __op, memory_order __m) _NOEXCEPT {
397 return __o->fetch_sub(__op, __m);
398}
399
400template <class _Tp>
401_LIBCPP_HIDE_FROM_ABI _Tp
402atomic_fetch_sub_explicit(atomic<_Tp>* __o, typename atomic<_Tp>::difference_type __op, memory_order __m) _NOEXCEPT {
403 return __o->fetch_sub(__op, __m);
404}
405
406// atomic_fetch_and
407
408template <class _Tp, __enable_if_t<is_integral<_Tp>::value && !is_same<_Tp, bool>::value, int> = 0>
409_LIBCPP_HIDE_FROM_ABI _Tp atomic_fetch_and(volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __op) _NOEXCEPT {
410 return __o->fetch_and(__op);
411}
412
413template <class _Tp, __enable_if_t<is_integral<_Tp>::value && !is_same<_Tp, bool>::value, int> = 0>
414_LIBCPP_HIDE_FROM_ABI _Tp atomic_fetch_and(atomic<_Tp>* __o, typename atomic<_Tp>::value_type __op) _NOEXCEPT {
415 return __o->fetch_and(__op);
416}
417
418// atomic_fetch_and_explicit
419
420template <class _Tp, __enable_if_t<is_integral<_Tp>::value && !is_same<_Tp, bool>::value, int> = 0>
421_LIBCPP_HIDE_FROM_ABI _Tp atomic_fetch_and_explicit(
422 volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __op, memory_order __m) _NOEXCEPT {
423 return __o->fetch_and(__op, __m);
424}
425
426template <class _Tp, __enable_if_t<is_integral<_Tp>::value && !is_same<_Tp, bool>::value, int> = 0>
427_LIBCPP_HIDE_FROM_ABI _Tp
428atomic_fetch_and_explicit(atomic<_Tp>* __o, typename atomic<_Tp>::value_type __op, memory_order __m) _NOEXCEPT {
429 return __o->fetch_and(__op, __m);
430}
431
432// atomic_fetch_or
433
434template <class _Tp, __enable_if_t<is_integral<_Tp>::value && !is_same<_Tp, bool>::value, int> = 0>
435_LIBCPP_HIDE_FROM_ABI _Tp atomic_fetch_or(volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __op) _NOEXCEPT {
436 return __o->fetch_or(__op);
437}
438
439template <class _Tp, __enable_if_t<is_integral<_Tp>::value && !is_same<_Tp, bool>::value, int> = 0>
440_LIBCPP_HIDE_FROM_ABI _Tp atomic_fetch_or(atomic<_Tp>* __o, typename atomic<_Tp>::value_type __op) _NOEXCEPT {
441 return __o->fetch_or(__op);
442}
443
444// atomic_fetch_or_explicit
445
446template <class _Tp, __enable_if_t<is_integral<_Tp>::value && !is_same<_Tp, bool>::value, int> = 0>
447_LIBCPP_HIDE_FROM_ABI _Tp
448atomic_fetch_or_explicit(volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __op, memory_order __m) _NOEXCEPT {
449 return __o->fetch_or(__op, __m);
450}
451
452template <class _Tp, __enable_if_t<is_integral<_Tp>::value && !is_same<_Tp, bool>::value, int> = 0>
453_LIBCPP_HIDE_FROM_ABI _Tp
454atomic_fetch_or_explicit(atomic<_Tp>* __o, typename atomic<_Tp>::value_type __op, memory_order __m) _NOEXCEPT {
455 return __o->fetch_or(__op, __m);
456}
457
458// atomic_fetch_xor
459
460template <class _Tp, __enable_if_t<is_integral<_Tp>::value && !is_same<_Tp, bool>::value, int> = 0>
461_LIBCPP_HIDE_FROM_ABI _Tp atomic_fetch_xor(volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __op) _NOEXCEPT {
462 return __o->fetch_xor(__op);
463}
464
465template <class _Tp, __enable_if_t<is_integral<_Tp>::value && !is_same<_Tp, bool>::value, int> = 0>
466_LIBCPP_HIDE_FROM_ABI _Tp atomic_fetch_xor(atomic<_Tp>* __o, typename atomic<_Tp>::value_type __op) _NOEXCEPT {
467 return __o->fetch_xor(__op);
468}
469
470// atomic_fetch_xor_explicit
471
472template <class _Tp, __enable_if_t<is_integral<_Tp>::value && !is_same<_Tp, bool>::value, int> = 0>
473_LIBCPP_HIDE_FROM_ABI _Tp atomic_fetch_xor_explicit(
474 volatile atomic<_Tp>* __o, typename atomic<_Tp>::value_type __op, memory_order __m) _NOEXCEPT {
475 return __o->fetch_xor(__op, __m);
476}
477
478template <class _Tp, __enable_if_t<is_integral<_Tp>::value && !is_same<_Tp, bool>::value, int> = 0>
479_LIBCPP_HIDE_FROM_ABI _Tp
480atomic_fetch_xor_explicit(atomic<_Tp>* __o, typename atomic<_Tp>::value_type __op, memory_order __m) _NOEXCEPT {
481 return __o->fetch_xor(__op, __m);
482}
483
484_LIBCPP_END_NAMESPACE_STD
485
486#endif // _LIBCPP___CXX03___ATOMIC_ATOMIC_H
487

Warning: This file is not a C or C++ file. It does not have highlighting.

source code of libcxx/include/__cxx03/__atomic/atomic.h