7#include "utility/module.hpp"
15hi_warning_ignore_msvc(26403);
17namespace hi::inline
v1 {
24 auto expected = lhs.load(order);
25 while (expected < rhs) {
26 if (lhs.compare_exchange_weak(expected, rhs, order)) {
38 auto expected = lhs.load(order);
39 while (rhs < expected) {
40 if (lhs.compare_exchange_weak(expected, rhs, order)) {
48class atomic_unique_ptr {
50 using element_type = T;
54 ~atomic_unique_ptr()
noexcept
56 delete _pointer.load(std::memory_order_relaxed);
59 constexpr atomic_unique_ptr()
noexcept =
default;
60 atomic_unique_ptr(atomic_unique_ptr
const &) =
delete;
61 atomic_unique_ptr &operator=(atomic_unique_ptr
const &) =
delete;
63 atomic_unique_ptr(atomic_unique_ptr &&other) noexcept : _pointer(other._pointer.exchange(
nullptr)) {}
65 atomic_unique_ptr &operator=(atomic_unique_ptr &&other)
noexcept
67 hi_return_on_self_assignment(other);
69 delete _pointer.exchange(other._pointer.exchange(
nullptr));
73 constexpr atomic_unique_ptr(
std::nullptr_t) noexcept : _pointer(
nullptr) {}
77 delete _pointer.exchange(
nullptr);
81 constexpr atomic_unique_ptr(
pointer other) noexcept : _pointer(other) {}
83 atomic_unique_ptr &operator=(
pointer other)
noexcept
85 delete _pointer.exchange(other);
91 [[nodiscard]]
pointer get(std::memory_order order = std::memory_order::seq_cst)
const noexcept
93 return _pointer.load(order);
107 template<
typename... Args>
110 auto expected = _pointer.load(std::memory_order::acquire);
111 if (expected !=
nullptr) {
116 if (not _pointer.compare_exchange_strong(expected, desired, std::memory_order::release, std::memory_order::acquire)) {
DOXYGEN BUG.
Definition algorithm.hpp:13
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:22
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:36
reference get_or_make(Args &&...args) noexcept
Get or make an object.
Definition atomic.hpp:108
pointer get(std::memory_order order=std::memory_order::seq_cst) const noexcept
Get the raw pointer.
Definition atomic.hpp:91
Definition concepts.hpp:36
Definition concepts.hpp:39