3 # define __has_builtin(x) 0
6 # define __has_feature(x) 0
8 #ifndef __has_extension
9 # define __has_extension(x) 0
12 #if !__has_extension(c_atomic)
15 #if __has_builtin(__c11_atomic_exchange)
16 # define ATOMIC_BUILTIN(name) __c11_atomic_##name
18 # define ATOMIC_BUILTIN(name) __atomic_##name##_n
24 * C++11 memory orders. We only need a subset of them.
31 acquire = __ATOMIC_ACQUIRE,
36 release = __ATOMIC_RELEASE,
39 * Sequentially consistent memory ordering.
41 seqcst = __ATOMIC_SEQ_CST
45 * Atomic, implements a subset of `std::atomic`.
51 * The underlying value. Use C11 atomic qualification if available.
57 * Constructor, takes a value.
59 atomic(T init) : val(init) {}
62 * Atomically load with the specified memory order.
64 T load(memory_order order = memory_order::seqcst)
66 return ATOMIC_BUILTIN(load)(&val, order);
70 * Atomically store with the specified memory order.
72 void store(T v, memory_order order = memory_order::seqcst)
74 return ATOMIC_BUILTIN(store)(&val, v, order);
78 * Atomically exchange with the specified memory order.
80 T exchange(T v, memory_order order = memory_order::seqcst)
82 return ATOMIC_BUILTIN(exchange)(&val, v, order);
86 * Atomically exchange with the specified memory order.
88 bool compare_exchange(T & expected,
90 memory_order order = memory_order::seqcst)
92 #if __has_builtin(__c11_atomic_compare_exchange_strong)
93 return __c11_atomic_compare_exchange_strong(
94 &val, &expected, desired, order, order);
96 return __atomic_compare_exchange_n(
97 &val, &expected, desired, true, order, order);
102 #undef ATOMIC_BUILTIN