URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libitm/] [local_atomic] - Rev 737
Compare with Previous | Blame | View Log
// -*- C++ -*- header.// Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.//// This file is part of the GNU ISO C++ Library. This library is free// software; you can redistribute it and/or modify it under the// terms of the GNU General Public License as published by the// Free Software Foundation; either version 3, or (at your option)// any later version.// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// Under Section 7 of GPL version 3, you are granted additional// permissions described in the GCC Runtime Library Exception, version// 3.1, as published by the Free Software Foundation.// You should have received a copy of the GNU General Public License and// a copy of the GCC Runtime Library Exception along with this program;// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see// <http://www.gnu.org/licenses/>.// ????????????????????????????????????????????????????????????????????//// This is a copy of the libstdc++ header, with the trivial modification// of ignoring the c++config.h include. If and when the top-level build is// fixed so that target libraries can be built using the newly built, we can// delete this file.//// ????????????????????????????????????????????????????????????????????/** @file include/atomic* This is a Standard C++ Library header.*/// Based on "C++ Atomic Types and Operations" by Hans Boehm and Lawrence Crowl.// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html#ifndef _GLIBCXX_ATOMIC#define _GLIBCXX_ATOMIC 1// #pragma GCC system_header// #ifndef __GXX_EXPERIMENTAL_CXX0X__// # include <bits/c++0x_warning.h>// #endif// #include <bits/atomic_base.h>namespace std // _GLIBCXX_VISIBILITY(default){// _GLIBCXX_BEGIN_NAMESPACE_VERSION/*** @defgroup atomics Atomics** Components for performing atomic operations.* @{*//// Enumeration for memory_ordertypedef enum memory_order{memory_order_relaxed,memory_order_consume,memory_order_acquire,memory_order_release,memory_order_acq_rel,memory_order_seq_cst} memory_order;inline memory_order__calculate_memory_order(memory_order __m) noexcept{const bool __cond1 = __m == memory_order_release;const bool __cond2 = __m == memory_order_acq_rel;memory_order __mo1(__cond1 ? memory_order_relaxed : __m);memory_order __mo2(__cond2 ? memory_order_acquire : __mo1);return __mo2;}inline voidatomic_thread_fence(memory_order __m) noexcept{__atomic_thread_fence (__m);}inline voidatomic_signal_fence(memory_order __m) noexcept{__atomic_thread_fence (__m);}/// kill_dependencytemplate<typename _Tp>inline _Tpkill_dependency(_Tp __y) noexcept{_Tp __ret(__y);return __ret;}/// Lock-free Property#define ATOMIC_BOOL_LOCK_FREE __GCC_ATOMIC_BOOL_LOCK_FREE#define ATOMIC_CHAR_LOCK_FREE __GCC_ATOMIC_CHAR_LOCK_FREE#define ATOMIC_WCHAR_T_LOCK_FREE __GCC_ATOMIC_WCHAR_T_LOCK_FREE#define ATOMIC_CHAR16_T_LOCK_FREE __GCC_ATOMIC_CHAR16_T_LOCK_FREE#define ATOMIC_CHAR32_T_LOCK_FREE __GCC_ATOMIC_CHAR32_T_LOCK_FREE#define ATOMIC_SHORT_LOCK_FREE __GCC_ATOMIC_SHORT_LOCK_FREE#define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE#define ATOMIC_LONG_LOCK_FREE __GCC_ATOMIC_LONG_LOCK_FREE#define ATOMIC_LLONG_LOCK_FREE __GCC_ATOMIC_LLONG_LOCK_FREE#define ATOMIC_POINTER_LOCK_FREE __GCC_ATOMIC_POINTER_LOCK_FREE// Base types for atomics.template<typename _IntTp>struct __atomic_base;/// atomic_chartypedef __atomic_base<char> atomic_char;/// atomic_schartypedef __atomic_base<signed char> atomic_schar;/// atomic_uchartypedef __atomic_base<unsigned char> atomic_uchar;/// atomic_shorttypedef __atomic_base<short> atomic_short;/// atomic_ushorttypedef __atomic_base<unsigned short> atomic_ushort;/// atomic_inttypedef __atomic_base<int> atomic_int;/// atomic_uinttypedef __atomic_base<unsigned int> atomic_uint;/// atomic_longtypedef __atomic_base<long> atomic_long;/// atomic_ulongtypedef __atomic_base<unsigned long> atomic_ulong;/// atomic_llongtypedef __atomic_base<long long> atomic_llong;/// atomic_ullongtypedef __atomic_base<unsigned long long> atomic_ullong;/// atomic_wchar_ttypedef __atomic_base<wchar_t> atomic_wchar_t;/// atomic_char16_ttypedef __atomic_base<char16_t> atomic_char16_t;/// atomic_char32_ttypedef __atomic_base<char32_t> atomic_char32_t;/// atomic_char32_ttypedef __atomic_base<char32_t> atomic_char32_t;/// atomic_int_least8_ttypedef __atomic_base<int_least8_t> atomic_int_least8_t;/// atomic_uint_least8_ttypedef __atomic_base<uint_least8_t> atomic_uint_least8_t;/// atomic_int_least16_ttypedef __atomic_base<int_least16_t> atomic_int_least16_t;/// atomic_uint_least16_ttypedef __atomic_base<uint_least16_t> atomic_uint_least16_t;/// atomic_int_least32_ttypedef __atomic_base<int_least32_t> atomic_int_least32_t;/// atomic_uint_least32_ttypedef __atomic_base<uint_least32_t> atomic_uint_least32_t;/// atomic_int_least64_ttypedef __atomic_base<int_least64_t> atomic_int_least64_t;/// atomic_uint_least64_ttypedef __atomic_base<uint_least64_t> atomic_uint_least64_t;/// atomic_int_fast8_ttypedef __atomic_base<int_fast8_t> atomic_int_fast8_t;/// atomic_uint_fast8_ttypedef __atomic_base<uint_fast8_t> atomic_uint_fast8_t;/// atomic_int_fast16_ttypedef __atomic_base<int_fast16_t> atomic_int_fast16_t;/// atomic_uint_fast16_ttypedef __atomic_base<uint_fast16_t> atomic_uint_fast16_t;/// atomic_int_fast32_ttypedef __atomic_base<int_fast32_t> atomic_int_fast32_t;/// atomic_uint_fast32_ttypedef __atomic_base<uint_fast32_t> atomic_uint_fast32_t;/// atomic_int_fast64_ttypedef __atomic_base<int_fast64_t> atomic_int_fast64_t;/// atomic_uint_fast64_ttypedef __atomic_base<uint_fast64_t> atomic_uint_fast64_t;/// atomic_intptr_ttypedef __atomic_base<intptr_t> atomic_intptr_t;/// atomic_uintptr_ttypedef __atomic_base<uintptr_t> atomic_uintptr_t;/// atomic_size_ttypedef __atomic_base<size_t> atomic_size_t;/// atomic_intmax_ttypedef __atomic_base<intmax_t> atomic_intmax_t;/// atomic_uintmax_ttypedef __atomic_base<uintmax_t> atomic_uintmax_t;/// atomic_ptrdiff_ttypedef __atomic_base<ptrdiff_t> atomic_ptrdiff_t;#define ATOMIC_VAR_INIT(_VI) { _VI }template<typename _Tp>struct atomic;template<typename _Tp>struct atomic<_Tp*>;/*** @brief Base type for atomic_flag.** Base type is POD with data, allowing atomic_flag to derive from* it and meet the standard layout type requirement. In addition to* compatibilty with a C interface, this allows different* implementations of atomic_flag to use the same atomic operation* functions, via a standard conversion to the __atomic_flag_base* argument.*/// _GLIBCXX_BEGIN_EXTERN_Cstruct __atomic_flag_base{bool _M_i;};// _GLIBCXX_END_EXTERN_C#define ATOMIC_FLAG_INIT { false }/// atomic_flagstruct atomic_flag : public __atomic_flag_base{atomic_flag() noexcept = default;~atomic_flag() noexcept = default;atomic_flag(const atomic_flag&) = delete;atomic_flag& operator=(const atomic_flag&) = delete;atomic_flag& operator=(const atomic_flag&) volatile = delete;// Conversion to ATOMIC_FLAG_INIT.atomic_flag(bool __i) noexcept : __atomic_flag_base({ __i }) { }booltest_and_set(memory_order __m = memory_order_seq_cst) noexcept{return __atomic_test_and_set (&_M_i, __m);}booltest_and_set(memory_order __m = memory_order_seq_cst) volatile noexcept{return __atomic_test_and_set (&_M_i, __m);}voidclear(memory_order __m = memory_order_seq_cst) noexcept{// __glibcxx_assert(__m != memory_order_consume);// __glibcxx_assert(__m != memory_order_acquire);// __glibcxx_assert(__m != memory_order_acq_rel);__atomic_clear (&_M_i, __m);}voidclear(memory_order __m = memory_order_seq_cst) volatile noexcept{// __glibcxx_assert(__m != memory_order_consume);// __glibcxx_assert(__m != memory_order_acquire);// __glibcxx_assert(__m != memory_order_acq_rel);__atomic_clear (&_M_i, __m);}};/// Base class for atomic integrals.//// For each of the integral types, define atomic_[integral type] struct//// atomic_bool bool// atomic_char char// atomic_schar signed char// atomic_uchar unsigned char// atomic_short short// atomic_ushort unsigned short// atomic_int int// atomic_uint unsigned int// atomic_long long// atomic_ulong unsigned long// atomic_llong long long// atomic_ullong unsigned long long// atomic_char16_t char16_t// atomic_char32_t char32_t// atomic_wchar_t wchar_t//// NB: Assuming _ITp is an integral scalar type that is 1, 2, 4, or// 8 bytes, since that is what GCC built-in functions for atomic// memory access expect.template<typename _ITp>struct __atomic_base{private:typedef _ITp __int_type;__int_type _M_i;public:__atomic_base() noexcept = default;~__atomic_base() noexcept = default;__atomic_base(const __atomic_base&) = delete;__atomic_base& operator=(const __atomic_base&) = delete;__atomic_base& operator=(const __atomic_base&) volatile = delete;// Requires __int_type convertible to _M_i.constexpr __atomic_base(__int_type __i) noexcept : _M_i (__i) { }operator __int_type() const noexcept{ return load(); }operator __int_type() const volatile noexcept{ return load(); }__int_typeoperator=(__int_type __i) noexcept{store(__i);return __i;}__int_typeoperator=(__int_type __i) volatile noexcept{store(__i);return __i;}__int_typeoperator++(int) noexcept{ return fetch_add(1); }__int_typeoperator++(int) volatile noexcept{ return fetch_add(1); }__int_typeoperator--(int) noexcept{ return fetch_sub(1); }__int_typeoperator--(int) volatile noexcept{ return fetch_sub(1); }__int_typeoperator++() noexcept{ return __atomic_add_fetch(&_M_i, 1, memory_order_seq_cst); }__int_typeoperator++() volatile noexcept{ return __atomic_add_fetch(&_M_i, 1, memory_order_seq_cst); }__int_typeoperator--() noexcept{ return __atomic_sub_fetch(&_M_i, 1, memory_order_seq_cst); }__int_typeoperator--() volatile noexcept{ return __atomic_sub_fetch(&_M_i, 1, memory_order_seq_cst); }__int_typeoperator+=(__int_type __i) noexcept{ return __atomic_add_fetch(&_M_i, __i, memory_order_seq_cst); }__int_typeoperator+=(__int_type __i) volatile noexcept{ return __atomic_add_fetch(&_M_i, __i, memory_order_seq_cst); }__int_typeoperator-=(__int_type __i) noexcept{ return __atomic_sub_fetch(&_M_i, __i, memory_order_seq_cst); }__int_typeoperator-=(__int_type __i) volatile noexcept{ return __atomic_sub_fetch(&_M_i, __i, memory_order_seq_cst); }__int_typeoperator&=(__int_type __i) noexcept{ return __atomic_and_fetch(&_M_i, __i, memory_order_seq_cst); }__int_typeoperator&=(__int_type __i) volatile noexcept{ return __atomic_and_fetch(&_M_i, __i, memory_order_seq_cst); }__int_typeoperator|=(__int_type __i) noexcept{ return __atomic_or_fetch(&_M_i, __i, memory_order_seq_cst); }__int_typeoperator|=(__int_type __i) volatile noexcept{ return __atomic_or_fetch(&_M_i, __i, memory_order_seq_cst); }__int_typeoperator^=(__int_type __i) noexcept{ return __atomic_xor_fetch(&_M_i, __i, memory_order_seq_cst); }__int_typeoperator^=(__int_type __i) volatile noexcept{ return __atomic_xor_fetch(&_M_i, __i, memory_order_seq_cst); }boolis_lock_free() const noexcept{ return __atomic_is_lock_free (sizeof (_M_i), &_M_i); }boolis_lock_free() const volatile noexcept{ return __atomic_is_lock_free (sizeof (_M_i), &_M_i); }voidstore(__int_type __i, memory_order __m = memory_order_seq_cst) noexcept{// __glibcxx_assert(__m != memory_order_acquire);// __glibcxx_assert(__m != memory_order_acq_rel);// __glibcxx_assert(__m != memory_order_consume);__atomic_store_n(&_M_i, __i, __m);}voidstore(__int_type __i,memory_order __m = memory_order_seq_cst) volatile noexcept{// __glibcxx_assert(__m != memory_order_acquire);// __glibcxx_assert(__m != memory_order_acq_rel);// __glibcxx_assert(__m != memory_order_consume);__atomic_store_n(&_M_i, __i, __m);}__int_typeload(memory_order __m = memory_order_seq_cst) const noexcept{// __glibcxx_assert(__m != memory_order_release);// __glibcxx_assert(__m != memory_order_acq_rel);return __atomic_load_n(&_M_i, __m);}__int_typeload(memory_order __m = memory_order_seq_cst) const volatile noexcept{// __glibcxx_assert(__m != memory_order_release);// __glibcxx_assert(__m != memory_order_acq_rel);return __atomic_load_n(&_M_i, __m);}__int_typeexchange(__int_type __i,memory_order __m = memory_order_seq_cst) noexcept{return __atomic_exchange_n(&_M_i, __i, __m);}__int_typeexchange(__int_type __i,memory_order __m = memory_order_seq_cst) volatile noexcept{return __atomic_exchange_n(&_M_i, __i, __m);}boolcompare_exchange_weak(__int_type& __i1, __int_type __i2,memory_order __m1, memory_order __m2) noexcept{// __glibcxx_assert(__m2 != memory_order_release);// __glibcxx_assert(__m2 != memory_order_acq_rel);// __glibcxx_assert(__m2 <= __m1);return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 1, __m1, __m2);}boolcompare_exchange_weak(__int_type& __i1, __int_type __i2,memory_order __m1,memory_order __m2) volatile noexcept{// __glibcxx_assert(__m2 != memory_order_release);// __glibcxx_assert(__m2 != memory_order_acq_rel);// __glibcxx_assert(__m2 <= __m1);return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 1, __m1, __m2);}boolcompare_exchange_weak(__int_type& __i1, __int_type __i2,memory_order __m = memory_order_seq_cst) noexcept{return compare_exchange_weak(__i1, __i2, __m,__calculate_memory_order(__m));}boolcompare_exchange_weak(__int_type& __i1, __int_type __i2,memory_order __m = memory_order_seq_cst) volatile noexcept{return compare_exchange_weak(__i1, __i2, __m,__calculate_memory_order(__m));}boolcompare_exchange_strong(__int_type& __i1, __int_type __i2,memory_order __m1, memory_order __m2) noexcept{// __glibcxx_assert(__m2 != memory_order_release);// __glibcxx_assert(__m2 != memory_order_acq_rel);// __glibcxx_assert(__m2 <= __m1);return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 0, __m1, __m2);}boolcompare_exchange_strong(__int_type& __i1, __int_type __i2,memory_order __m1,memory_order __m2) volatile noexcept{// __glibcxx_assert(__m2 != memory_order_release);// __glibcxx_assert(__m2 != memory_order_acq_rel);// __glibcxx_assert(__m2 <= __m1);return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 0, __m1, __m2);}boolcompare_exchange_strong(__int_type& __i1, __int_type __i2,memory_order __m = memory_order_seq_cst) noexcept{return compare_exchange_strong(__i1, __i2, __m,__calculate_memory_order(__m));}boolcompare_exchange_strong(__int_type& __i1, __int_type __i2,memory_order __m = memory_order_seq_cst) volatile noexcept{return compare_exchange_strong(__i1, __i2, __m,__calculate_memory_order(__m));}__int_typefetch_add(__int_type __i,memory_order __m = memory_order_seq_cst) noexcept{ return __atomic_fetch_add(&_M_i, __i, __m); }__int_typefetch_add(__int_type __i,memory_order __m = memory_order_seq_cst) volatile noexcept{ return __atomic_fetch_add(&_M_i, __i, __m); }__int_typefetch_sub(__int_type __i,memory_order __m = memory_order_seq_cst) noexcept{ return __atomic_fetch_sub(&_M_i, __i, __m); }__int_typefetch_sub(__int_type __i,memory_order __m = memory_order_seq_cst) volatile noexcept{ return __atomic_fetch_sub(&_M_i, __i, __m); }__int_typefetch_and(__int_type __i,memory_order __m = memory_order_seq_cst) noexcept{ return __atomic_fetch_and(&_M_i, __i, __m); }__int_typefetch_and(__int_type __i,memory_order __m = memory_order_seq_cst) volatile noexcept{ return __atomic_fetch_and(&_M_i, __i, __m); }__int_typefetch_or(__int_type __i,memory_order __m = memory_order_seq_cst) noexcept{ return __atomic_fetch_or(&_M_i, __i, __m); }__int_typefetch_or(__int_type __i,memory_order __m = memory_order_seq_cst) volatile noexcept{ return __atomic_fetch_or(&_M_i, __i, __m); }__int_typefetch_xor(__int_type __i,memory_order __m = memory_order_seq_cst) noexcept{ return __atomic_fetch_xor(&_M_i, __i, __m); }__int_typefetch_xor(__int_type __i,memory_order __m = memory_order_seq_cst) volatile noexcept{ return __atomic_fetch_xor(&_M_i, __i, __m); }};/// Partial specialization for pointer types.template<typename _PTp>struct __atomic_base<_PTp*>{private:typedef _PTp* __pointer_type;__pointer_type _M_p;public:__atomic_base() noexcept = default;~__atomic_base() noexcept = default;__atomic_base(const __atomic_base&) = delete;__atomic_base& operator=(const __atomic_base&) = delete;__atomic_base& operator=(const __atomic_base&) volatile = delete;// Requires __pointer_type convertible to _M_p.constexpr __atomic_base(__pointer_type __p) noexcept : _M_p (__p) { }operator __pointer_type() const noexcept{ return load(); }operator __pointer_type() const volatile noexcept{ return load(); }__pointer_typeoperator=(__pointer_type __p) noexcept{store(__p);return __p;}__pointer_typeoperator=(__pointer_type __p) volatile noexcept{store(__p);return __p;}__pointer_typeoperator++(int) noexcept{ return fetch_add(1); }__pointer_typeoperator++(int) volatile noexcept{ return fetch_add(1); }__pointer_typeoperator--(int) noexcept{ return fetch_sub(1); }__pointer_typeoperator--(int) volatile noexcept{ return fetch_sub(1); }__pointer_typeoperator++() noexcept{ return __atomic_add_fetch(&_M_p, 1, memory_order_seq_cst); }__pointer_typeoperator++() volatile noexcept{ return __atomic_add_fetch(&_M_p, 1, memory_order_seq_cst); }__pointer_typeoperator--() noexcept{ return __atomic_sub_fetch(&_M_p, 1, memory_order_seq_cst); }__pointer_typeoperator--() volatile noexcept{ return __atomic_sub_fetch(&_M_p, 1, memory_order_seq_cst); }__pointer_typeoperator+=(ptrdiff_t __d) noexcept{ return __atomic_add_fetch(&_M_p, __d, memory_order_seq_cst); }__pointer_typeoperator+=(ptrdiff_t __d) volatile noexcept{ return __atomic_add_fetch(&_M_p, __d, memory_order_seq_cst); }__pointer_typeoperator-=(ptrdiff_t __d) noexcept{ return __atomic_sub_fetch(&_M_p, __d, memory_order_seq_cst); }__pointer_typeoperator-=(ptrdiff_t __d) volatile noexcept{ return __atomic_sub_fetch(&_M_p, __d, memory_order_seq_cst); }boolis_lock_free() const noexcept{ return __atomic_is_lock_free (sizeof (_M_p), &_M_p); }boolis_lock_free() const volatile noexcept{ return __atomic_is_lock_free (sizeof (_M_p), &_M_p); }voidstore(__pointer_type __p,memory_order __m = memory_order_seq_cst) noexcept{// __glibcxx_assert(__m != memory_order_acquire);// __glibcxx_assert(__m != memory_order_acq_rel);// __glibcxx_assert(__m != memory_order_consume);__atomic_store_n(&_M_p, __p, __m);}voidstore(__pointer_type __p,memory_order __m = memory_order_seq_cst) volatile noexcept{// __glibcxx_assert(__m != memory_order_acquire);// __glibcxx_assert(__m != memory_order_acq_rel);// __glibcxx_assert(__m != memory_order_consume);__atomic_store_n(&_M_p, __p, __m);}__pointer_typeload(memory_order __m = memory_order_seq_cst) const noexcept{// __glibcxx_assert(__m != memory_order_release);// __glibcxx_assert(__m != memory_order_acq_rel);return __atomic_load_n(&_M_p, __m);}__pointer_typeload(memory_order __m = memory_order_seq_cst) const volatile noexcept{// __glibcxx_assert(__m != memory_order_release);// __glibcxx_assert(__m != memory_order_acq_rel);return __atomic_load_n(&_M_p, __m);}__pointer_typeexchange(__pointer_type __p,memory_order __m = memory_order_seq_cst) noexcept{return __atomic_exchange_n(&_M_p, __p, __m);}__pointer_typeexchange(__pointer_type __p,memory_order __m = memory_order_seq_cst) volatile noexcept{return __atomic_exchange_n(&_M_p, __p, __m);}boolcompare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,memory_order __m1,memory_order __m2) noexcept{// __glibcxx_assert(__m2 != memory_order_release);// __glibcxx_assert(__m2 != memory_order_acq_rel);// __glibcxx_assert(__m2 <= __m1);return __atomic_compare_exchange_n(&_M_p, &__p1, __p2, 0, __m1, __m2);}boolcompare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,memory_order __m1,memory_order __m2) volatile noexcept{// __glibcxx_assert(__m2 != memory_order_release);// __glibcxx_assert(__m2 != memory_order_acq_rel);// __glibcxx_assert(__m2 <= __m1);return __atomic_compare_exchange_n(&_M_p, &__p1, __p2, 0, __m1, __m2);}__pointer_typefetch_add(ptrdiff_t __d,memory_order __m = memory_order_seq_cst) noexcept{ return __atomic_fetch_add(&_M_p, __d, __m); }__pointer_typefetch_add(ptrdiff_t __d,memory_order __m = memory_order_seq_cst) volatile noexcept{ return __atomic_fetch_add(&_M_p, __d, __m); }__pointer_typefetch_sub(ptrdiff_t __d,memory_order __m = memory_order_seq_cst) noexcept{ return __atomic_fetch_sub(&_M_p, __d, __m); }__pointer_typefetch_sub(ptrdiff_t __d,memory_order __m = memory_order_seq_cst) volatile noexcept{ return __atomic_fetch_sub(&_M_p, __d, __m); }};/*** @addtogroup atomics* @{*//// atomic_bool// NB: No operators or fetch-operations for this type.struct atomic_bool{private:__atomic_base<bool> _M_base;public:atomic_bool() noexcept = default;~atomic_bool() noexcept = default;atomic_bool(const atomic_bool&) = delete;atomic_bool& operator=(const atomic_bool&) = delete;atomic_bool& operator=(const atomic_bool&) volatile = delete;constexpr atomic_bool(bool __i) noexcept : _M_base(__i) { }booloperator=(bool __i) noexcept{ return _M_base.operator=(__i); }operator bool() const noexcept{ return _M_base.load(); }operator bool() const volatile noexcept{ return _M_base.load(); }boolis_lock_free() const noexcept { return _M_base.is_lock_free(); }boolis_lock_free() const volatile noexcept { return _M_base.is_lock_free(); }voidstore(bool __i, memory_order __m = memory_order_seq_cst) noexcept{ _M_base.store(__i, __m); }voidstore(bool __i, memory_order __m = memory_order_seq_cst) volatile noexcept{ _M_base.store(__i, __m); }boolload(memory_order __m = memory_order_seq_cst) const noexcept{ return _M_base.load(__m); }boolload(memory_order __m = memory_order_seq_cst) const volatile noexcept{ return _M_base.load(__m); }boolexchange(bool __i, memory_order __m = memory_order_seq_cst) noexcept{ return _M_base.exchange(__i, __m); }boolexchange(bool __i,memory_order __m = memory_order_seq_cst) volatile noexcept{ return _M_base.exchange(__i, __m); }boolcompare_exchange_weak(bool& __i1, bool __i2, memory_order __m1,memory_order __m2) noexcept{ return _M_base.compare_exchange_weak(__i1, __i2, __m1, __m2); }boolcompare_exchange_weak(bool& __i1, bool __i2, memory_order __m1,memory_order __m2) volatile noexcept{ return _M_base.compare_exchange_weak(__i1, __i2, __m1, __m2); }boolcompare_exchange_weak(bool& __i1, bool __i2,memory_order __m = memory_order_seq_cst) noexcept{ return _M_base.compare_exchange_weak(__i1, __i2, __m); }boolcompare_exchange_weak(bool& __i1, bool __i2,memory_order __m = memory_order_seq_cst) volatile noexcept{ return _M_base.compare_exchange_weak(__i1, __i2, __m); }boolcompare_exchange_strong(bool& __i1, bool __i2, memory_order __m1,memory_order __m2) noexcept{ return _M_base.compare_exchange_strong(__i1, __i2, __m1, __m2); }boolcompare_exchange_strong(bool& __i1, bool __i2, memory_order __m1,memory_order __m2) volatile noexcept{ return _M_base.compare_exchange_strong(__i1, __i2, __m1, __m2); }boolcompare_exchange_strong(bool& __i1, bool __i2,memory_order __m = memory_order_seq_cst) noexcept{ return _M_base.compare_exchange_strong(__i1, __i2, __m); }boolcompare_exchange_strong(bool& __i1, bool __i2,memory_order __m = memory_order_seq_cst) volatile noexcept{ return _M_base.compare_exchange_strong(__i1, __i2, __m); }};/// atomic/// 29.4.3, Generic atomic type, primary class template.template<typename _Tp>struct atomic{private:_Tp _M_i;public:atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(_Tp __i) noexcept : _M_i(__i) { }operator _Tp() const noexcept{ return load(); }operator _Tp() const volatile noexcept{ return load(); }_Tpoperator=(_Tp __i) noexcept{ store(__i); return __i; }_Tpoperator=(_Tp __i) volatile noexcept{ store(__i); return __i; }boolis_lock_free() const noexcept{ return __atomic_is_lock_free(sizeof(_M_i), &_M_i); }boolis_lock_free() const volatile noexcept{ return __atomic_is_lock_free(sizeof(_M_i), &_M_i); }voidstore(_Tp __i, memory_order _m = memory_order_seq_cst) noexcept{ __atomic_store(&_M_i, &__i, _m); }voidstore(_Tp __i, memory_order _m = memory_order_seq_cst) volatile noexcept{ __atomic_store(&_M_i, &__i, _m); }_Tpload(memory_order _m = memory_order_seq_cst) const noexcept{_Tp tmp;__atomic_load(&_M_i, &tmp, _m);return tmp;}_Tpload(memory_order _m = memory_order_seq_cst) const volatile noexcept{_Tp tmp;__atomic_load(&_M_i, &tmp, _m);return tmp;}_Tpexchange(_Tp __i, memory_order _m = memory_order_seq_cst) noexcept{_Tp tmp;__atomic_exchange(&_M_i, &__i, &tmp, _m);return tmp;}_Tpexchange(_Tp __i,memory_order _m = memory_order_seq_cst) volatile noexcept{_Tp tmp;__atomic_exchange(&_M_i, &__i, &tmp, _m);return tmp;}boolcompare_exchange_weak(_Tp& __e, _Tp __i, memory_order __s,memory_order __f) noexcept{return __atomic_compare_exchange(&_M_i, &__e, &__i, true, __s, __f);}boolcompare_exchange_weak(_Tp& __e, _Tp __i, memory_order __s,memory_order __f) volatile noexcept{return __atomic_compare_exchange(&_M_i, &__e, &__i, true, __s, __f);}boolcompare_exchange_weak(_Tp& __e, _Tp __i,memory_order __m = memory_order_seq_cst) noexcept{ return compare_exchange_weak(__e, __i, __m, __m); }boolcompare_exchange_weak(_Tp& __e, _Tp __i,memory_order __m = memory_order_seq_cst) volatile noexcept{ return compare_exchange_weak(__e, __i, __m, __m); }boolcompare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s,memory_order __f) noexcept{return __atomic_compare_exchange(&_M_i, &__e, &__i, false, __s, __f);}boolcompare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s,memory_order __f) volatile noexcept{return __atomic_compare_exchange(&_M_i, &__e, &__i, false, __s, __f);}boolcompare_exchange_strong(_Tp& __e, _Tp __i,memory_order __m = memory_order_seq_cst) noexcept{ return compare_exchange_strong(__e, __i, __m, __m); }boolcompare_exchange_strong(_Tp& __e, _Tp __i,memory_order __m = memory_order_seq_cst) volatile noexcept{ return compare_exchange_strong(__e, __i, __m, __m); }};/// Partial specialization for pointer types.template<typename _Tp>struct atomic<_Tp*>{typedef _Tp* __pointer_type;typedef __atomic_base<_Tp*> __base_type;__base_type _M_b;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__pointer_type __p) noexcept : _M_b(__p) { }operator __pointer_type() const noexcept{ return __pointer_type(_M_b); }operator __pointer_type() const volatile noexcept{ return __pointer_type(_M_b); }__pointer_typeoperator=(__pointer_type __p) noexcept{ return _M_b.operator=(__p); }__pointer_typeoperator=(__pointer_type __p) volatile noexcept{ return _M_b.operator=(__p); }__pointer_typeoperator++(int) noexcept{ return _M_b++; }__pointer_typeoperator++(int) volatile noexcept{ return _M_b++; }__pointer_typeoperator--(int) noexcept{ return _M_b--; }__pointer_typeoperator--(int) volatile noexcept{ return _M_b--; }__pointer_typeoperator++() noexcept{ return ++_M_b; }__pointer_typeoperator++() volatile noexcept{ return ++_M_b; }__pointer_typeoperator--() noexcept{ return --_M_b; }__pointer_typeoperator--() volatile noexcept{ return --_M_b; }__pointer_typeoperator+=(ptrdiff_t __d) noexcept{ return _M_b.operator+=(__d); }__pointer_typeoperator+=(ptrdiff_t __d) volatile noexcept{ return _M_b.operator+=(__d); }__pointer_typeoperator-=(ptrdiff_t __d) noexcept{ return _M_b.operator-=(__d); }__pointer_typeoperator-=(ptrdiff_t __d) volatile noexcept{ return _M_b.operator-=(__d); }boolis_lock_free() const noexcept{ return _M_b.is_lock_free(); }boolis_lock_free() const volatile noexcept{ return _M_b.is_lock_free(); }voidstore(__pointer_type __p,memory_order __m = memory_order_seq_cst) noexcept{ return _M_b.store(__p, __m); }voidstore(__pointer_type __p,memory_order __m = memory_order_seq_cst) volatile noexcept{ return _M_b.store(__p, __m); }__pointer_typeload(memory_order __m = memory_order_seq_cst) const noexcept{ return _M_b.load(__m); }__pointer_typeload(memory_order __m = memory_order_seq_cst) const volatile noexcept{ return _M_b.load(__m); }__pointer_typeexchange(__pointer_type __p,memory_order __m = memory_order_seq_cst) noexcept{ return _M_b.exchange(__p, __m); }__pointer_typeexchange(__pointer_type __p,memory_order __m = memory_order_seq_cst) volatile noexcept{ return _M_b.exchange(__p, __m); }boolcompare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,memory_order __m1, memory_order __m2) noexcept{ return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }boolcompare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,memory_order __m1,memory_order __m2) volatile noexcept{ return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }boolcompare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,memory_order __m = memory_order_seq_cst) noexcept{return compare_exchange_weak(__p1, __p2, __m,__calculate_memory_order(__m));}boolcompare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,memory_order __m = memory_order_seq_cst) volatile noexcept{return compare_exchange_weak(__p1, __p2, __m,__calculate_memory_order(__m));}boolcompare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,memory_order __m1, memory_order __m2) noexcept{ return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }boolcompare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,memory_order __m1,memory_order __m2) volatile noexcept{ return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }boolcompare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,memory_order __m = memory_order_seq_cst) noexcept{return _M_b.compare_exchange_strong(__p1, __p2, __m,__calculate_memory_order(__m));}boolcompare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,memory_order __m = memory_order_seq_cst) volatile noexcept{return _M_b.compare_exchange_strong(__p1, __p2, __m,__calculate_memory_order(__m));}__pointer_typefetch_add(ptrdiff_t __d,memory_order __m = memory_order_seq_cst) noexcept{ return _M_b.fetch_add(__d, __m); }__pointer_typefetch_add(ptrdiff_t __d,memory_order __m = memory_order_seq_cst) volatile noexcept{ return _M_b.fetch_add(__d, __m); }__pointer_typefetch_sub(ptrdiff_t __d,memory_order __m = memory_order_seq_cst) noexcept{ return _M_b.fetch_sub(__d, __m); }__pointer_typefetch_sub(ptrdiff_t __d,memory_order __m = memory_order_seq_cst) volatile noexcept{ return _M_b.fetch_sub(__d, __m); }};/// Explicit specialization for bool.template<>struct atomic<bool> : public atomic_bool{typedef bool __integral_type;typedef atomic_bool __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for char.template<>struct atomic<char> : public atomic_char{typedef char __integral_type;typedef atomic_char __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for signed char.template<>struct atomic<signed char> : public atomic_schar{typedef signed char __integral_type;typedef atomic_schar __base_type;atomic() noexcept= default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for unsigned char.template<>struct atomic<unsigned char> : public atomic_uchar{typedef unsigned char __integral_type;typedef atomic_uchar __base_type;atomic() noexcept= default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for short.template<>struct atomic<short> : public atomic_short{typedef short __integral_type;typedef atomic_short __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for unsigned short.template<>struct atomic<unsigned short> : public atomic_ushort{typedef unsigned short __integral_type;typedef atomic_ushort __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for int.template<>struct atomic<int> : atomic_int{typedef int __integral_type;typedef atomic_int __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for unsigned int.template<>struct atomic<unsigned int> : public atomic_uint{typedef unsigned int __integral_type;typedef atomic_uint __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for long.template<>struct atomic<long> : public atomic_long{typedef long __integral_type;typedef atomic_long __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for unsigned long.template<>struct atomic<unsigned long> : public atomic_ulong{typedef unsigned long __integral_type;typedef atomic_ulong __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for long long.template<>struct atomic<long long> : public atomic_llong{typedef long long __integral_type;typedef atomic_llong __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for unsigned long long.template<>struct atomic<unsigned long long> : public atomic_ullong{typedef unsigned long long __integral_type;typedef atomic_ullong __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for wchar_t.template<>struct atomic<wchar_t> : public atomic_wchar_t{typedef wchar_t __integral_type;typedef atomic_wchar_t __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for char16_t.template<>struct atomic<char16_t> : public atomic_char16_t{typedef char16_t __integral_type;typedef atomic_char16_t __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};/// Explicit specialization for char32_t.template<>struct atomic<char32_t> : public atomic_char32_t{typedef char32_t __integral_type;typedef atomic_char32_t __base_type;atomic() noexcept = default;~atomic() noexcept = default;atomic(const atomic&) = delete;atomic& operator=(const atomic&) = delete;atomic& operator=(const atomic&) volatile = delete;constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { }using __base_type::operator __integral_type;using __base_type::operator=;};// Function definitions, atomic_flag operations.inline boolatomic_flag_test_and_set_explicit(atomic_flag* __a,memory_order __m) noexcept{ return __a->test_and_set(__m); }inline boolatomic_flag_test_and_set_explicit(volatile atomic_flag* __a,memory_order __m) noexcept{ return __a->test_and_set(__m); }inline voidatomic_flag_clear_explicit(atomic_flag* __a, memory_order __m) noexcept{ __a->clear(__m); }inline voidatomic_flag_clear_explicit(volatile atomic_flag* __a,memory_order __m) noexcept{ __a->clear(__m); }inline boolatomic_flag_test_and_set(atomic_flag* __a) noexcept{ return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); }inline boolatomic_flag_test_and_set(volatile atomic_flag* __a) noexcept{ return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); }inline voidatomic_flag_clear(atomic_flag* __a) noexcept{ atomic_flag_clear_explicit(__a, memory_order_seq_cst); }inline voidatomic_flag_clear(volatile atomic_flag* __a) noexcept{ atomic_flag_clear_explicit(__a, memory_order_seq_cst); }// Function templates generally applicable to atomic types.template<typename _ITp>inline boolatomic_is_lock_free(const atomic<_ITp>* __a) noexcept{ return __a->is_lock_free(); }template<typename _ITp>inline boolatomic_is_lock_free(const volatile atomic<_ITp>* __a) noexcept{ return __a->is_lock_free(); }template<typename _ITp>inline voidatomic_init(atomic<_ITp>* __a, _ITp __i) noexcept;template<typename _ITp>inline voidatomic_init(volatile atomic<_ITp>* __a, _ITp __i) noexcept;template<typename _ITp>inline voidatomic_store_explicit(atomic<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ __a->store(__i, __m); }template<typename _ITp>inline voidatomic_store_explicit(volatile atomic<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ __a->store(__i, __m); }template<typename _ITp>inline _ITpatomic_load_explicit(const atomic<_ITp>* __a, memory_order __m) noexcept{ return __a->load(__m); }template<typename _ITp>inline _ITpatomic_load_explicit(const volatile atomic<_ITp>* __a,memory_order __m) noexcept{ return __a->load(__m); }template<typename _ITp>inline _ITpatomic_exchange_explicit(atomic<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ return __a->exchange(__i, __m); }template<typename _ITp>inline _ITpatomic_exchange_explicit(volatile atomic<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ return __a->exchange(__i, __m); }template<typename _ITp>inline boolatomic_compare_exchange_weak_explicit(atomic<_ITp>* __a,_ITp* __i1, _ITp __i2,memory_order __m1,memory_order __m2) noexcept{ return __a->compare_exchange_weak(*__i1, __i2, __m1, __m2); }template<typename _ITp>inline boolatomic_compare_exchange_weak_explicit(volatile atomic<_ITp>* __a,_ITp* __i1, _ITp __i2,memory_order __m1,memory_order __m2) noexcept{ return __a->compare_exchange_weak(*__i1, __i2, __m1, __m2); }template<typename _ITp>inline boolatomic_compare_exchange_strong_explicit(atomic<_ITp>* __a,_ITp* __i1, _ITp __i2,memory_order __m1,memory_order __m2) noexcept{ return __a->compare_exchange_strong(*__i1, __i2, __m1, __m2); }template<typename _ITp>inline boolatomic_compare_exchange_strong_explicit(volatile atomic<_ITp>* __a,_ITp* __i1, _ITp __i2,memory_order __m1,memory_order __m2) noexcept{ return __a->compare_exchange_strong(*__i1, __i2, __m1, __m2); }template<typename _ITp>inline voidatomic_store(atomic<_ITp>* __a, _ITp __i) noexcept{ atomic_store_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline voidatomic_store(volatile atomic<_ITp>* __a, _ITp __i) noexcept{ atomic_store_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_load(const atomic<_ITp>* __a) noexcept{ return atomic_load_explicit(__a, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_load(const volatile atomic<_ITp>* __a) noexcept{ return atomic_load_explicit(__a, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_exchange(atomic<_ITp>* __a, _ITp __i) noexcept{ return atomic_exchange_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_exchange(volatile atomic<_ITp>* __a, _ITp __i) noexcept{ return atomic_exchange_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline boolatomic_compare_exchange_weak(atomic<_ITp>* __a,_ITp* __i1, _ITp __i2) noexcept{return atomic_compare_exchange_weak_explicit(__a, __i1, __i2,memory_order_seq_cst,memory_order_seq_cst);}template<typename _ITp>inline boolatomic_compare_exchange_weak(volatile atomic<_ITp>* __a,_ITp* __i1, _ITp __i2) noexcept{return atomic_compare_exchange_weak_explicit(__a, __i1, __i2,memory_order_seq_cst,memory_order_seq_cst);}template<typename _ITp>inline boolatomic_compare_exchange_strong(atomic<_ITp>* __a,_ITp* __i1, _ITp __i2) noexcept{return atomic_compare_exchange_strong_explicit(__a, __i1, __i2,memory_order_seq_cst,memory_order_seq_cst);}template<typename _ITp>inline boolatomic_compare_exchange_strong(volatile atomic<_ITp>* __a,_ITp* __i1, _ITp __i2) noexcept{return atomic_compare_exchange_strong_explicit(__a, __i1, __i2,memory_order_seq_cst,memory_order_seq_cst);}// Function templates for atomic_integral operations only, using// __atomic_base. Template argument should be constricted to// intergral types as specified in the standard, excluding address// types.template<typename _ITp>inline _ITpatomic_fetch_add_explicit(__atomic_base<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ return __a->fetch_add(__i, __m); }template<typename _ITp>inline _ITpatomic_fetch_add_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ return __a->fetch_add(__i, __m); }template<typename _ITp>inline _ITpatomic_fetch_sub_explicit(__atomic_base<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ return __a->fetch_sub(__i, __m); }template<typename _ITp>inline _ITpatomic_fetch_sub_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ return __a->fetch_sub(__i, __m); }template<typename _ITp>inline _ITpatomic_fetch_and_explicit(__atomic_base<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ return __a->fetch_and(__i, __m); }template<typename _ITp>inline _ITpatomic_fetch_and_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ return __a->fetch_and(__i, __m); }template<typename _ITp>inline _ITpatomic_fetch_or_explicit(__atomic_base<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ return __a->fetch_or(__i, __m); }template<typename _ITp>inline _ITpatomic_fetch_or_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ return __a->fetch_or(__i, __m); }template<typename _ITp>inline _ITpatomic_fetch_xor_explicit(__atomic_base<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ return __a->fetch_xor(__i, __m); }template<typename _ITp>inline _ITpatomic_fetch_xor_explicit(volatile __atomic_base<_ITp>* __a, _ITp __i,memory_order __m) noexcept{ return __a->fetch_xor(__i, __m); }template<typename _ITp>inline _ITpatomic_fetch_add(__atomic_base<_ITp>* __a, _ITp __i) noexcept{ return atomic_fetch_add_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_fetch_add(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept{ return atomic_fetch_add_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_fetch_sub(__atomic_base<_ITp>* __a, _ITp __i) noexcept{ return atomic_fetch_sub_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_fetch_sub(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept{ return atomic_fetch_sub_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_fetch_and(__atomic_base<_ITp>* __a, _ITp __i) noexcept{ return atomic_fetch_and_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_fetch_and(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept{ return atomic_fetch_and_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_fetch_or(__atomic_base<_ITp>* __a, _ITp __i) noexcept{ return atomic_fetch_or_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_fetch_or(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept{ return atomic_fetch_or_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_fetch_xor(__atomic_base<_ITp>* __a, _ITp __i) noexcept{ return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); }template<typename _ITp>inline _ITpatomic_fetch_xor(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept{ return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); }// Partial specializations for pointers.template<typename _ITp>inline _ITp*atomic_fetch_add_explicit(atomic<_ITp*>* __a, ptrdiff_t __d,memory_order __m) noexcept{ return __a->fetch_add(__d, __m); }template<typename _ITp>inline _ITp*atomic_fetch_add_explicit(volatile atomic<_ITp*>* __a, ptrdiff_t __d,memory_order __m) noexcept{ return __a->fetch_add(__d, __m); }template<typename _ITp>inline _ITp*atomic_fetch_add(volatile atomic<_ITp*>* __a, ptrdiff_t __d) noexcept{ return __a->fetch_add(__d); }template<typename _ITp>inline _ITp*atomic_fetch_add(atomic<_ITp*>* __a, ptrdiff_t __d) noexcept{ return __a->fetch_add(__d); }template<typename _ITp>inline _ITp*atomic_fetch_sub_explicit(volatile atomic<_ITp*>* __a,ptrdiff_t __d, memory_order __m) noexcept{ return __a->fetch_sub(__d, __m); }template<typename _ITp>inline _ITp*atomic_fetch_sub_explicit(atomic<_ITp*>* __a, ptrdiff_t __d,memory_order __m) noexcept{ return __a->fetch_sub(__d, __m); }template<typename _ITp>inline _ITp*atomic_fetch_sub(volatile atomic<_ITp*>* __a, ptrdiff_t __d) noexcept{ return __a->fetch_sub(__d); }template<typename _ITp>inline _ITp*atomic_fetch_sub(atomic<_ITp*>* __a, ptrdiff_t __d) noexcept{ return __a->fetch_sub(__d); }// @} group atomics// _GLIBCXX_END_NAMESPACE_VERSION} // namespace#endif
