]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/include/std/atomic
expr.c (store_field): Remove TYPE parameter.
[thirdparty/gcc.git] / libstdc++-v3 / include / std / atomic
CommitLineData
d466a7e2
BK
1// -*- C++ -*- header.
2
c4ae9877 3// Copyright (C) 2008-2012 Free Software Foundation, Inc.
d466a7e2
BK
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
748086b7 8// Free Software Foundation; either version 3, or (at your option)
d466a7e2
BK
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
748086b7
JJ
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
d466a7e2 24
f910786b 25/** @file include/atomic
afd88205 26 * This is a Standard C++ Library header.
d466a7e2
BK
27 */
28
29// Based on "C++ Atomic Types and Operations" by Hans Boehm and Lawrence Crowl.
30// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html
31
afd88205
BK
32#ifndef _GLIBCXX_ATOMIC
33#define _GLIBCXX_ATOMIC 1
d466a7e2
BK
34
35#pragma GCC system_header
36
37#ifndef __GXX_EXPERIMENTAL_CXX0X__
ab65a4c7 38# include <bits/c++0x_warning.h>
d466a7e2
BK
39#endif
40
afd88205 41#include <bits/atomic_base.h>
d466a7e2 42
12ffa228
BK
43namespace std _GLIBCXX_VISIBILITY(default)
44{
45_GLIBCXX_BEGIN_NAMESPACE_VERSION
d466a7e2 46
5b9daa7e
BK
47 /**
48 * @addtogroup atomics
49 * @{
50 */
51
94a86be0
BK
52 /// atomic_bool
53 // NB: No operators or fetch-operations for this type.
54 struct atomic_bool
d466a7e2 55 {
94a86be0
BK
56 private:
57 __atomic_base<bool> _M_base;
58
59 public:
bdc05efb
PC
60 atomic_bool() noexcept = default;
61 ~atomic_bool() noexcept = default;
94a86be0
BK
62 atomic_bool(const atomic_bool&) = delete;
63 atomic_bool& operator=(const atomic_bool&) = delete;
64 atomic_bool& operator=(const atomic_bool&) volatile = delete;
65
bdc05efb 66 constexpr atomic_bool(bool __i) noexcept : _M_base(__i) { }
94a86be0
BK
67
68 bool
bdc05efb 69 operator=(bool __i) noexcept
94a86be0
BK
70 { return _M_base.operator=(__i); }
71
bdc05efb 72 operator bool() const noexcept
94a86be0
BK
73 { return _M_base.load(); }
74
bdc05efb 75 operator bool() const volatile noexcept
94a86be0
BK
76 { return _M_base.load(); }
77
78 bool
bdc05efb 79 is_lock_free() const noexcept { return _M_base.is_lock_free(); }
94a86be0
BK
80
81 bool
bdc05efb 82 is_lock_free() const volatile noexcept { return _M_base.is_lock_free(); }
94a86be0
BK
83
84 void
bdc05efb 85 store(bool __i, memory_order __m = memory_order_seq_cst) noexcept
94a86be0
BK
86 { _M_base.store(__i, __m); }
87
88 void
bdc05efb 89 store(bool __i, memory_order __m = memory_order_seq_cst) volatile noexcept
94a86be0
BK
90 { _M_base.store(__i, __m); }
91
92 bool
bdc05efb 93 load(memory_order __m = memory_order_seq_cst) const noexcept
94a86be0
BK
94 { return _M_base.load(__m); }
95
96 bool
bdc05efb 97 load(memory_order __m = memory_order_seq_cst) const volatile noexcept
94a86be0
BK
98 { return _M_base.load(__m); }
99
100 bool
bdc05efb 101 exchange(bool __i, memory_order __m = memory_order_seq_cst) noexcept
94a86be0
BK
102 { return _M_base.exchange(__i, __m); }
103
104 bool
bdc05efb
PC
105 exchange(bool __i,
106 memory_order __m = memory_order_seq_cst) volatile noexcept
94a86be0
BK
107 { return _M_base.exchange(__i, __m); }
108
109 bool
110 compare_exchange_weak(bool& __i1, bool __i2, memory_order __m1,
bdc05efb 111 memory_order __m2) noexcept
94a86be0
BK
112 { return _M_base.compare_exchange_weak(__i1, __i2, __m1, __m2); }
113
114 bool
115 compare_exchange_weak(bool& __i1, bool __i2, memory_order __m1,
bdc05efb 116 memory_order __m2) volatile noexcept
94a86be0
BK
117 { return _M_base.compare_exchange_weak(__i1, __i2, __m1, __m2); }
118
119 bool
120 compare_exchange_weak(bool& __i1, bool __i2,
bdc05efb 121 memory_order __m = memory_order_seq_cst) noexcept
94a86be0
BK
122 { return _M_base.compare_exchange_weak(__i1, __i2, __m); }
123
124 bool
125 compare_exchange_weak(bool& __i1, bool __i2,
bdc05efb 126 memory_order __m = memory_order_seq_cst) volatile noexcept
94a86be0
BK
127 { return _M_base.compare_exchange_weak(__i1, __i2, __m); }
128
129 bool
130 compare_exchange_strong(bool& __i1, bool __i2, memory_order __m1,
bdc05efb 131 memory_order __m2) noexcept
94a86be0
BK
132 { return _M_base.compare_exchange_strong(__i1, __i2, __m1, __m2); }
133
134 bool
135 compare_exchange_strong(bool& __i1, bool __i2, memory_order __m1,
bdc05efb 136 memory_order __m2) volatile noexcept
94a86be0
BK
137 { return _M_base.compare_exchange_strong(__i1, __i2, __m1, __m2); }
138
139 bool
140 compare_exchange_strong(bool& __i1, bool __i2,
bdc05efb 141 memory_order __m = memory_order_seq_cst) noexcept
94a86be0
BK
142 { return _M_base.compare_exchange_strong(__i1, __i2, __m); }
143
144 bool
145 compare_exchange_strong(bool& __i1, bool __i2,
bdc05efb 146 memory_order __m = memory_order_seq_cst) volatile noexcept
94a86be0
BK
147 { return _M_base.compare_exchange_strong(__i1, __i2, __m); }
148 };
d466a7e2 149
d466a7e2 150
d632488a
BK
151 /**
152 * @brief Generic atomic type, primary class template.
153 *
154 * @tparam _Tp Type to be made atomic, must be trivally copyable.
155 */
50ce8d3d
BK
156 template<typename _Tp>
157 struct atomic
158 {
159 private:
160 _Tp _M_i;
d466a7e2 161
50ce8d3d 162 public:
bdc05efb
PC
163 atomic() noexcept = default;
164 ~atomic() noexcept = default;
50ce8d3d 165 atomic(const atomic&) = delete;
94a86be0 166 atomic& operator=(const atomic&) = delete;
afd88205 167 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 168
bdc05efb 169 constexpr atomic(_Tp __i) noexcept : _M_i(__i) { }
d466a7e2 170
86951993
AM
171 operator _Tp() const noexcept
172 { return load(); }
d466a7e2 173
86951993
AM
174 operator _Tp() const volatile noexcept
175 { return load(); }
94a86be0 176
afd88205 177 _Tp
86951993
AM
178 operator=(_Tp __i) noexcept
179 { store(__i); return __i; }
d466a7e2 180
94a86be0 181 _Tp
86951993
AM
182 operator=(_Tp __i) volatile noexcept
183 { store(__i); return __i; }
94a86be0
BK
184
185 bool
86951993 186 is_lock_free() const noexcept
c4ae9877 187 { return __atomic_is_lock_free(sizeof(_M_i), nullptr); }
94a86be0 188
afd88205 189 bool
86951993 190 is_lock_free() const volatile noexcept
c4ae9877 191 { return __atomic_is_lock_free(sizeof(_M_i), nullptr); }
d466a7e2 192
94a86be0 193 void
86951993
AM
194 store(_Tp __i, memory_order _m = memory_order_seq_cst) noexcept
195 { __atomic_store(&_M_i, &__i, _m); }
94a86be0 196
afd88205 197 void
86951993
AM
198 store(_Tp __i, memory_order _m = memory_order_seq_cst) volatile noexcept
199 { __atomic_store(&_M_i, &__i, _m); }
d466a7e2 200
94a86be0 201 _Tp
86951993
AM
202 load(memory_order _m = memory_order_seq_cst) const noexcept
203 {
204 _Tp tmp;
205 __atomic_load(&_M_i, &tmp, _m);
206 return tmp;
207 }
94a86be0 208
afd88205 209 _Tp
86951993
AM
210 load(memory_order _m = memory_order_seq_cst) const volatile noexcept
211 {
212 _Tp tmp;
213 __atomic_load(&_M_i, &tmp, _m);
214 return tmp;
215 }
d466a7e2 216
94a86be0 217 _Tp
86951993
AM
218 exchange(_Tp __i, memory_order _m = memory_order_seq_cst) noexcept
219 {
220 _Tp tmp;
221 __atomic_exchange(&_M_i, &__i, &tmp, _m);
222 return tmp;
223 }
94a86be0 224
afd88205 225 _Tp
86951993
AM
226 exchange(_Tp __i,
227 memory_order _m = memory_order_seq_cst) volatile noexcept
228 {
229 _Tp tmp;
230 __atomic_exchange(&_M_i, &__i, &tmp, _m);
231 return tmp;
232 }
d466a7e2 233
94a86be0 234 bool
86951993
AM
235 compare_exchange_weak(_Tp& __e, _Tp __i, memory_order __s,
236 memory_order __f) noexcept
237 {
238 return __atomic_compare_exchange(&_M_i, &__e, &__i, true, __s, __f);
239 }
94a86be0 240
afd88205 241 bool
86951993
AM
242 compare_exchange_weak(_Tp& __e, _Tp __i, memory_order __s,
243 memory_order __f) volatile noexcept
244 {
245 return __atomic_compare_exchange(&_M_i, &__e, &__i, true, __s, __f);
246 }
d466a7e2 247
afd88205 248 bool
86951993
AM
249 compare_exchange_weak(_Tp& __e, _Tp __i,
250 memory_order __m = memory_order_seq_cst) noexcept
251 { return compare_exchange_weak(__e, __i, __m, __m); }
d466a7e2 252
afd88205 253 bool
86951993
AM
254 compare_exchange_weak(_Tp& __e, _Tp __i,
255 memory_order __m = memory_order_seq_cst) volatile noexcept
256 { return compare_exchange_weak(__e, __i, __m, __m); }
d466a7e2 257
94a86be0 258 bool
86951993
AM
259 compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s,
260 memory_order __f) noexcept
261 {
262 return __atomic_compare_exchange(&_M_i, &__e, &__i, false, __s, __f);
263 }
94a86be0
BK
264
265 bool
86951993
AM
266 compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s,
267 memory_order __f) volatile noexcept
268 {
269 return __atomic_compare_exchange(&_M_i, &__e, &__i, false, __s, __f);
270 }
94a86be0
BK
271
272 bool
86951993
AM
273 compare_exchange_strong(_Tp& __e, _Tp __i,
274 memory_order __m = memory_order_seq_cst) noexcept
275 { return compare_exchange_strong(__e, __i, __m, __m); }
94a86be0 276
afd88205 277 bool
86951993
AM
278 compare_exchange_strong(_Tp& __e, _Tp __i,
279 memory_order __m = memory_order_seq_cst) volatile noexcept
280 { return compare_exchange_strong(__e, __i, __m, __m); }
50ce8d3d 281 };
d466a7e2 282
d466a7e2 283
50ce8d3d 284 /// Partial specialization for pointer types.
afd88205 285 template<typename _Tp>
036e0d4f 286 struct atomic<_Tp*>
50ce8d3d 287 {
036e0d4f
BK
288 typedef _Tp* __pointer_type;
289 typedef __atomic_base<_Tp*> __base_type;
290 __base_type _M_b;
291
bdc05efb
PC
292 atomic() noexcept = default;
293 ~atomic() noexcept = default;
50ce8d3d 294 atomic(const atomic&) = delete;
036e0d4f 295 atomic& operator=(const atomic&) = delete;
afd88205 296 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 297
bdc05efb 298 constexpr atomic(__pointer_type __p) noexcept : _M_b(__p) { }
94a86be0 299
bdc05efb 300 operator __pointer_type() const noexcept
036e0d4f 301 { return __pointer_type(_M_b); }
d466a7e2 302
bdc05efb 303 operator __pointer_type() const volatile noexcept
036e0d4f 304 { return __pointer_type(_M_b); }
d466a7e2 305
036e0d4f 306 __pointer_type
bdc05efb 307 operator=(__pointer_type __p) noexcept
036e0d4f 308 { return _M_b.operator=(__p); }
d466a7e2 309
036e0d4f 310 __pointer_type
bdc05efb 311 operator=(__pointer_type __p) volatile noexcept
036e0d4f 312 { return _M_b.operator=(__p); }
94a86be0 313
036e0d4f 314 __pointer_type
bdc05efb 315 operator++(int) noexcept
036e0d4f 316 { return _M_b++; }
94a86be0 317
036e0d4f 318 __pointer_type
bdc05efb 319 operator++(int) volatile noexcept
036e0d4f 320 { return _M_b++; }
d466a7e2 321
036e0d4f 322 __pointer_type
bdc05efb 323 operator--(int) noexcept
036e0d4f 324 { return _M_b--; }
d466a7e2 325
036e0d4f 326 __pointer_type
bdc05efb 327 operator--(int) volatile noexcept
036e0d4f 328 { return _M_b--; }
d466a7e2 329
036e0d4f 330 __pointer_type
bdc05efb 331 operator++() noexcept
036e0d4f 332 { return ++_M_b; }
d466a7e2 333
036e0d4f 334 __pointer_type
bdc05efb 335 operator++() volatile noexcept
036e0d4f 336 { return ++_M_b; }
94a86be0 337
036e0d4f 338 __pointer_type
bdc05efb 339 operator--() noexcept
036e0d4f 340 { return --_M_b; }
94a86be0 341
036e0d4f 342 __pointer_type
bdc05efb 343 operator--() volatile noexcept
036e0d4f
BK
344 { return --_M_b; }
345
346 __pointer_type
bdc05efb 347 operator+=(ptrdiff_t __d) noexcept
036e0d4f
BK
348 { return _M_b.operator+=(__d); }
349
350 __pointer_type
bdc05efb 351 operator+=(ptrdiff_t __d) volatile noexcept
036e0d4f
BK
352 { return _M_b.operator+=(__d); }
353
354 __pointer_type
bdc05efb 355 operator-=(ptrdiff_t __d) noexcept
036e0d4f
BK
356 { return _M_b.operator-=(__d); }
357
358 __pointer_type
bdc05efb 359 operator-=(ptrdiff_t __d) volatile noexcept
036e0d4f 360 { return _M_b.operator-=(__d); }
94a86be0 361
afd88205 362 bool
bdc05efb 363 is_lock_free() const noexcept
036e0d4f 364 { return _M_b.is_lock_free(); }
d466a7e2 365
94a86be0 366 bool
bdc05efb 367 is_lock_free() const volatile noexcept
036e0d4f
BK
368 { return _M_b.is_lock_free(); }
369
370 void
bdc05efb
PC
371 store(__pointer_type __p,
372 memory_order __m = memory_order_seq_cst) noexcept
036e0d4f
BK
373 { return _M_b.store(__p, __m); }
374
375 void
376 store(__pointer_type __p,
bdc05efb 377 memory_order __m = memory_order_seq_cst) volatile noexcept
036e0d4f 378 { return _M_b.store(__p, __m); }
94a86be0 379
036e0d4f 380 __pointer_type
bdc05efb 381 load(memory_order __m = memory_order_seq_cst) const noexcept
036e0d4f 382 { return _M_b.load(__m); }
d466a7e2 383
036e0d4f 384 __pointer_type
bdc05efb 385 load(memory_order __m = memory_order_seq_cst) const volatile noexcept
036e0d4f 386 { return _M_b.load(__m); }
94a86be0 387
036e0d4f 388 __pointer_type
bdc05efb
PC
389 exchange(__pointer_type __p,
390 memory_order __m = memory_order_seq_cst) noexcept
036e0d4f 391 { return _M_b.exchange(__p, __m); }
d466a7e2 392
036e0d4f
BK
393 __pointer_type
394 exchange(__pointer_type __p,
bdc05efb 395 memory_order __m = memory_order_seq_cst) volatile noexcept
036e0d4f 396 { return _M_b.exchange(__p, __m); }
94a86be0 397
036e0d4f
BK
398 bool
399 compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,
bdc05efb 400 memory_order __m1, memory_order __m2) noexcept
036e0d4f 401 { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }
d466a7e2 402
036e0d4f
BK
403 bool
404 compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,
bdc05efb
PC
405 memory_order __m1,
406 memory_order __m2) volatile noexcept
036e0d4f 407 { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }
94a86be0 408
036e0d4f
BK
409 bool
410 compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,
bdc05efb 411 memory_order __m = memory_order_seq_cst) noexcept
afd88205 412 {
036e0d4f 413 return compare_exchange_weak(__p1, __p2, __m,
3d0c32fe 414 __cmpexch_failure_order(__m));
50ce8d3d 415 }
d466a7e2 416
036e0d4f
BK
417 bool
418 compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,
bdc05efb 419 memory_order __m = memory_order_seq_cst) volatile noexcept
94a86be0 420 {
036e0d4f 421 return compare_exchange_weak(__p1, __p2, __m,
3d0c32fe 422 __cmpexch_failure_order(__m));
94a86be0
BK
423 }
424
036e0d4f
BK
425 bool
426 compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
bdc05efb 427 memory_order __m1, memory_order __m2) noexcept
036e0d4f 428 { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }
d466a7e2 429
036e0d4f
BK
430 bool
431 compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
bdc05efb
PC
432 memory_order __m1,
433 memory_order __m2) volatile noexcept
036e0d4f 434 { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }
94a86be0 435
036e0d4f
BK
436 bool
437 compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
bdc05efb 438 memory_order __m = memory_order_seq_cst) noexcept
036e0d4f
BK
439 {
440 return _M_b.compare_exchange_strong(__p1, __p2, __m,
3d0c32fe 441 __cmpexch_failure_order(__m));
036e0d4f 442 }
d466a7e2 443
036e0d4f
BK
444 bool
445 compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
bdc05efb 446 memory_order __m = memory_order_seq_cst) volatile noexcept
036e0d4f
BK
447 {
448 return _M_b.compare_exchange_strong(__p1, __p2, __m,
3d0c32fe 449 __cmpexch_failure_order(__m));
036e0d4f 450 }
94a86be0 451
036e0d4f 452 __pointer_type
bdc05efb
PC
453 fetch_add(ptrdiff_t __d,
454 memory_order __m = memory_order_seq_cst) noexcept
036e0d4f 455 { return _M_b.fetch_add(__d, __m); }
d466a7e2 456
036e0d4f
BK
457 __pointer_type
458 fetch_add(ptrdiff_t __d,
bdc05efb 459 memory_order __m = memory_order_seq_cst) volatile noexcept
036e0d4f 460 { return _M_b.fetch_add(__d, __m); }
94a86be0 461
036e0d4f 462 __pointer_type
bdc05efb
PC
463 fetch_sub(ptrdiff_t __d,
464 memory_order __m = memory_order_seq_cst) noexcept
036e0d4f 465 { return _M_b.fetch_sub(__d, __m); }
d466a7e2 466
036e0d4f
BK
467 __pointer_type
468 fetch_sub(ptrdiff_t __d,
bdc05efb 469 memory_order __m = memory_order_seq_cst) volatile noexcept
036e0d4f 470 { return _M_b.fetch_sub(__d, __m); }
50ce8d3d 471 };
d466a7e2 472
036e0d4f 473
50ce8d3d 474 /// Explicit specialization for bool.
afd88205 475 template<>
50ce8d3d
BK
476 struct atomic<bool> : public atomic_bool
477 {
478 typedef bool __integral_type;
479 typedef atomic_bool __base_type;
d466a7e2 480
bdc05efb
PC
481 atomic() noexcept = default;
482 ~atomic() noexcept = default;
50ce8d3d 483 atomic(const atomic&) = delete;
94a86be0 484 atomic& operator=(const atomic&) = delete;
afd88205 485 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 486
bdc05efb 487 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 488
50ce8d3d
BK
489 using __base_type::operator __integral_type;
490 using __base_type::operator=;
491 };
d466a7e2 492
50ce8d3d 493 /// Explicit specialization for char.
afd88205 494 template<>
50ce8d3d
BK
495 struct atomic<char> : public atomic_char
496 {
497 typedef char __integral_type;
498 typedef atomic_char __base_type;
d466a7e2 499
bdc05efb
PC
500 atomic() noexcept = default;
501 ~atomic() noexcept = default;
50ce8d3d 502 atomic(const atomic&) = delete;
94a86be0 503 atomic& operator=(const atomic&) = delete;
afd88205 504 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 505
bdc05efb 506 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 507
50ce8d3d
BK
508 using __base_type::operator __integral_type;
509 using __base_type::operator=;
510 };
d466a7e2 511
50ce8d3d 512 /// Explicit specialization for signed char.
afd88205 513 template<>
50ce8d3d 514 struct atomic<signed char> : public atomic_schar
afd88205 515 {
50ce8d3d
BK
516 typedef signed char __integral_type;
517 typedef atomic_schar __base_type;
d466a7e2 518
bdc05efb
PC
519 atomic() noexcept= default;
520 ~atomic() noexcept = default;
50ce8d3d 521 atomic(const atomic&) = delete;
94a86be0 522 atomic& operator=(const atomic&) = delete;
afd88205 523 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 524
bdc05efb 525 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 526
50ce8d3d
BK
527 using __base_type::operator __integral_type;
528 using __base_type::operator=;
529 };
d466a7e2 530
50ce8d3d 531 /// Explicit specialization for unsigned char.
afd88205 532 template<>
50ce8d3d
BK
533 struct atomic<unsigned char> : public atomic_uchar
534 {
535 typedef unsigned char __integral_type;
536 typedef atomic_uchar __base_type;
d466a7e2 537
bdc05efb
PC
538 atomic() noexcept= default;
539 ~atomic() noexcept = default;
50ce8d3d 540 atomic(const atomic&) = delete;
94a86be0 541 atomic& operator=(const atomic&) = delete;
afd88205 542 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 543
bdc05efb 544 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 545
50ce8d3d
BK
546 using __base_type::operator __integral_type;
547 using __base_type::operator=;
548 };
d466a7e2 549
50ce8d3d 550 /// Explicit specialization for short.
afd88205 551 template<>
50ce8d3d
BK
552 struct atomic<short> : public atomic_short
553 {
554 typedef short __integral_type;
555 typedef atomic_short __base_type;
d466a7e2 556
bdc05efb
PC
557 atomic() noexcept = default;
558 ~atomic() noexcept = default;
50ce8d3d 559 atomic(const atomic&) = delete;
94a86be0 560 atomic& operator=(const atomic&) = delete;
afd88205 561 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 562
bdc05efb 563 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 564
50ce8d3d
BK
565 using __base_type::operator __integral_type;
566 using __base_type::operator=;
567 };
d466a7e2 568
50ce8d3d 569 /// Explicit specialization for unsigned short.
afd88205 570 template<>
50ce8d3d
BK
571 struct atomic<unsigned short> : public atomic_ushort
572 {
573 typedef unsigned short __integral_type;
574 typedef atomic_ushort __base_type;
d466a7e2 575
bdc05efb
PC
576 atomic() noexcept = default;
577 ~atomic() noexcept = default;
50ce8d3d 578 atomic(const atomic&) = delete;
94a86be0 579 atomic& operator=(const atomic&) = delete;
afd88205 580 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 581
bdc05efb 582 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 583
50ce8d3d
BK
584 using __base_type::operator __integral_type;
585 using __base_type::operator=;
586 };
d466a7e2 587
50ce8d3d 588 /// Explicit specialization for int.
afd88205 589 template<>
50ce8d3d
BK
590 struct atomic<int> : atomic_int
591 {
592 typedef int __integral_type;
593 typedef atomic_int __base_type;
d466a7e2 594
bdc05efb
PC
595 atomic() noexcept = default;
596 ~atomic() noexcept = default;
50ce8d3d 597 atomic(const atomic&) = delete;
94a86be0 598 atomic& operator=(const atomic&) = delete;
afd88205 599 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 600
bdc05efb 601 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 602
50ce8d3d
BK
603 using __base_type::operator __integral_type;
604 using __base_type::operator=;
605 };
d466a7e2 606
50ce8d3d 607 /// Explicit specialization for unsigned int.
afd88205 608 template<>
50ce8d3d
BK
609 struct atomic<unsigned int> : public atomic_uint
610 {
611 typedef unsigned int __integral_type;
612 typedef atomic_uint __base_type;
d466a7e2 613
bdc05efb
PC
614 atomic() noexcept = default;
615 ~atomic() noexcept = default;
50ce8d3d 616 atomic(const atomic&) = delete;
94a86be0 617 atomic& operator=(const atomic&) = delete;
afd88205 618 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 619
bdc05efb 620 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 621
50ce8d3d
BK
622 using __base_type::operator __integral_type;
623 using __base_type::operator=;
624 };
d466a7e2 625
50ce8d3d 626 /// Explicit specialization for long.
afd88205 627 template<>
50ce8d3d
BK
628 struct atomic<long> : public atomic_long
629 {
630 typedef long __integral_type;
631 typedef atomic_long __base_type;
d466a7e2 632
bdc05efb
PC
633 atomic() noexcept = default;
634 ~atomic() noexcept = default;
50ce8d3d 635 atomic(const atomic&) = delete;
94a86be0 636 atomic& operator=(const atomic&) = delete;
afd88205 637 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 638
bdc05efb 639 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 640
50ce8d3d
BK
641 using __base_type::operator __integral_type;
642 using __base_type::operator=;
643 };
d466a7e2 644
50ce8d3d 645 /// Explicit specialization for unsigned long.
afd88205 646 template<>
50ce8d3d
BK
647 struct atomic<unsigned long> : public atomic_ulong
648 {
649 typedef unsigned long __integral_type;
650 typedef atomic_ulong __base_type;
d466a7e2 651
bdc05efb
PC
652 atomic() noexcept = default;
653 ~atomic() noexcept = default;
50ce8d3d 654 atomic(const atomic&) = delete;
94a86be0 655 atomic& operator=(const atomic&) = delete;
afd88205 656 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 657
bdc05efb 658 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 659
50ce8d3d
BK
660 using __base_type::operator __integral_type;
661 using __base_type::operator=;
662 };
d466a7e2 663
50ce8d3d 664 /// Explicit specialization for long long.
afd88205 665 template<>
50ce8d3d
BK
666 struct atomic<long long> : public atomic_llong
667 {
668 typedef long long __integral_type;
669 typedef atomic_llong __base_type;
d466a7e2 670
bdc05efb
PC
671 atomic() noexcept = default;
672 ~atomic() noexcept = default;
50ce8d3d 673 atomic(const atomic&) = delete;
94a86be0 674 atomic& operator=(const atomic&) = delete;
afd88205 675 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 676
bdc05efb 677 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 678
50ce8d3d
BK
679 using __base_type::operator __integral_type;
680 using __base_type::operator=;
681 };
d466a7e2 682
50ce8d3d 683 /// Explicit specialization for unsigned long long.
afd88205 684 template<>
50ce8d3d
BK
685 struct atomic<unsigned long long> : public atomic_ullong
686 {
687 typedef unsigned long long __integral_type;
688 typedef atomic_ullong __base_type;
d466a7e2 689
bdc05efb
PC
690 atomic() noexcept = default;
691 ~atomic() noexcept = default;
50ce8d3d 692 atomic(const atomic&) = delete;
94a86be0 693 atomic& operator=(const atomic&) = delete;
afd88205 694 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 695
bdc05efb 696 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 697
50ce8d3d
BK
698 using __base_type::operator __integral_type;
699 using __base_type::operator=;
700 };
d466a7e2 701
50ce8d3d 702 /// Explicit specialization for wchar_t.
afd88205 703 template<>
50ce8d3d
BK
704 struct atomic<wchar_t> : public atomic_wchar_t
705 {
706 typedef wchar_t __integral_type;
707 typedef atomic_wchar_t __base_type;
d466a7e2 708
bdc05efb
PC
709 atomic() noexcept = default;
710 ~atomic() noexcept = default;
50ce8d3d 711 atomic(const atomic&) = delete;
94a86be0 712 atomic& operator=(const atomic&) = delete;
afd88205 713 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 714
bdc05efb 715 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 716
50ce8d3d
BK
717 using __base_type::operator __integral_type;
718 using __base_type::operator=;
719 };
d466a7e2 720
50ce8d3d 721 /// Explicit specialization for char16_t.
afd88205 722 template<>
50ce8d3d
BK
723 struct atomic<char16_t> : public atomic_char16_t
724 {
725 typedef char16_t __integral_type;
726 typedef atomic_char16_t __base_type;
d466a7e2 727
bdc05efb
PC
728 atomic() noexcept = default;
729 ~atomic() noexcept = default;
50ce8d3d 730 atomic(const atomic&) = delete;
94a86be0 731 atomic& operator=(const atomic&) = delete;
afd88205 732 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 733
bdc05efb 734 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 735
50ce8d3d
BK
736 using __base_type::operator __integral_type;
737 using __base_type::operator=;
738 };
d466a7e2 739
50ce8d3d 740 /// Explicit specialization for char32_t.
afd88205 741 template<>
50ce8d3d
BK
742 struct atomic<char32_t> : public atomic_char32_t
743 {
744 typedef char32_t __integral_type;
745 typedef atomic_char32_t __base_type;
d466a7e2 746
bdc05efb
PC
747 atomic() noexcept = default;
748 ~atomic() noexcept = default;
50ce8d3d 749 atomic(const atomic&) = delete;
94a86be0 750 atomic& operator=(const atomic&) = delete;
afd88205 751 atomic& operator=(const atomic&) volatile = delete;
d466a7e2 752
bdc05efb 753 constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }
d466a7e2 754
50ce8d3d
BK
755 using __base_type::operator __integral_type;
756 using __base_type::operator=;
757 };
d466a7e2 758
94a86be0 759
94a86be0 760 // Function definitions, atomic_flag operations.
afd88205 761 inline bool
bdc05efb
PC
762 atomic_flag_test_and_set_explicit(atomic_flag* __a,
763 memory_order __m) noexcept
50ce8d3d 764 { return __a->test_and_set(__m); }
d466a7e2 765
94a86be0 766 inline bool
036e0d4f 767 atomic_flag_test_and_set_explicit(volatile atomic_flag* __a,
bdc05efb 768 memory_order __m) noexcept
94a86be0
BK
769 { return __a->test_and_set(__m); }
770
afd88205 771 inline void
bdc05efb 772 atomic_flag_clear_explicit(atomic_flag* __a, memory_order __m) noexcept
94a86be0
BK
773 { __a->clear(__m); }
774
775 inline void
bdc05efb
PC
776 atomic_flag_clear_explicit(volatile atomic_flag* __a,
777 memory_order __m) noexcept
94a86be0 778 { __a->clear(__m); }
d466a7e2 779
94a86be0 780 inline bool
bdc05efb 781 atomic_flag_test_and_set(atomic_flag* __a) noexcept
94a86be0 782 { return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); }
d466a7e2 783
94a86be0 784 inline bool
bdc05efb 785 atomic_flag_test_and_set(volatile atomic_flag* __a) noexcept
94a86be0
BK
786 { return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); }
787
788 inline void
bdc05efb 789 atomic_flag_clear(atomic_flag* __a) noexcept
94a86be0
BK
790 { atomic_flag_clear_explicit(__a, memory_order_seq_cst); }
791
792 inline void
bdc05efb 793 atomic_flag_clear(volatile atomic_flag* __a) noexcept
94a86be0 794 { atomic_flag_clear_explicit(__a, memory_order_seq_cst); }
94a86be0 795
d466a7e2 796
036e0d4f 797 // Function templates generally applicable to atomic types.
94a86be0
BK
798 template<typename _ITp>
799 inline bool
bdc05efb 800 atomic_is_lock_free(const atomic<_ITp>* __a) noexcept
94a86be0
BK
801 { return __a->is_lock_free(); }
802
803 template<typename _ITp>
804 inline bool
bdc05efb 805 atomic_is_lock_free(const volatile atomic<_ITp>* __a) noexcept
94a86be0
BK
806 { return __a->is_lock_free(); }
807
808 template<typename _ITp>
036e0d4f 809 inline void
bdc05efb 810 atomic_init(atomic<_ITp>* __a, _ITp __i) noexcept;
94a86be0
BK
811
812 template<typename _ITp>
036e0d4f 813 inline void
bdc05efb 814 atomic_init(volatile atomic<_ITp>* __a, _ITp __i) noexcept;
d466a7e2 815
50ce8d3d 816 template<typename _ITp>
afd88205 817 inline void
bdc05efb
PC
818 atomic_store_explicit(atomic<_ITp>* __a, _ITp __i,
819 memory_order __m) noexcept
50ce8d3d
BK
820 { __a->store(__i, __m); }
821
94a86be0
BK
822 template<typename _ITp>
823 inline void
036e0d4f 824 atomic_store_explicit(volatile atomic<_ITp>* __a, _ITp __i,
bdc05efb 825 memory_order __m) noexcept
94a86be0
BK
826 { __a->store(__i, __m); }
827
50ce8d3d
BK
828 template<typename _ITp>
829 inline _ITp
bdc05efb 830 atomic_load_explicit(const atomic<_ITp>* __a, memory_order __m) noexcept
afd88205 831 { return __a->load(__m); }
50ce8d3d 832
94a86be0
BK
833 template<typename _ITp>
834 inline _ITp
036e0d4f 835 atomic_load_explicit(const volatile atomic<_ITp>* __a,
bdc05efb 836 memory_order __m) noexcept
94a86be0
BK
837 { return __a->load(__m); }
838
50ce8d3d 839 template<typename _ITp>
afd88205 840 inline _ITp
036e0d4f 841 atomic_exchange_explicit(atomic<_ITp>* __a, _ITp __i,
bdc05efb 842 memory_order __m) noexcept
afd88205 843 { return __a->exchange(__i, __m); }
50ce8d3d 844
94a86be0
BK
845 template<typename _ITp>
846 inline _ITp
036e0d4f 847 atomic_exchange_explicit(volatile atomic<_ITp>* __a, _ITp __i,
bdc05efb 848 memory_order __m) noexcept
94a86be0
BK
849 { return __a->exchange(__i, __m); }
850
50ce8d3d 851 template<typename _ITp>
afd88205 852 inline bool
036e0d4f 853 atomic_compare_exchange_weak_explicit(atomic<_ITp>* __a,
afd88205 854 _ITp* __i1, _ITp __i2,
bdc05efb
PC
855 memory_order __m1,
856 memory_order __m2) noexcept
50ce8d3d 857 { return __a->compare_exchange_weak(*__i1, __i2, __m1, __m2); }
d466a7e2 858
94a86be0
BK
859 template<typename _ITp>
860 inline bool
036e0d4f 861 atomic_compare_exchange_weak_explicit(volatile atomic<_ITp>* __a,
94a86be0 862 _ITp* __i1, _ITp __i2,
bdc05efb
PC
863 memory_order __m1,
864 memory_order __m2) noexcept
94a86be0
BK
865 { return __a->compare_exchange_weak(*__i1, __i2, __m1, __m2); }
866
50ce8d3d 867 template<typename _ITp>
afd88205 868 inline bool
036e0d4f 869 atomic_compare_exchange_strong_explicit(atomic<_ITp>* __a,
afd88205
BK
870 _ITp* __i1, _ITp __i2,
871 memory_order __m1,
bdc05efb 872 memory_order __m2) noexcept
50ce8d3d
BK
873 { return __a->compare_exchange_strong(*__i1, __i2, __m1, __m2); }
874
94a86be0
BK
875 template<typename _ITp>
876 inline bool
036e0d4f 877 atomic_compare_exchange_strong_explicit(volatile atomic<_ITp>* __a,
94a86be0
BK
878 _ITp* __i1, _ITp __i2,
879 memory_order __m1,
bdc05efb 880 memory_order __m2) noexcept
94a86be0
BK
881 { return __a->compare_exchange_strong(*__i1, __i2, __m1, __m2); }
882
d466a7e2 883
50ce8d3d 884 template<typename _ITp>
afd88205 885 inline void
bdc05efb 886 atomic_store(atomic<_ITp>* __a, _ITp __i) noexcept
50ce8d3d 887 { atomic_store_explicit(__a, __i, memory_order_seq_cst); }
d466a7e2 888
94a86be0
BK
889 template<typename _ITp>
890 inline void
bdc05efb 891 atomic_store(volatile atomic<_ITp>* __a, _ITp __i) noexcept
94a86be0
BK
892 { atomic_store_explicit(__a, __i, memory_order_seq_cst); }
893
50ce8d3d 894 template<typename _ITp>
afd88205 895 inline _ITp
bdc05efb 896 atomic_load(const atomic<_ITp>* __a) noexcept
50ce8d3d 897 { return atomic_load_explicit(__a, memory_order_seq_cst); }
d466a7e2 898
94a86be0
BK
899 template<typename _ITp>
900 inline _ITp
bdc05efb 901 atomic_load(const volatile atomic<_ITp>* __a) noexcept
94a86be0
BK
902 { return atomic_load_explicit(__a, memory_order_seq_cst); }
903
50ce8d3d 904 template<typename _ITp>
afd88205 905 inline _ITp
bdc05efb 906 atomic_exchange(atomic<_ITp>* __a, _ITp __i) noexcept
50ce8d3d 907 { return atomic_exchange_explicit(__a, __i, memory_order_seq_cst); }
d466a7e2 908
94a86be0
BK
909 template<typename _ITp>
910 inline _ITp
bdc05efb 911 atomic_exchange(volatile atomic<_ITp>* __a, _ITp __i) noexcept
94a86be0
BK
912 { return atomic_exchange_explicit(__a, __i, memory_order_seq_cst); }
913
50ce8d3d 914 template<typename _ITp>
afd88205 915 inline bool
036e0d4f 916 atomic_compare_exchange_weak(atomic<_ITp>* __a,
bdc05efb 917 _ITp* __i1, _ITp __i2) noexcept
afd88205
BK
918 {
919 return atomic_compare_exchange_weak_explicit(__a, __i1, __i2,
50ce8d3d 920 memory_order_seq_cst,
afd88205 921 memory_order_seq_cst);
d466a7e2
BK
922 }
923
94a86be0
BK
924 template<typename _ITp>
925 inline bool
036e0d4f 926 atomic_compare_exchange_weak(volatile atomic<_ITp>* __a,
bdc05efb 927 _ITp* __i1, _ITp __i2) noexcept
94a86be0
BK
928 {
929 return atomic_compare_exchange_weak_explicit(__a, __i1, __i2,
930 memory_order_seq_cst,
931 memory_order_seq_cst);
932 }
933
50ce8d3d 934 template<typename _ITp>
afd88205 935 inline bool
036e0d4f 936 atomic_compare_exchange_strong(atomic<_ITp>* __a,
bdc05efb 937 _ITp* __i1, _ITp __i2) noexcept
afd88205
BK
938 {
939 return atomic_compare_exchange_strong_explicit(__a, __i1, __i2,
50ce8d3d 940 memory_order_seq_cst,
afd88205 941 memory_order_seq_cst);
d466a7e2
BK
942 }
943
94a86be0
BK
944 template<typename _ITp>
945 inline bool
036e0d4f 946 atomic_compare_exchange_strong(volatile atomic<_ITp>* __a,
bdc05efb 947 _ITp* __i1, _ITp __i2) noexcept
94a86be0
BK
948 {
949 return atomic_compare_exchange_strong_explicit(__a, __i1, __i2,
950 memory_order_seq_cst,
951 memory_order_seq_cst);
952 }
953
036e0d4f
BK
954 // Function templates for atomic_integral operations only, using
955 // __atomic_base. Template argument should be constricted to
956 // intergral types as specified in the standard, excluding address
957 // types.
958 template<typename _ITp>
959 inline _ITp
960 atomic_fetch_add_explicit(__atomic_base<_ITp>* __a, _ITp __i,
bdc05efb 961 memory_order __m) noexcept
036e0d4f
BK
962 { return __a->fetch_add(__i, __m); }
963
964 template<typename _ITp>
965 inline _ITp
966 atomic_fetch_add_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,
bdc05efb 967 memory_order __m) noexcept
036e0d4f
BK
968 { return __a->fetch_add(__i, __m); }
969
970 template<typename _ITp>
971 inline _ITp
972 atomic_fetch_sub_explicit(__atomic_base<_ITp>* __a, _ITp __i,
bdc05efb 973 memory_order __m) noexcept
036e0d4f
BK
974 { return __a->fetch_sub(__i, __m); }
975
976 template<typename _ITp>
977 inline _ITp
978 atomic_fetch_sub_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,
bdc05efb 979 memory_order __m) noexcept
036e0d4f
BK
980 { return __a->fetch_sub(__i, __m); }
981
982 template<typename _ITp>
983 inline _ITp
984 atomic_fetch_and_explicit(__atomic_base<_ITp>* __a, _ITp __i,
bdc05efb 985 memory_order __m) noexcept
036e0d4f
BK
986 { return __a->fetch_and(__i, __m); }
987
988 template<typename _ITp>
989 inline _ITp
990 atomic_fetch_and_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,
bdc05efb 991 memory_order __m) noexcept
036e0d4f
BK
992 { return __a->fetch_and(__i, __m); }
993
994 template<typename _ITp>
995 inline _ITp
996 atomic_fetch_or_explicit(__atomic_base<_ITp>* __a, _ITp __i,
bdc05efb 997 memory_order __m) noexcept
036e0d4f
BK
998 { return __a->fetch_or(__i, __m); }
999
1000 template<typename _ITp>
1001 inline _ITp
1002 atomic_fetch_or_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,
bdc05efb 1003 memory_order __m) noexcept
036e0d4f
BK
1004 { return __a->fetch_or(__i, __m); }
1005
1006 template<typename _ITp>
1007 inline _ITp
1008 atomic_fetch_xor_explicit(__atomic_base<_ITp>* __a, _ITp __i,
bdc05efb 1009 memory_order __m) noexcept
036e0d4f
BK
1010 { return __a->fetch_xor(__i, __m); }
1011
1012 template<typename _ITp>
1013 inline _ITp
1014 atomic_fetch_xor_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,
bdc05efb 1015 memory_order __m) noexcept
036e0d4f
BK
1016 { return __a->fetch_xor(__i, __m); }
1017
50ce8d3d 1018 template<typename _ITp>
afd88205 1019 inline _ITp
bdc05efb 1020 atomic_fetch_add(__atomic_base<_ITp>* __a, _ITp __i) noexcept
50ce8d3d
BK
1021 { return atomic_fetch_add_explicit(__a, __i, memory_order_seq_cst); }
1022
94a86be0
BK
1023 template<typename _ITp>
1024 inline _ITp
bdc05efb 1025 atomic_fetch_add(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
94a86be0
BK
1026 { return atomic_fetch_add_explicit(__a, __i, memory_order_seq_cst); }
1027
50ce8d3d 1028 template<typename _ITp>
afd88205 1029 inline _ITp
bdc05efb 1030 atomic_fetch_sub(__atomic_base<_ITp>* __a, _ITp __i) noexcept
50ce8d3d
BK
1031 { return atomic_fetch_sub_explicit(__a, __i, memory_order_seq_cst); }
1032
94a86be0
BK
1033 template<typename _ITp>
1034 inline _ITp
bdc05efb 1035 atomic_fetch_sub(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
94a86be0
BK
1036 { return atomic_fetch_sub_explicit(__a, __i, memory_order_seq_cst); }
1037
50ce8d3d 1038 template<typename _ITp>
afd88205 1039 inline _ITp
bdc05efb 1040 atomic_fetch_and(__atomic_base<_ITp>* __a, _ITp __i) noexcept
50ce8d3d
BK
1041 { return atomic_fetch_and_explicit(__a, __i, memory_order_seq_cst); }
1042
94a86be0
BK
1043 template<typename _ITp>
1044 inline _ITp
bdc05efb 1045 atomic_fetch_and(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
94a86be0
BK
1046 { return atomic_fetch_and_explicit(__a, __i, memory_order_seq_cst); }
1047
50ce8d3d 1048 template<typename _ITp>
afd88205 1049 inline _ITp
bdc05efb 1050 atomic_fetch_or(__atomic_base<_ITp>* __a, _ITp __i) noexcept
50ce8d3d
BK
1051 { return atomic_fetch_or_explicit(__a, __i, memory_order_seq_cst); }
1052
94a86be0
BK
1053 template<typename _ITp>
1054 inline _ITp
bdc05efb 1055 atomic_fetch_or(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
94a86be0
BK
1056 { return atomic_fetch_or_explicit(__a, __i, memory_order_seq_cst); }
1057
50ce8d3d 1058 template<typename _ITp>
afd88205 1059 inline _ITp
bdc05efb 1060 atomic_fetch_xor(__atomic_base<_ITp>* __a, _ITp __i) noexcept
50ce8d3d 1061 { return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); }
d466a7e2 1062
94a86be0
BK
1063 template<typename _ITp>
1064 inline _ITp
bdc05efb 1065 atomic_fetch_xor(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
94a86be0
BK
1066 { return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); }
1067
036e0d4f
BK
1068
1069 // Partial specializations for pointers.
1070 template<typename _ITp>
1071 inline _ITp*
1072 atomic_fetch_add_explicit(atomic<_ITp*>* __a, ptrdiff_t __d,
bdc05efb 1073 memory_order __m) noexcept
036e0d4f
BK
1074 { return __a->fetch_add(__d, __m); }
1075
1076 template<typename _ITp>
1077 inline _ITp*
1078 atomic_fetch_add_explicit(volatile atomic<_ITp*>* __a, ptrdiff_t __d,
bdc05efb 1079 memory_order __m) noexcept
036e0d4f
BK
1080 { return __a->fetch_add(__d, __m); }
1081
1082 template<typename _ITp>
1083 inline _ITp*
bdc05efb 1084 atomic_fetch_add(volatile atomic<_ITp*>* __a, ptrdiff_t __d) noexcept
036e0d4f
BK
1085 { return __a->fetch_add(__d); }
1086
1087 template<typename _ITp>
1088 inline _ITp*
bdc05efb 1089 atomic_fetch_add(atomic<_ITp*>* __a, ptrdiff_t __d) noexcept
036e0d4f
BK
1090 { return __a->fetch_add(__d); }
1091
1092 template<typename _ITp>
1093 inline _ITp*
1094 atomic_fetch_sub_explicit(volatile atomic<_ITp*>* __a,
bdc05efb 1095 ptrdiff_t __d, memory_order __m) noexcept
036e0d4f
BK
1096 { return __a->fetch_sub(__d, __m); }
1097
1098 template<typename _ITp>
1099 inline _ITp*
1100 atomic_fetch_sub_explicit(atomic<_ITp*>* __a, ptrdiff_t __d,
bdc05efb 1101 memory_order __m) noexcept
036e0d4f
BK
1102 { return __a->fetch_sub(__d, __m); }
1103
1104 template<typename _ITp>
1105 inline _ITp*
bdc05efb 1106 atomic_fetch_sub(volatile atomic<_ITp*>* __a, ptrdiff_t __d) noexcept
036e0d4f
BK
1107 { return __a->fetch_sub(__d); }
1108
1109 template<typename _ITp>
1110 inline _ITp*
bdc05efb 1111 atomic_fetch_sub(atomic<_ITp*>* __a, ptrdiff_t __d) noexcept
036e0d4f 1112 { return __a->fetch_sub(__d); }
5b9daa7e
BK
1113 // @} group atomics
1114
12ffa228
BK
1115_GLIBCXX_END_NAMESPACE_VERSION
1116} // namespace
d466a7e2
BK
1117
1118#endif