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