18 #include <libcopp/utils/config/libcopp_build_features.h>
26 #ifndef __STDC_LIMIT_MACROS
27 # define _UNDEF__STDC_LIMIT_MACROS
28 # define __STDC_LIMIT_MACROS
30 #ifndef __STDC_CONSTANT_MACROS
31 # define _UNDEF__STDC_CONSTANT_MACROS
32 # define __STDC_CONSTANT_MACROS
36 #ifdef _UNDEF__STDC_LIMIT_MACROS
37 # undef __STDC_LIMIT_MACROS
38 # undef _UNDEF__STDC_LIMIT_MACROS
40 #ifdef _UNDEF__STDC_CONSTANT_MACROS
41 # undef __STDC_CONSTANT_MACROS
42 # undef _UNDEF__STDC_CONSTANT_MACROS
45 #if (defined(__cplusplus) && __cplusplus >= 201103L)
47 #elif defined(_MSVC_LANG) && _MSVC_LANG >= 201402L
51 #if (defined(__cplusplus) && __cplusplus >= 201103L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
54 # define __LIBCOPP_UTIL_LOCK_ATOMIC_INT_TYPE_ATOMIC_STD
56 #elif defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 1)) && \
57 __cplusplus >= 201103L
60 # define __LIBCOPP_UTIL_LOCK_ATOMIC_INT_TYPE_ATOMIC_STD
62 #elif defined(_MSC_VER) && \
66 # define __LIBCOPP_UTIL_LOCK_ATOMIC_INT_TYPE_ATOMIC_STD
85 LIBCOPP_COPP_NAMESPACE_BEGIN
88 #ifdef __LIBCOPP_UTIL_LOCK_ATOMIC_INT_TYPE_ATOMIC_STD
97 # define LIBCOPP_UTIL_LOCK_ATOMIC_THREAD_FENCE(order) ::std::atomic_thread_fence(order)
98 # define LIBCOPP_UTIL_LOCK_ATOMIC_SIGNAL_FENCE(order) ::std::atomic_signal_fence(order)
106 template <
typename Ty =
int>
112 ::std::atomic<value_type> data_;
126 data_.
store(desired, order);
131 data_.store(desired, order);
136 return data_.load(order);
140 volatile LIBCOPP_MACRO_NOEXCEPT {
141 return data_.load(order);
144 inline operator value_type()
const LIBCOPP_MACRO_NOEXCEPT {
return load(); }
145 inline operator value_type()
const volatile LIBCOPP_MACRO_NOEXCEPT {
return load(); }
156 inline value_type operator++() LIBCOPP_MACRO_NOEXCEPT {
return ++data_; }
157 inline value_type operator++()
volatile LIBCOPP_MACRO_NOEXCEPT {
return ++data_; }
158 inline value_type operator++(
int) LIBCOPP_MACRO_NOEXCEPT {
return data_++; }
159 inline value_type operator++(
int)
volatile LIBCOPP_MACRO_NOEXCEPT {
return data_++; }
160 inline value_type operator--() LIBCOPP_MACRO_NOEXCEPT {
return --data_; }
161 inline value_type operator--()
volatile LIBCOPP_MACRO_NOEXCEPT {
return --data_; }
162 inline value_type operator--(
int) LIBCOPP_MACRO_NOEXCEPT {
return data_--; }
163 inline value_type operator--(
int)
volatile LIBCOPP_MACRO_NOEXCEPT {
return data_--; }
168 return data_.exchange(desired, order);
174 return data_.exchange(desired, order);
177 inline bool compare_exchange_weak(
180 return data_.compare_exchange_weak(expected, desired, success, failure);
182 inline bool compare_exchange_weak(
185 return data_.compare_exchange_weak(expected, desired, success, failure);
191 LIBCOPP_MACRO_NOEXCEPT {
192 return data_.compare_exchange_weak(expected, desired, order);
194 inline bool compare_exchange_weak(
198 return data_.compare_exchange_weak(expected, desired, order);
201 inline bool compare_exchange_strong(
204 return data_.compare_exchange_strong(expected, desired, success, failure);
206 inline bool compare_exchange_strong(
209 return data_.compare_exchange_strong(expected, desired, success, failure);
215 LIBCOPP_MACRO_NOEXCEPT {
216 return data_.compare_exchange_strong(expected, desired, order);
218 inline bool compare_exchange_strong(
222 return data_.compare_exchange_strong(expected, desired, order);
228 return data_.fetch_add(arg, order);
233 return data_.fetch_add(arg, order);
239 return data_.fetch_sub(arg, order);
244 return data_.fetch_sub(arg, order);
250 return data_.fetch_and(arg, order);
255 return data_.fetch_and(arg, order);
261 return data_.fetch_or(arg, order);
266 return data_.fetch_or(arg, order);
272 return data_.fetch_xor(arg, order);
277 return data_.fetch_xor(arg, order);
282 # if defined(__clang__)
283 # if !defined(__GCC_ATOMIC_INT_LOCK_FREE) && \
284 (!defined(__GNUC__) || __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1))
285 # error clang version is too old
287 # if defined(__GCC_ATOMIC_INT_LOCK_FREE)
289 # define __LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC 1
292 # define __LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC 1
294 # elif defined(__GNUC__) || defined(__INTEL_COMPILER)
295 # if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1))
296 # error gcc version must be greater or equal than 4.1
298 # if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1100
299 # error intel compiler version must be greater or equal than 11.0
301 # if defined(__GCC_ATOMIC_INT_LOCK_FREE)
303 # define __LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC 1
306 # define __LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC 1
309 # error currently only gcc, msvc, intel compiler & llvm-clang are supported
312 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
322 # define LIBCOPP_UTIL_LOCK_ATOMIC_THREAD_FENCE(order) __atomic_thread_fence(order)
323 # define LIBCOPP_UTIL_LOCK_ATOMIC_SIGNAL_FENCE(order) __atomic_signal_fence(order)
336 # ifndef LIBCOPP_UTIL_LOCK_ATOMIC_THREAD_FENCE
337 # define LIBCOPP_UTIL_LOCK_ATOMIC_THREAD_FENCE(x)
340 # ifndef LIBCOPP_UTIL_LOCK_ATOMIC_SIGNAL_FENCE
341 # define LIBCOPP_UTIL_LOCK_ATOMIC_SIGNAL_FENCE(x)
344 template <
typename Ty =
int>
365 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
366 __atomic_store_n(&data_, desired, order);
368 __sync_lock_test_and_set(&data_, desired);
375 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
376 __atomic_store_n(&data_, desired, order);
378 __sync_lock_test_and_set(&data_, desired);
384 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
385 return __atomic_load_n(&data_, order);
387 __sync_synchronize();
394 volatile LIBCOPP_MACRO_NOEXCEPT {
395 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
396 return __atomic_load_n(&data_, order);
398 __sync_synchronize();
427 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
428 return __atomic_exchange_n(&data_, desired, order);
431 while (!__sync_bool_compare_and_swap(&data_, old_value, desired)) {
442 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
443 return __atomic_exchange_n(&data_, desired, order);
446 while (!__sync_bool_compare_and_swap(&data_, old_value, desired)) {
456 LIBCOPP_MACRO_NOEXCEPT {
457 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
458 return __atomic_compare_exchange_n(&data_, &expected, desired,
true, success, failure);
460 if (__sync_bool_compare_and_swap(&data_, expected, desired)) {
472 failure)
volatile LIBCOPP_MACRO_NOEXCEPT {
473 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
474 return __atomic_compare_exchange_n(&data_, &expected, desired,
true, success, failure);
476 if (__sync_bool_compare_and_swap(&data_, expected, desired)) {
488 LIBCOPP_MACRO_NOEXCEPT {
489 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
490 return __atomic_compare_exchange_n(&data_, &expected, desired,
true, order, order);
492 if (__sync_bool_compare_and_swap(&data_, expected, desired)) {
505 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
506 return __atomic_compare_exchange_n(&data_, &expected, desired,
true, order, order);
508 if (__sync_bool_compare_and_swap(&data_, expected, desired)) {
520 LIBCOPP_MACRO_NOEXCEPT {
521 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
522 return __atomic_compare_exchange_n(&data_, &expected, desired,
false, success, failure);
524 if (__sync_bool_compare_and_swap(&data_, expected, desired)) {
536 failure)
volatile LIBCOPP_MACRO_NOEXCEPT {
537 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
538 return __atomic_compare_exchange_n(&data_, &expected, desired,
false, success, failure);
540 if (__sync_bool_compare_and_swap(&data_, expected, desired)) {
552 LIBCOPP_MACRO_NOEXCEPT {
553 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
554 return __atomic_compare_exchange_n(&data_, &expected, desired,
false, order, order);
556 if (__sync_bool_compare_and_swap(&data_, expected, desired)) {
569 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
570 return __atomic_compare_exchange_n(&data_, &expected, desired,
false, order, order);
572 if (__sync_bool_compare_and_swap(&data_, expected, desired)) {
584 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
585 return __atomic_fetch_add(&data_, arg, order);
587 return __sync_fetch_and_add(&data_, arg);
593 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
594 return __atomic_fetch_add(&data_, arg, order);
596 return __sync_fetch_and_add(&data_, arg);
603 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
604 return __atomic_fetch_sub(&data_, arg, order);
606 return __sync_fetch_and_sub(&data_, arg);
612 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
613 return __atomic_fetch_sub(&data_, arg, order);
615 return __sync_fetch_and_sub(&data_, arg);
622 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
623 return __atomic_fetch_and(&data_, arg, order);
625 return __sync_fetch_and_and(&data_, arg);
631 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
632 return __atomic_fetch_and(&data_, arg, order);
634 return __sync_fetch_and_and(&data_, arg);
641 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
642 return __atomic_fetch_or(&data_, arg, order);
644 return __sync_fetch_and_or(&data_, arg);
650 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
651 return __atomic_fetch_or(&data_, arg, order);
653 return __sync_fetch_and_or(&data_, arg);
660 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
661 return __atomic_fetch_xor(&data_, arg, order);
663 return __sync_fetch_and_xor(&data_, arg);
669 # if defined(__LIBCOPP_UTIL_LOCK_ATOMIC_INT_ATOMIC_GCC_ATOMIC)
670 return __atomic_fetch_xor(&data_, arg, order);
672 return __sync_fetch_and_xor(&data_, arg);
680 template <
typename Ty =
int>
685 template <
typename Ty>
719 volatile LIBCOPP_MACRO_NOEXCEPT {
775 LIBCOPP_MACRO_NOEXCEPT {
776 return cas(expected, desired);
781 failure)
volatile LIBCOPP_MACRO_NOEXCEPT {
782 return cas(expected, desired);
788 LIBCOPP_MACRO_NOEXCEPT {
789 return cas(expected, desired);
795 return cas(expected, desired);
801 LIBCOPP_MACRO_NOEXCEPT {
802 return cas(expected, desired);
807 failure)
volatile LIBCOPP_MACRO_NOEXCEPT {
808 return cas(expected, desired);
814 LIBCOPP_MACRO_NOEXCEPT {
815 return cas(expected, desired);
821 return cas(expected, desired);
901 LIBCOPP_COPP_NAMESPACE_END
value_type operator++() volatile LIBCOPP_MACRO_NOEXCEPT
atomic_int_type(const atomic_int_type &)=delete
bool compare_exchange_strong(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
value_type operator--() LIBCOPP_MACRO_NOEXCEPT
value_type operator=(value_type desired) LIBCOPP_MACRO_NOEXCEPT
value_type operator++(int) LIBCOPP_MACRO_NOEXCEPT
value_type fetch_xor(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
bool cas(value_type &expected, value_type desired) LIBCOPP_MACRO_NOEXCEPT
value_type operator--() volatile LIBCOPP_MACRO_NOEXCEPT
value_type fetch_add(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
atomic_int_type & operator=(const atomic_int_type &) volatile=delete
value_type fetch_sub(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
value_type fetch_add(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
void store(value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
value_type fetch_or(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
value_type operator++() LIBCOPP_MACRO_NOEXCEPT
atomic_int_type & operator=(const atomic_int_type &)=delete
value_type fetch_or(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
atomic_int_type(value_type desired)
bool compare_exchange_strong(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
value_type operator--(int) volatile LIBCOPP_MACRO_NOEXCEPT
value_type fetch_and(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
value_type exchange(value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
value_type operator--(int) LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_weak(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order success, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order failure) LIBCOPP_MACRO_NOEXCEPT
value_type load(EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) const volatile LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_weak(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order success, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order failure) volatile LIBCOPP_MACRO_NOEXCEPT
value_type fetch_xor(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
value_type fetch_sub(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
value_type fetch_and(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_weak(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_strong(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order success, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order failure) volatile LIBCOPP_MACRO_NOEXCEPT
value_type operator=(value_type desired) volatile LIBCOPP_MACRO_NOEXCEPT
value_type operator++(int) volatile LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_weak(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
void store(value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
typename unsafe_int_type< Ty >::value_type value_type
bool compare_exchange_strong(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order success, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order failure) LIBCOPP_MACRO_NOEXCEPT
value_type exchange(value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
value_type load(EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) const LIBCOPP_MACRO_NOEXCEPT
value_type fetch_xor(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
value_type operator++(int) LIBCOPP_MACRO_NOEXCEPT
value_type load(EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) const LIBCOPP_MACRO_NOEXCEPT
atomic_int_type & operator=(const atomic_int_type &)=delete
value_type fetch_or(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
void store(value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_strong(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order success, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order failure) volatile LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_strong(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order success, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order failure) LIBCOPP_MACRO_NOEXCEPT
value_type operator=(value_type desired) LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_strong(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
value_type fetch_and(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
value_type operator++(int) volatile LIBCOPP_MACRO_NOEXCEPT
atomic_int_type(value_type desired) LIBCOPP_MACRO_NOEXCEPT
atomic_int_type() LIBCOPP_MACRO_NOEXCEPT
value_type fetch_xor(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
value_type fetch_sub(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_strong(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
value_type fetch_add(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
value_type operator++() volatile LIBCOPP_MACRO_NOEXCEPT
value_type exchange(value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
atomic_int_type & operator=(const atomic_int_type &) volatile=delete
value_type fetch_or(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
value_type fetch_sub(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
value_type operator--() volatile LIBCOPP_MACRO_NOEXCEPT
value_type fetch_add(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_weak(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order success, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order failure) LIBCOPP_MACRO_NOEXCEPT
value_type fetch_and(value_type arg, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
atomic_int_type(const atomic_int_type &)=delete
value_type operator--() LIBCOPP_MACRO_NOEXCEPT
value_type operator--(int) LIBCOPP_MACRO_NOEXCEPT
void store(value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
value_type exchange(value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
value_type operator++() LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_weak(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) volatile LIBCOPP_MACRO_NOEXCEPT
volatile value_type data_
value_type operator--(int) volatile LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_weak(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order success, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order failure) volatile LIBCOPP_MACRO_NOEXCEPT
value_type operator=(value_type desired) volatile LIBCOPP_MACRO_NOEXCEPT
bool compare_exchange_weak(value_type &expected, value_type desired, EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) LIBCOPP_MACRO_NOEXCEPT
value_type load(EXPLICIT_UNUSED_ATTR LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order order=LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_seq_cst) const volatile LIBCOPP_MACRO_NOEXCEPT
导入继承关系约束 Licensed under the MIT licenses.
#define EXPLICIT_UNUSED_ATTR
maybe_unused, 标记忽略unused警告 usage: EXPLICIT_UNUSED_ATTR int a; class EXPLICIT_UNUSED_ATTR a; EXPLICIT_...
#define COPP_LIKELY_IF(...)
std::shared_ptr< cli::cmd_option_value > value_type