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