FastLED 3.9.15
Loading...
Searching...
No Matches
atomic.h
Go to the documentation of this file.
1#pragma once
2
3#include "fl/thread.h"
4#include "fl/int.h"
5#include "fl/align.h"
6
7#if FASTLED_MULTITHREADED
8#include <atomic>
9#endif
10
11namespace fl {
12
13
14
15#if FASTLED_MULTITHREADED
16template <typename T>
17using atomic = std::atomic<T>;
18#else
19template <typename T> class AtomicFake;
20template <typename T>
22#endif
23
29
31
32template <typename T> class AtomicFake {
33 public:
34 AtomicFake() : mValue{} {}
35 explicit AtomicFake(T value) : mValue(value) {}
36
37 // Non-copyable and non-movable
38 AtomicFake(const AtomicFake&) = delete;
39 AtomicFake& operator=(const AtomicFake&) = delete;
42
43 // Basic atomic operations - fake implementation (not actually atomic)
44 T load() const {
45 return mValue;
46 }
47
48 void store(T value) {
49 mValue = value;
50 }
51
52 T exchange(T value) {
53 T old = mValue;
54 mValue = value;
55 return old;
56 }
57
58 bool compare_exchange_weak(T& expected, T desired) {
59 if (mValue == expected) {
60 mValue = desired;
61 return true;
62 } else {
63 expected = mValue;
64 return false;
65 }
66 }
67
68 bool compare_exchange_strong(T& expected, T desired) {
69 return compare_exchange_weak(expected, desired);
70 }
71
72 // Assignment operator
73 T operator=(T value) {
74 store(value);
75 return value;
76 }
77
78 // Conversion operator
79 operator T() const {
80 return load();
81 }
82
83 // Arithmetic operators (for integral and floating point types)
85 return ++mValue;
86 }
87
88 T operator++(int) {
89 return mValue++;
90 }
91
93 return --mValue;
94 }
95
96 T operator--(int) {
97 return mValue--;
98 }
99
100 T operator+=(T value) {
101 mValue += value;
102 return mValue;
103 }
104
105 T operator-=(T value) {
106 mValue -= value;
107 return mValue;
108 }
109
110 T operator&=(T value) {
111 mValue &= value;
112 return mValue;
113 }
114
115 T operator|=(T value) {
116 mValue |= value;
117 return mValue;
118 }
119
120 T operator^=(T value) {
121 mValue ^= value;
122 return mValue;
123 }
124
125 // Fetch operations
126 T fetch_add(T value) {
127 T old = mValue;
128 mValue += value;
129 return old;
130 }
131
132 T fetch_sub(T value) {
133 T old = mValue;
134 mValue -= value;
135 return old;
136 }
137
138 T fetch_and(T value) {
139 T old = mValue;
140 mValue &= value;
141 return old;
142 }
143
144 T fetch_or(T value) {
145 T old = mValue;
146 mValue |= value;
147 return old;
148 }
149
150 T fetch_xor(T value) {
151 T old = mValue;
152 mValue ^= value;
153 return old;
154 }
155
156 private:
157 FL_ALIGN_AS(T) T mValue;
158};
159
160} // namespace fl
T fetch_xor(T value)
Definition atomic.h:150
T operator++(int)
Definition atomic.h:88
T operator+=(T value)
Definition atomic.h:100
T operator&=(T value)
Definition atomic.h:110
T operator|=(T value)
Definition atomic.h:115
T fetch_and(T value)
Definition atomic.h:138
T fetch_or(T value)
Definition atomic.h:144
AtomicFake(T value)
Definition atomic.h:35
T operator-=(T value)
Definition atomic.h:105
FL_ALIGN_AS(T) T mValue
T fetch_sub(T value)
Definition atomic.h:132
AtomicFake(const AtomicFake &)=delete
T operator--()
Definition atomic.h:92
T operator^=(T value)
Definition atomic.h:120
AtomicFake & operator=(const AtomicFake &)=delete
bool compare_exchange_strong(T &expected, T desired)
Definition atomic.h:68
void store(T value)
Definition atomic.h:48
T operator--(int)
Definition atomic.h:96
bool compare_exchange_weak(T &expected, T desired)
Definition atomic.h:58
T operator=(T value)
Definition atomic.h:73
AtomicFake(AtomicFake &&)=delete
T exchange(T value)
Definition atomic.h:52
T operator++()
Definition atomic.h:84
AtomicFake & operator=(AtomicFake &&)=delete
T load() const
Definition atomic.h:44
T fetch_add(T value)
Definition atomic.h:126
AtomicFake< T > atomic
Definition atomic.h:21
atomic< fl::i32 > atomic_i32
Definition atomic.h:28
atomic< fl::u32 > atomic_u32
Definition atomic.h:27
atomic< unsigned int > atomic_uint
Definition atomic.h:26
atomic< int > atomic_int
Definition atomic.h:25
atomic< bool > atomic_bool
Definition atomic.h:24
IMPORTANT!
Definition crgb.h:20