roo_threads
API Documentation for roo_threads
Loading...
Searching...
No Matches
atomic.h
Go to the documentation of this file.
1#pragma once
2
4
5#ifdef ROO_THREADS_SINGLETHREADED
6
7enum memory_order : int {
8 memory_order_relaxed,
9 memory_order_consume,
10 memory_order_acquire,
11 memory_order_release,
12 memory_order_acq_rel,
13 memory_order_seq_cst
14};
15
16template <typename T>
17struct atomic {
18 using value_type = T;
19
20 public:
21 atomic() = default;
22 ~atomic() noexcept = default;
23 atomic(const atomic&) = delete;
24 atomic& operator=(const atomic&) = delete;
25 atomic& operator=(const atomic&) volatile = delete;
26
27 constexpr atomic(T value) noexcept : value_(value) {}
28
29 operator T() const noexcept { return value_; }
30
31 operator T() const volatile noexcept { return value_; }
32
33 T operator=(T value) noexcept {
34 value_ = value;
35 return value;
36 }
37
38 T operator=(T value) volatile noexcept {
39 value_ = value;
40 return value;
41 }
42
43 bool is_lock_free() const noexcept {
44 return true;
45 }
46
47 bool is_lock_free() const volatile noexcept {
48 return true;
49 }
50
51 void store(T value, memory_order m = memory_order_seq_cst) noexcept {
52 value_ = value;
53 }
54
55 void store(T value,
56 memory_order m = memory_order_seq_cst) volatile noexcept {
57 value_ = value;
58 }
59
60 T load(memory_order m = memory_order_seq_cst) const noexcept {
61 return value_;
62 }
63
64 T load(memory_order m = memory_order_seq_cst) const volatile noexcept {
65 return value_;
66 }
67
68 T exchange(T value, memory_order m = memory_order_seq_cst) noexcept {
69 T tmp = value_;
70 value_ = value;
71 return tmp;
72 }
73
74 private:
75 T value_;
76};
77
78#endif // ROO_THREADS_SINGLETHREADED