Iros
 
Loading...
Searching...
No Matches
atomic.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/meta/core.h"
4#include "di/meta/language.h"
5#include "di/meta/util.h"
8#include "di/types/prelude.h"
9#include "di/util/addressof.h"
11
12namespace di::sync {
13template<typename T>
14requires((concepts::Enum<T> || concepts::Arithmetic<T> || concepts::Pointer<T>) && sizeof(T) <= sizeof(void*))
15class Atomic {
16private:
18
19 template<concepts::RemoveCVRefSameAs<Atomic> Self>
20 constexpr auto as_ref(this Self&& self) {
22 }
23
24public:
25 Atomic() = default;
26 Atomic(Atomic const&) = delete;
27
28 constexpr explicit Atomic(T value) : m_value(value) {}
29
30 auto operator=(Atomic const&) -> Atomic& = delete;
31 auto operator=(Atomic const&) volatile -> Atomic& = delete;
32
33 constexpr void store(T value, MemoryOrder order = MemoryOrder::SequentialConsistency) {
34 return as_ref().store(value, order);
35 }
36 constexpr void store(T value, MemoryOrder order = MemoryOrder::SequentialConsistency) volatile {
37 return as_ref().store(value, order);
38 }
39
40 constexpr auto load(MemoryOrder order = MemoryOrder::SequentialConsistency) const -> T {
41 return as_ref().load(order);
42 }
43 constexpr auto load(MemoryOrder order = MemoryOrder::SequentialConsistency) const volatile -> T {
44 return as_ref().load(order);
45 }
46
47 constexpr auto exchange(T value, MemoryOrder order = MemoryOrder::SequentialConsistency) -> T {
48 return as_ref().exchange(value, order);
49 }
50 constexpr auto exchange(T value, MemoryOrder order = MemoryOrder::SequentialConsistency) volatile -> T {
51 return as_ref().exchange(value, order);
52 }
53
54 constexpr auto compare_exchange_weak(T& expected, T desired, MemoryOrder success, MemoryOrder failure) -> bool {
55 return as_ref().compare_exchange_weak(expected, desired, success, failure);
56 }
57 constexpr auto compare_exchange_weak(T& expected, T desired, MemoryOrder success, MemoryOrder failure) volatile
58 -> bool {
59 return as_ref().compare_exchange_weak(expected, desired, success, failure);
60 }
61
62 constexpr auto compare_exchange_weak(T& expected, T desired, MemoryOrder order = MemoryOrder::SequentialConsistency)
63 -> bool {
64 return as_ref().compare_exchange_weak(expected, desired, order);
65 }
66 constexpr auto compare_exchange_weak(T& expected, T desired,
67 MemoryOrder order = MemoryOrder::SequentialConsistency) volatile -> bool {
68 return as_ref().compare_exchange_weak(expected, desired, order);
69 }
70
71 constexpr auto compare_exchange_strong(T& expected, T desired, MemoryOrder success, MemoryOrder failure) -> bool {
72 return as_ref().compare_exchange_strong(expected, desired, success, failure);
73 }
74 constexpr auto compare_exchange_strong(T& expected, T desired, MemoryOrder success, MemoryOrder failure) volatile
75 -> bool {
76 return as_ref().compare_exchange_strong(expected, desired, success, failure);
77 }
78
79 constexpr auto compare_exchange_strong(T& expected, T desired,
81 return as_ref().compare_exchange_strong(expected, desired, order);
82 }
83 constexpr auto compare_exchange_strong(T& expected, T desired,
84 MemoryOrder order = MemoryOrder::SequentialConsistency) volatile -> bool {
85 return as_ref().compare_exchange_strong(expected, desired, order);
86 }
87
88 constexpr auto fetch_add(DeltaType delta, MemoryOrder order = MemoryOrder::SequentialConsistency) -> T
90 {
91 return as_ref().fetch_add(delta, order);
92 }
93 constexpr auto fetch_add(DeltaType delta, MemoryOrder order = MemoryOrder::SequentialConsistency) volatile -> T
95 {
96 return as_ref().fetch_add(delta, order);
97 }
98
99 constexpr auto fetch_sub(DeltaType delta, MemoryOrder order = MemoryOrder::SequentialConsistency) -> T
101 {
102 return as_ref().fetch_sub(delta, order);
103 }
104 constexpr auto fetch_sub(DeltaType delta, MemoryOrder order = MemoryOrder::SequentialConsistency) volatile -> T
106 {
107 return as_ref().fetch_sub(delta, order);
108 }
109
110 constexpr auto fetch_and(T value, MemoryOrder order = MemoryOrder::SequentialConsistency) -> T
111 requires(concepts::Integral<T>)
112 {
113 return as_ref().fetch_and(value, order);
114 }
115 constexpr auto fetch_and(T value, MemoryOrder order = MemoryOrder::SequentialConsistency) volatile -> T
116 requires(concepts::Integral<T>)
117 {
118 return as_ref().fetch_and(value, order);
119 }
120
121 constexpr auto fetch_or(T value, MemoryOrder order = MemoryOrder::SequentialConsistency) -> T
122 requires(concepts::Integral<T>)
123 {
124 return as_ref().fetch_or(value, order);
125 }
126 constexpr auto fetch_or(T value, MemoryOrder order = MemoryOrder::SequentialConsistency) volatile -> T
127 requires(concepts::Integral<T>)
128 {
129 return as_ref().fetch_or(value, order);
130 }
131
132 constexpr auto fetch_xor(T value, MemoryOrder order = MemoryOrder::SequentialConsistency) -> T
133 requires(concepts::Integral<T>)
134 {
135 return as_ref().fetch_xor(value, order);
136 }
137 constexpr auto fetch_xor(T value, MemoryOrder order = MemoryOrder::SequentialConsistency) volatile -> T
138 requires(concepts::Integral<T>)
139 {
140 return as_ref().fetch_xor(value, order);
141 }
142
143private:
144 T m_value;
145};
146}
147
148namespace di {
149using sync::Atomic;
150}
Definition atomic_ref.h:14
auto operator=(Atomic const &) -> Atomic &=delete
constexpr auto compare_exchange_weak(T &expected, T desired, MemoryOrder success, MemoryOrder failure) -> bool
Definition atomic.h:54
auto operator=(Atomic const &) volatile -> Atomic &=delete
constexpr auto fetch_sub(DeltaType delta, MemoryOrder order=MemoryOrder::SequentialConsistency) volatile -> T requires(concepts::Integral< T >||concepts::Pointer< T >)
Definition atomic.h:104
Atomic(Atomic const &)=delete
constexpr auto fetch_xor(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) -> T requires(concepts::Integral< T >)
Definition atomic.h:132
constexpr auto fetch_add(DeltaType delta, MemoryOrder order=MemoryOrder::SequentialConsistency) volatile -> T requires(concepts::Integral< T >||concepts::Pointer< T >)
Definition atomic.h:93
constexpr void store(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) volatile
Definition atomic.h:36
constexpr auto exchange(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) volatile -> T
Definition atomic.h:50
constexpr auto fetch_add(DeltaType delta, MemoryOrder order=MemoryOrder::SequentialConsistency) -> T requires(concepts::Integral< T >||concepts::Pointer< T >)
Definition atomic.h:88
constexpr auto compare_exchange_strong(T &expected, T desired, MemoryOrder order=MemoryOrder::SequentialConsistency) volatile -> bool
Definition atomic.h:83
constexpr auto fetch_sub(DeltaType delta, MemoryOrder order=MemoryOrder::SequentialConsistency) -> T requires(concepts::Integral< T >||concepts::Pointer< T >)
Definition atomic.h:99
constexpr auto load(MemoryOrder order=MemoryOrder::SequentialConsistency) const volatile -> T
Definition atomic.h:43
constexpr auto exchange(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) -> T
Definition atomic.h:47
constexpr void store(T value, MemoryOrder order=MemoryOrder::SequentialConsistency)
Definition atomic.h:33
constexpr auto compare_exchange_strong(T &expected, T desired, MemoryOrder success, MemoryOrder failure) -> bool
Definition atomic.h:71
constexpr auto fetch_and(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) -> T requires(concepts::Integral< T >)
Definition atomic.h:110
Atomic()=default
constexpr auto compare_exchange_weak(T &expected, T desired, MemoryOrder order=MemoryOrder::SequentialConsistency) volatile -> bool
Definition atomic.h:66
constexpr Atomic(T value)
Definition atomic.h:28
constexpr auto fetch_and(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) volatile -> T requires(concepts::Integral< T >)
Definition atomic.h:115
constexpr auto load(MemoryOrder order=MemoryOrder::SequentialConsistency) const -> T
Definition atomic.h:40
constexpr auto compare_exchange_weak(T &expected, T desired, MemoryOrder success, MemoryOrder failure) volatile -> bool
Definition atomic.h:57
constexpr auto compare_exchange_strong(T &expected, T desired, MemoryOrder order=MemoryOrder::SequentialConsistency) -> bool
Definition atomic.h:79
constexpr auto fetch_xor(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) volatile -> T requires(concepts::Integral< T >)
Definition atomic.h:137
constexpr auto compare_exchange_strong(T &expected, T desired, MemoryOrder success, MemoryOrder failure) volatile -> bool
Definition atomic.h:74
constexpr auto fetch_or(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) volatile -> T requires(concepts::Integral< T >)
Definition atomic.h:126
constexpr auto compare_exchange_weak(T &expected, T desired, MemoryOrder order=MemoryOrder::SequentialConsistency) -> bool
Definition atomic.h:62
constexpr auto fetch_or(T value, MemoryOrder order=MemoryOrder::SequentialConsistency) -> T requires(concepts::Integral< T >)
Definition atomic.h:121
Definition language.h:235
Definition language.h:259
Definition language.h:224
Definition language.h:61
detail::ConditionalHelper< value, T, U >::Type Conditional
Definition core.h:88
Definition atomic.h:12
MemoryOrder
Definition memory_order.h:6
@ SequentialConsistency
Definition memory_order.h:12
std::ptrdiff_t ptrdiff_t
Definition ptrdiff_t.h:12
Definition zstring_parser.h:9