12namespace hi::inline v1 {
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);
62 hi_return_on_self_assignment(other);
64 delete _pointer.exchange(other._pointer.exchange(
nullptr));
72 delete _pointer.exchange(
nullptr);
80 delete _pointer.exchange(other);
86 [[nodiscard]]
pointer get(std::memory_order order = std::memory_order::seq_cst)
const noexcept
88 return _pointer.load(order);
102 template<
typename... Args>
105 auto expected = _pointer.load(std::memory_order::acquire);
106 if (expected !=
nullptr) {
110 auto desired =
new element_type(std::forward<Args>(args)...);
111 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:103
pointer get(std::memory_order order=std::memory_order::seq_cst) const noexcept
Get the raw pointer.
Definition atomic.hpp:86
Definition concepts.hpp:35
Definition concepts.hpp:38