Github   Telegram
Loading...
Searching...
No Matches
atomic.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <atomic>
7
8USERVER_NAMESPACE_BEGIN
9
10namespace utils {
11
21template <typename T, typename Func>
22T AtomicUpdate(std::atomic<T>& atomic, Func updater) {
23 T old_value = atomic.load();
24 while (true) {
25 // make a copy to to keep old_value unchanged
26 const T new_value = updater(T{old_value});
27 if (atomic.compare_exchange_weak(old_value, new_value)) return new_value;
28 }
29}
30
34template <typename T>
35T AtomicMin(std::atomic<T>& atomic, T value) {
36 return utils::AtomicUpdate(atomic, [value](T old_value) {
37 return value < old_value ? value : old_value;
38 });
39}
40
44template <typename T>
45T AtomicMax(std::atomic<T>& atomic, T value) {
46 return utils::AtomicUpdate(atomic, [value](T old_value) {
47 return old_value < value ? value : old_value;
48 });
49}
50
51} // namespace utils
52
53USERVER_NAMESPACE_END