51class atomic_unique_ptr {
53 using element_type = T;
54 using pointer = element_type *;
55 using reference = element_type &;
57 ~atomic_unique_ptr()
noexcept
59 delete _pointer.load(std::memory_order_relaxed);
62 constexpr atomic_unique_ptr()
noexcept =
default;
63 atomic_unique_ptr(atomic_unique_ptr
const &) =
delete;
64 atomic_unique_ptr &operator=(atomic_unique_ptr
const &) =
delete;
66 atomic_unique_ptr(atomic_unique_ptr &&other) noexcept : _pointer(other._pointer.exchange(
nullptr)) {}
68 atomic_unique_ptr &operator=(atomic_unique_ptr &&other)
noexcept
70 hi_return_on_self_assignment(other);
72 delete _pointer.exchange(other._pointer.exchange(
nullptr));
76 constexpr atomic_unique_ptr(
std::nullptr_t) noexcept : _pointer(
nullptr) {}
80 delete _pointer.exchange(
nullptr);
84 constexpr atomic_unique_ptr(pointer other) noexcept : _pointer(other) {}
86 atomic_unique_ptr &operator=(pointer other)
noexcept
88 delete _pointer.exchange(other);
94 [[nodiscard]] pointer
get(std::memory_order order = std::memory_order::seq_cst)
const noexcept
96 return _pointer.load(order);
110 template<
typename... Args>
113 auto expected = _pointer.load(std::memory_order::acquire);
114 if (expected !=
nullptr) {
119 if (not _pointer.compare_exchange_strong(expected, desired, std::memory_order::release, std::memory_order::acquire)) {
T fetch_max(std::atomic< T > &lhs, T rhs, std::memory_order order) noexcept
Lock-free fetch-then-max operation on an atomic.
Definition atomic.hpp:25
T fetch_min(std::atomic< T > &lhs, T rhs, std::memory_order order) noexcept
Lock-free fetch-then-min operation on an atomic.
Definition atomic.hpp:39