7#include "architecture.hpp"
17T fetch_max(
std::atomic<T> &lhs, T rhs, std::memory_order order)
noexcept
19 auto expected = lhs.load(order);
20 while (expected < rhs) {
21 if (lhs.compare_exchange_weak(expected, rhs, order)) {
31T fetch_min(
std::atomic<T> &lhs, T rhs, std::memory_order order)
noexcept
33 auto expected = lhs.load(order);
34 while (rhs < expected) {
35 if (lhs.compare_exchange_weak(expected, rhs, order)) {
45 using element_type = T;
51 delete _pointer.
load(std::memory_order_relaxed);
61 tt_return_on_self_assignment(other);
63 delete _pointer.
exchange(other._pointer.exchange(
nullptr));
85 [[nodiscard]]
pointer get(std::memory_order order = std::memory_order::seq_cst)
const noexcept
87 return _pointer.
load(order);
101 template<
typename... Args>
104 auto expected = _pointer.
load(std::memory_order::acquire);
105 if (expected !=
nullptr) {
109 auto desired =
new element_type(std::forward<Args>(args)...);
110 if (not _pointer.
compare_exchange_strong(expected, desired, std::memory_order::release, std::memory_order::acquire)) {
reference get_or_make(Args &&... args) noexcept
Get or make an object.
Definition atomic.hpp:102
pointer get(std::memory_order order=std::memory_order::seq_cst) const noexcept
Get the raw pointer.
Definition atomic.hpp:85
Definition concepts.hpp:34
Definition concepts.hpp:37
T compare_exchange_strong(T... args)