13requires((concepts::Enum<T> || concepts::Arithmetic<T> || concepts::Pointer<T>) &&
sizeof(
T) <=
sizeof(
void*))
20 constexpr auto adjust_delta(DeltaType value) -> DeltaType {
22 return value *
sizeof(**m_pointer);
31 constexpr explicit AtomicRef(T& value) : m_pointer(
util::addressof(value)) {}
59 if (*m_pointer == expected) {
63 expected = *m_pointer;
66 return __atomic_compare_exchange_n(m_pointer, util::addressof(expected), desired,
true,
80 if (*m_pointer == expected) {
84 expected = *m_pointer;
87 return __atomic_compare_exchange_n(m_pointer, util::addressof(expected), desired,
false,
103 auto result = *m_pointer;
104 *m_pointer += adjust_delta(delta);
114 auto result = *m_pointer;
115 *m_pointer -= adjust_delta(delta);
125 auto result = *m_pointer;
136 auto result = *m_pointer;
147 auto result = *m_pointer;
155 T* m_pointer {
nullptr };
Definition atomic_ref.h:14
constexpr auto compare_exchange_weak(T &expected, T desired, MemoryOrder order=MemoryOrder::SequentialConsistency) -> bool
Definition atomic_ref.h:70
constexpr auto compare_exchange_strong(T &expected, T desired, MemoryOrder success, MemoryOrder failure) -> bool
Definition atomic_ref.h:78
constexpr AtomicRef(T &value)
Definition atomic_ref.h:31
auto operator=(AtomicRef const &) -> AtomicRef &=delete
AtomicRef(AtomicRef const &)=default
constexpr auto load(MemoryOrder order=MemoryOrder::SequentialConsistency) const -> T
Definition atomic_ref.h:43
constexpr auto fetch_add(DeltaType delta, MemoryOrder order=MemoryOrder::SequentialConsistency) -> T requires(concepts::Integral< T >||concepts::Pointer< T >)
Definition atomic_ref.h:99
constexpr auto fetch_or(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) -> T requires(concepts::Integral< T >)
Definition atomic_ref.h:132
constexpr auto fetch_xor(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) -> T requires(concepts::Integral< T >)
Definition atomic_ref.h:143
constexpr auto compare_exchange_strong(T &expected, T desired, MemoryOrder order=MemoryOrder::SequentialConsistency) -> bool
Definition atomic_ref.h:91
constexpr auto compare_exchange_weak(T &expected, T desired, MemoryOrder success, MemoryOrder failure) -> bool
Definition atomic_ref.h:57
constexpr void store(T value, MemoryOrder order=MemoryOrder::SequentialConsistency)
Definition atomic_ref.h:35
constexpr auto exchange(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) -> T
Definition atomic_ref.h:50
constexpr auto fetch_and(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) -> T requires(concepts::Integral< T >)
Definition atomic_ref.h:121
constexpr auto fetch_sub(DeltaType delta, MemoryOrder order=MemoryOrder::SequentialConsistency) -> T requires(concepts::Integral< T >||concepts::Pointer< T >)
Definition atomic_ref.h:110
Definition language.h:224
MemoryOrder
Definition memory_order.h:6
@ SequentialConsistency
Definition memory_order.h:12
@ AcquireRelease
Definition memory_order.h:11
@ Acquire
Definition memory_order.h:9
@ Release
Definition memory_order.h:10
std::ptrdiff_t ptrdiff_t
Definition ptrdiff_t.h:12
constexpr auto to_underlying
Definition to_underlying.h:15
Definition zstring_parser.h:9
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8