15hi_warning_ignore_msvc(26403);
17namespace hi::inline v1 {
22T fetch_max(
std::atomic<T> &lhs, T rhs, std::memory_order order)
noexcept
24 auto expected = lhs.load(order);
25 while (expected < rhs) {
26 if (lhs.compare_exchange_weak(expected, rhs, order)) {
36T fetch_min(
std::atomic<T> &lhs, T rhs, std::memory_order order)
noexcept
38 auto expected = lhs.load(order);
39 while (rhs < expected) {
40 if (lhs.compare_exchange_weak(expected, rhs, order)) {
50 using element_type = T;
56 delete _pointer.load(std::memory_order_relaxed);
67 hi_return_on_self_assignment(other);
69 delete _pointer.exchange(other._pointer.exchange(
nullptr));
77 delete _pointer.exchange(
nullptr);
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) {
115 auto desired =
new element_type(std::forward<Args>(args)...);
116 if (not _pointer.compare_exchange_strong(expected, desired, std::memory_order::release, std::memory_order::acquire)) {
Functions and macros for handling architectural difference between compilers, CPUs and operating syst...
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