32 #ifndef _GLIBCXX_ATOMIC
33 #define _GLIBCXX_ATOMIC 1
35 #pragma GCC system_header
37 #if __cplusplus < 201103L
43 namespace std _GLIBCXX_VISIBILITY(default)
45 _GLIBCXX_BEGIN_NAMESPACE_VERSION
66 constexpr
atomic_bool(
bool __i) noexcept : _M_base(__i) { }
69 operator=(
bool __i) noexcept
70 {
return _M_base.operator=(__i); }
72 operator bool()
const noexcept
73 {
return _M_base.load(); }
75 operator bool()
const volatile noexcept
76 {
return _M_base.load(); }
79 is_lock_free()
const noexcept {
return _M_base.is_lock_free(); }
82 is_lock_free()
const volatile noexcept {
return _M_base.is_lock_free(); }
85 store(
bool __i,
memory_order __m = memory_order_seq_cst) noexcept
86 { _M_base.store(__i, __m); }
89 store(
bool __i,
memory_order __m = memory_order_seq_cst)
volatile noexcept
90 { _M_base.store(__i, __m); }
93 load(
memory_order __m = memory_order_seq_cst)
const noexcept
94 {
return _M_base.load(__m); }
97 load(
memory_order __m = memory_order_seq_cst)
const volatile noexcept
98 {
return _M_base.load(__m); }
101 exchange(
bool __i,
memory_order __m = memory_order_seq_cst) noexcept
102 {
return _M_base.exchange(__i, __m); }
106 memory_order __m = memory_order_seq_cst)
volatile noexcept
107 {
return _M_base.exchange(__i, __m); }
110 compare_exchange_weak(
bool& __i1,
bool __i2,
memory_order __m1,
112 {
return _M_base.compare_exchange_weak(__i1, __i2, __m1, __m2); }
115 compare_exchange_weak(
bool& __i1,
bool __i2,
memory_order __m1,
117 {
return _M_base.compare_exchange_weak(__i1, __i2, __m1, __m2); }
120 compare_exchange_weak(
bool& __i1,
bool __i2,
122 {
return _M_base.compare_exchange_weak(__i1, __i2, __m); }
125 compare_exchange_weak(
bool& __i1,
bool __i2,
126 memory_order __m = memory_order_seq_cst)
volatile noexcept
127 {
return _M_base.compare_exchange_weak(__i1, __i2, __m); }
130 compare_exchange_strong(
bool& __i1,
bool __i2,
memory_order __m1,
132 {
return _M_base.compare_exchange_strong(__i1, __i2, __m1, __m2); }
135 compare_exchange_strong(
bool& __i1,
bool __i2,
memory_order __m1,
137 {
return _M_base.compare_exchange_strong(__i1, __i2, __m1, __m2); }
140 compare_exchange_strong(
bool& __i1,
bool __i2,
142 {
return _M_base.compare_exchange_strong(__i1, __i2, __m); }
145 compare_exchange_strong(
bool& __i1,
bool __i2,
146 memory_order __m = memory_order_seq_cst)
volatile noexcept
147 {
return _M_base.compare_exchange_strong(__i1, __i2, __m); }
156 template<
typename _Tp>
163 atomic() noexcept =
default;
164 ~
atomic() noexcept =
default;
169 constexpr
atomic(_Tp __i) noexcept : _M_i(__i) { }
171 operator _Tp()
const noexcept
174 operator _Tp()
const volatile noexcept
178 operator=(_Tp __i) noexcept
179 { store(__i);
return __i; }
182 operator=(_Tp __i)
volatile noexcept
183 { store(__i);
return __i; }
186 is_lock_free()
const noexcept
187 {
return __atomic_is_lock_free(
sizeof(_M_i),
nullptr); }
190 is_lock_free()
const volatile noexcept
191 {
return __atomic_is_lock_free(
sizeof(_M_i),
nullptr); }
194 store(_Tp __i,
memory_order _m = memory_order_seq_cst) noexcept
195 { __atomic_store(&_M_i, &__i, _m); }
198 store(_Tp __i,
memory_order _m = memory_order_seq_cst)
volatile noexcept
199 { __atomic_store(&_M_i, &__i, _m); }
202 load(
memory_order _m = memory_order_seq_cst)
const noexcept
205 __atomic_load(&_M_i, &tmp, _m);
210 load(
memory_order _m = memory_order_seq_cst)
const volatile noexcept
213 __atomic_load(&_M_i, &tmp, _m);
218 exchange(_Tp __i,
memory_order _m = memory_order_seq_cst) noexcept
221 __atomic_exchange(&_M_i, &__i, &tmp, _m);
227 memory_order _m = memory_order_seq_cst)
volatile noexcept
230 __atomic_exchange(&_M_i, &__i, &tmp, _m);
235 compare_exchange_weak(_Tp& __e, _Tp __i,
memory_order __s,
238 return __atomic_compare_exchange(&_M_i, &__e, &__i,
true, __s, __f);
242 compare_exchange_weak(_Tp& __e, _Tp __i,
memory_order __s,
245 return __atomic_compare_exchange(&_M_i, &__e, &__i,
true, __s, __f);
249 compare_exchange_weak(_Tp& __e, _Tp __i,
251 {
return compare_exchange_weak(__e, __i, __m, __m); }
254 compare_exchange_weak(_Tp& __e, _Tp __i,
255 memory_order __m = memory_order_seq_cst)
volatile noexcept
256 {
return compare_exchange_weak(__e, __i, __m, __m); }
259 compare_exchange_strong(_Tp& __e, _Tp __i,
memory_order __s,
262 return __atomic_compare_exchange(&_M_i, &__e, &__i,
false, __s, __f);
266 compare_exchange_strong(_Tp& __e, _Tp __i,
memory_order __s,
269 return __atomic_compare_exchange(&_M_i, &__e, &__i,
false, __s, __f);
273 compare_exchange_strong(_Tp& __e, _Tp __i,
275 {
return compare_exchange_strong(__e, __i, __m, __m); }
278 compare_exchange_strong(_Tp& __e, _Tp __i,
279 memory_order __m = memory_order_seq_cst)
volatile noexcept
280 {
return compare_exchange_strong(__e, __i, __m, __m); }
285 template<
typename _Tp>
288 typedef _Tp* __pointer_type;
292 atomic() noexcept =
default;
293 ~
atomic() noexcept =
default;
298 constexpr
atomic(__pointer_type __p) noexcept : _M_b(__p) { }
300 operator __pointer_type()
const noexcept
301 {
return __pointer_type(_M_b); }
303 operator __pointer_type()
const volatile noexcept
304 {
return __pointer_type(_M_b); }
307 operator=(__pointer_type __p) noexcept
308 {
return _M_b.operator=(__p); }
311 operator=(__pointer_type __p)
volatile noexcept
312 {
return _M_b.operator=(__p); }
315 operator++(
int) noexcept
319 operator++(
int)
volatile noexcept
323 operator--(
int) noexcept
327 operator--(
int)
volatile noexcept
331 operator++() noexcept
335 operator++()
volatile noexcept
339 operator--() noexcept
343 operator--()
volatile noexcept
347 operator+=(ptrdiff_t __d) noexcept
348 {
return _M_b.operator+=(__d); }
351 operator+=(ptrdiff_t __d)
volatile noexcept
352 {
return _M_b.operator+=(__d); }
355 operator-=(ptrdiff_t __d) noexcept
356 {
return _M_b.operator-=(__d); }
359 operator-=(ptrdiff_t __d)
volatile noexcept
360 {
return _M_b.operator-=(__d); }
363 is_lock_free()
const noexcept
364 {
return _M_b.is_lock_free(); }
367 is_lock_free()
const volatile noexcept
368 {
return _M_b.is_lock_free(); }
371 store(__pointer_type __p,
373 {
return _M_b.store(__p, __m); }
376 store(__pointer_type __p,
377 memory_order __m = memory_order_seq_cst)
volatile noexcept
378 {
return _M_b.store(__p, __m); }
381 load(
memory_order __m = memory_order_seq_cst)
const noexcept
382 {
return _M_b.load(__m); }
385 load(
memory_order __m = memory_order_seq_cst)
const volatile noexcept
386 {
return _M_b.load(__m); }
389 exchange(__pointer_type __p,
391 {
return _M_b.exchange(__p, __m); }
394 exchange(__pointer_type __p,
395 memory_order __m = memory_order_seq_cst)
volatile noexcept
396 {
return _M_b.exchange(__p, __m); }
399 compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,
401 {
return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }
404 compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,
407 {
return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }
410 compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,
413 return compare_exchange_weak(__p1, __p2, __m,
414 __cmpexch_failure_order(__m));
418 compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,
419 memory_order __m = memory_order_seq_cst)
volatile noexcept
421 return compare_exchange_weak(__p1, __p2, __m,
422 __cmpexch_failure_order(__m));
426 compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
428 {
return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }
431 compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
434 {
return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); }
437 compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
440 return _M_b.compare_exchange_strong(__p1, __p2, __m,
441 __cmpexch_failure_order(__m));
445 compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2,
446 memory_order __m = memory_order_seq_cst)
volatile noexcept
448 return _M_b.compare_exchange_strong(__p1, __p2, __m,
449 __cmpexch_failure_order(__m));
453 fetch_add(ptrdiff_t __d,
455 {
return _M_b.fetch_add(__d, __m); }
458 fetch_add(ptrdiff_t __d,
459 memory_order __m = memory_order_seq_cst)
volatile noexcept
460 {
return _M_b.fetch_add(__d, __m); }
463 fetch_sub(ptrdiff_t __d,
465 {
return _M_b.fetch_sub(__d, __m); }
468 fetch_sub(ptrdiff_t __d,
469 memory_order __m = memory_order_seq_cst)
volatile noexcept
470 {
return _M_b.fetch_sub(__d, __m); }
478 typedef bool __integral_type;
481 atomic() noexcept =
default;
482 ~
atomic() noexcept =
default;
489 using __base_type::operator __integral_type;
490 using __base_type::operator=;
497 typedef char __integral_type;
500 atomic() noexcept =
default;
501 ~
atomic() noexcept =
default;
508 using __base_type::operator __integral_type;
509 using __base_type::operator=;
516 typedef signed char __integral_type;
519 atomic() noexcept=
default;
520 ~
atomic() noexcept =
default;
527 using __base_type::operator __integral_type;
528 using __base_type::operator=;
535 typedef unsigned char __integral_type;
538 atomic() noexcept=
default;
539 ~
atomic() noexcept =
default;
546 using __base_type::operator __integral_type;
547 using __base_type::operator=;
554 typedef short __integral_type;
557 atomic() noexcept =
default;
558 ~
atomic() noexcept =
default;
565 using __base_type::operator __integral_type;
566 using __base_type::operator=;
573 typedef unsigned short __integral_type;
576 atomic() noexcept =
default;
577 ~
atomic() noexcept =
default;
584 using __base_type::operator __integral_type;
585 using __base_type::operator=;
592 typedef int __integral_type;
595 atomic() noexcept =
default;
596 ~
atomic() noexcept =
default;
603 using __base_type::operator __integral_type;
604 using __base_type::operator=;
611 typedef unsigned int __integral_type;
614 atomic() noexcept =
default;
615 ~
atomic() noexcept =
default;
622 using __base_type::operator __integral_type;
623 using __base_type::operator=;
630 typedef long __integral_type;
633 atomic() noexcept =
default;
634 ~
atomic() noexcept =
default;
641 using __base_type::operator __integral_type;
642 using __base_type::operator=;
649 typedef unsigned long __integral_type;
652 atomic() noexcept =
default;
653 ~
atomic() noexcept =
default;
660 using __base_type::operator __integral_type;
661 using __base_type::operator=;
668 typedef long long __integral_type;
671 atomic() noexcept =
default;
672 ~
atomic() noexcept =
default;
679 using __base_type::operator __integral_type;
680 using __base_type::operator=;
687 typedef unsigned long long __integral_type;
690 atomic() noexcept =
default;
691 ~
atomic() noexcept =
default;
698 using __base_type::operator __integral_type;
699 using __base_type::operator=;
706 typedef wchar_t __integral_type;
709 atomic() noexcept =
default;
710 ~
atomic() noexcept =
default;
717 using __base_type::operator __integral_type;
718 using __base_type::operator=;
725 typedef char16_t __integral_type;
728 atomic() noexcept =
default;
729 ~
atomic() noexcept =
default;
736 using __base_type::operator __integral_type;
737 using __base_type::operator=;
744 typedef char32_t __integral_type;
747 atomic() noexcept =
default;
748 ~
atomic() noexcept =
default;
755 using __base_type::operator __integral_type;
756 using __base_type::operator=;
762 atomic_flag_test_and_set_explicit(
atomic_flag* __a,
764 {
return __a->test_and_set(__m); }
767 atomic_flag_test_and_set_explicit(
volatile atomic_flag* __a,
769 {
return __a->test_and_set(__m); }
772 atomic_flag_clear_explicit(atomic_flag* __a,
memory_order __m) noexcept
776 atomic_flag_clear_explicit(
volatile atomic_flag* __a,
781 atomic_flag_test_and_set(atomic_flag* __a) noexcept
782 {
return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); }
785 atomic_flag_test_and_set(
volatile atomic_flag* __a) noexcept
786 {
return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); }
789 atomic_flag_clear(atomic_flag* __a) noexcept
790 { atomic_flag_clear_explicit(__a, memory_order_seq_cst); }
793 atomic_flag_clear(
volatile atomic_flag* __a) noexcept
794 { atomic_flag_clear_explicit(__a, memory_order_seq_cst); }
798 template<
typename _ITp>
800 atomic_is_lock_free(
const atomic<_ITp>* __a) noexcept
801 {
return __a->is_lock_free(); }
803 template<
typename _ITp>
805 atomic_is_lock_free(
const volatile atomic<_ITp>* __a) noexcept
806 {
return __a->is_lock_free(); }
808 template<
typename _ITp>
810 atomic_init(atomic<_ITp>* __a, _ITp __i) noexcept;
812 template<
typename _ITp>
814 atomic_init(
volatile atomic<_ITp>* __a, _ITp __i) noexcept;
816 template<
typename _ITp>
818 atomic_store_explicit(atomic<_ITp>* __a, _ITp __i,
820 { __a->store(__i, __m); }
822 template<
typename _ITp>
824 atomic_store_explicit(
volatile atomic<_ITp>* __a, _ITp __i,
826 { __a->store(__i, __m); }
828 template<
typename _ITp>
830 atomic_load_explicit(
const atomic<_ITp>* __a,
memory_order __m) noexcept
831 {
return __a->load(__m); }
833 template<
typename _ITp>
835 atomic_load_explicit(
const volatile atomic<_ITp>* __a,
837 {
return __a->load(__m); }
839 template<
typename _ITp>
841 atomic_exchange_explicit(atomic<_ITp>* __a, _ITp __i,
843 {
return __a->exchange(__i, __m); }
845 template<
typename _ITp>
847 atomic_exchange_explicit(
volatile atomic<_ITp>* __a, _ITp __i,
849 {
return __a->exchange(__i, __m); }
851 template<
typename _ITp>
853 atomic_compare_exchange_weak_explicit(atomic<_ITp>* __a,
854 _ITp* __i1, _ITp __i2,
857 {
return __a->compare_exchange_weak(*__i1, __i2, __m1, __m2); }
859 template<
typename _ITp>
861 atomic_compare_exchange_weak_explicit(
volatile atomic<_ITp>* __a,
862 _ITp* __i1, _ITp __i2,
865 {
return __a->compare_exchange_weak(*__i1, __i2, __m1, __m2); }
867 template<
typename _ITp>
869 atomic_compare_exchange_strong_explicit(atomic<_ITp>* __a,
870 _ITp* __i1, _ITp __i2,
873 {
return __a->compare_exchange_strong(*__i1, __i2, __m1, __m2); }
875 template<
typename _ITp>
877 atomic_compare_exchange_strong_explicit(
volatile atomic<_ITp>* __a,
878 _ITp* __i1, _ITp __i2,
881 {
return __a->compare_exchange_strong(*__i1, __i2, __m1, __m2); }
884 template<
typename _ITp>
886 atomic_store(atomic<_ITp>* __a, _ITp __i) noexcept
887 { atomic_store_explicit(__a, __i, memory_order_seq_cst); }
889 template<
typename _ITp>
891 atomic_store(
volatile atomic<_ITp>* __a, _ITp __i) noexcept
892 { atomic_store_explicit(__a, __i, memory_order_seq_cst); }
894 template<
typename _ITp>
896 atomic_load(
const atomic<_ITp>* __a) noexcept
897 {
return atomic_load_explicit(__a, memory_order_seq_cst); }
899 template<
typename _ITp>
901 atomic_load(
const volatile atomic<_ITp>* __a) noexcept
902 {
return atomic_load_explicit(__a, memory_order_seq_cst); }
904 template<
typename _ITp>
906 atomic_exchange(atomic<_ITp>* __a, _ITp __i) noexcept
907 {
return atomic_exchange_explicit(__a, __i, memory_order_seq_cst); }
909 template<
typename _ITp>
911 atomic_exchange(
volatile atomic<_ITp>* __a, _ITp __i) noexcept
912 {
return atomic_exchange_explicit(__a, __i, memory_order_seq_cst); }
914 template<
typename _ITp>
916 atomic_compare_exchange_weak(atomic<_ITp>* __a,
917 _ITp* __i1, _ITp __i2) noexcept
919 return atomic_compare_exchange_weak_explicit(__a, __i1, __i2,
920 memory_order_seq_cst,
921 memory_order_seq_cst);
924 template<
typename _ITp>
926 atomic_compare_exchange_weak(
volatile atomic<_ITp>* __a,
927 _ITp* __i1, _ITp __i2) noexcept
929 return atomic_compare_exchange_weak_explicit(__a, __i1, __i2,
930 memory_order_seq_cst,
931 memory_order_seq_cst);
934 template<
typename _ITp>
936 atomic_compare_exchange_strong(atomic<_ITp>* __a,
937 _ITp* __i1, _ITp __i2) noexcept
939 return atomic_compare_exchange_strong_explicit(__a, __i1, __i2,
940 memory_order_seq_cst,
941 memory_order_seq_cst);
944 template<
typename _ITp>
946 atomic_compare_exchange_strong(
volatile atomic<_ITp>* __a,
947 _ITp* __i1, _ITp __i2) noexcept
949 return atomic_compare_exchange_strong_explicit(__a, __i1, __i2,
950 memory_order_seq_cst,
951 memory_order_seq_cst);
958 template<
typename _ITp>
960 atomic_fetch_add_explicit(__atomic_base<_ITp>* __a, _ITp __i,
962 {
return __a->fetch_add(__i, __m); }
964 template<
typename _ITp>
966 atomic_fetch_add_explicit(
volatile __atomic_base<_ITp>* __a, _ITp __i,
968 {
return __a->fetch_add(__i, __m); }
970 template<
typename _ITp>
972 atomic_fetch_sub_explicit(__atomic_base<_ITp>* __a, _ITp __i,
974 {
return __a->fetch_sub(__i, __m); }
976 template<
typename _ITp>
978 atomic_fetch_sub_explicit(
volatile __atomic_base<_ITp>* __a, _ITp __i,
980 {
return __a->fetch_sub(__i, __m); }
982 template<
typename _ITp>
984 atomic_fetch_and_explicit(__atomic_base<_ITp>* __a, _ITp __i,
986 {
return __a->fetch_and(__i, __m); }
988 template<
typename _ITp>
990 atomic_fetch_and_explicit(
volatile __atomic_base<_ITp>* __a, _ITp __i,
992 {
return __a->fetch_and(__i, __m); }
994 template<
typename _ITp>
996 atomic_fetch_or_explicit(__atomic_base<_ITp>* __a, _ITp __i,
998 {
return __a->fetch_or(__i, __m); }
1000 template<
typename _ITp>
1002 atomic_fetch_or_explicit(
volatile __atomic_base<_ITp>* __a, _ITp __i,
1004 {
return __a->fetch_or(__i, __m); }
1006 template<
typename _ITp>
1008 atomic_fetch_xor_explicit(__atomic_base<_ITp>* __a, _ITp __i,
1010 {
return __a->fetch_xor(__i, __m); }
1012 template<
typename _ITp>
1014 atomic_fetch_xor_explicit(
volatile __atomic_base<_ITp>* __a, _ITp __i,
1016 {
return __a->fetch_xor(__i, __m); }
1018 template<
typename _ITp>
1020 atomic_fetch_add(__atomic_base<_ITp>* __a, _ITp __i) noexcept
1021 {
return atomic_fetch_add_explicit(__a, __i, memory_order_seq_cst); }
1023 template<
typename _ITp>
1025 atomic_fetch_add(
volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
1026 {
return atomic_fetch_add_explicit(__a, __i, memory_order_seq_cst); }
1028 template<
typename _ITp>
1030 atomic_fetch_sub(__atomic_base<_ITp>* __a, _ITp __i) noexcept
1031 {
return atomic_fetch_sub_explicit(__a, __i, memory_order_seq_cst); }
1033 template<
typename _ITp>
1035 atomic_fetch_sub(
volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
1036 {
return atomic_fetch_sub_explicit(__a, __i, memory_order_seq_cst); }
1038 template<
typename _ITp>
1040 atomic_fetch_and(__atomic_base<_ITp>* __a, _ITp __i) noexcept
1041 {
return atomic_fetch_and_explicit(__a, __i, memory_order_seq_cst); }
1043 template<
typename _ITp>
1045 atomic_fetch_and(
volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
1046 {
return atomic_fetch_and_explicit(__a, __i, memory_order_seq_cst); }
1048 template<
typename _ITp>
1050 atomic_fetch_or(__atomic_base<_ITp>* __a, _ITp __i) noexcept
1051 {
return atomic_fetch_or_explicit(__a, __i, memory_order_seq_cst); }
1053 template<
typename _ITp>
1055 atomic_fetch_or(
volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
1056 {
return atomic_fetch_or_explicit(__a, __i, memory_order_seq_cst); }
1058 template<
typename _ITp>
1060 atomic_fetch_xor(__atomic_base<_ITp>* __a, _ITp __i) noexcept
1061 {
return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); }
1063 template<
typename _ITp>
1065 atomic_fetch_xor(
volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept
1066 {
return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); }
1070 template<
typename _ITp>
1072 atomic_fetch_add_explicit(atomic<_ITp*>* __a, ptrdiff_t __d,
1074 {
return __a->fetch_add(__d, __m); }
1076 template<
typename _ITp>
1078 atomic_fetch_add_explicit(
volatile atomic<_ITp*>* __a, ptrdiff_t __d,
1080 {
return __a->fetch_add(__d, __m); }
1082 template<
typename _ITp>
1084 atomic_fetch_add(
volatile atomic<_ITp*>* __a, ptrdiff_t __d) noexcept
1085 {
return __a->fetch_add(__d); }
1087 template<
typename _ITp>
1089 atomic_fetch_add(atomic<_ITp*>* __a, ptrdiff_t __d) noexcept
1090 {
return __a->fetch_add(__d); }
1092 template<
typename _ITp>
1094 atomic_fetch_sub_explicit(
volatile atomic<_ITp*>* __a,
1096 {
return __a->fetch_sub(__d, __m); }
1098 template<
typename _ITp>
1100 atomic_fetch_sub_explicit(atomic<_ITp*>* __a, ptrdiff_t __d,
1102 {
return __a->fetch_sub(__d, __m); }
1104 template<
typename _ITp>
1106 atomic_fetch_sub(
volatile atomic<_ITp*>* __a, ptrdiff_t __d) noexcept
1107 {
return __a->fetch_sub(__d); }
1109 template<
typename _ITp>
1111 atomic_fetch_sub(atomic<_ITp*>* __a, ptrdiff_t __d) noexcept
1112 {
return __a->fetch_sub(__d); }
1115 _GLIBCXX_END_NAMESPACE_VERSION