Sane C++ Libraries
C++ Platform Abstraction Libraries
Loading...
Searching...
No Matches
Atomic.h
1// Copyright (c) Stefano Cristiano
2// SPDX-License-Identifier: MIT
3#pragma once
4#include "../Foundation/PrimitiveTypes.h"
5
6namespace SC
7{
8#if _MSC_VER
9typedef enum memory_order
10{
11 memory_order_relaxed,
12 memory_order_consume,
13 memory_order_acquire,
14 memory_order_release,
15 memory_order_acq_rel,
16 memory_order_seq_cst
17} memory_order;
18#else
19typedef enum memory_order
20{
21 memory_order_relaxed = __ATOMIC_RELAXED,
22 memory_order_consume = __ATOMIC_CONSUME,
23 memory_order_acquire = __ATOMIC_ACQUIRE,
24 memory_order_release = __ATOMIC_RELEASE,
25 memory_order_acq_rel = __ATOMIC_ACQ_REL,
26 memory_order_seq_cst = __ATOMIC_SEQ_CST
27} memory_order;
28
29#endif
40template <typename T>
41struct Atomic;
42
43template <>
44struct Atomic<int32_t>
45{
46 Atomic(int32_t value = 0);
47
48 int32_t fetch_add(int32_t val, memory_order mem = memory_order_seq_cst);
49 int32_t fetch_sub(int32_t val, memory_order mem = memory_order_seq_cst);
50 int32_t load(memory_order mem = memory_order_seq_cst) const;
51 void store(int32_t desired, memory_order mem = memory_order_seq_cst);
52 int32_t exchange(int32_t desired, memory_order mem = memory_order_seq_cst);
53
54 bool compare_exchange_weak(int32_t& expected, int32_t desired, memory_order success, memory_order failure);
55 bool compare_exchange_strong(int32_t& expected, int32_t desired, memory_order success, memory_order failure);
56 bool compare_exchange_weak(int32_t& expected, int32_t desired, memory_order mem = memory_order_seq_cst);
57 bool compare_exchange_strong(int32_t& expected, int32_t desired, memory_order mem = memory_order_seq_cst);
58
59 // Operators
60 operator int32_t() const;
61 int32_t operator=(int32_t desired);
62 int32_t operator++();
63 int32_t operator++(int);
64 int32_t operator--();
65 int32_t operator--(int);
66
67 private:
68 volatile int32_t value;
69};
70
71template <>
72struct Atomic<bool>
73{
74 Atomic(bool value = false);
75
76 bool exchange(bool desired, memory_order mem = memory_order_seq_cst);
77 void store(bool desired, memory_order mem = memory_order_seq_cst);
78 bool load(memory_order mem = memory_order_seq_cst) const;
79
80 bool compare_exchange_weak(bool& expected, bool desired, memory_order success, memory_order failure);
81 bool compare_exchange_strong(bool& expected, bool desired, memory_order success, memory_order failure);
82 bool compare_exchange_weak(bool& expected, bool desired, memory_order mem = memory_order_seq_cst);
83 bool compare_exchange_strong(bool& expected, bool desired, memory_order mem = memory_order_seq_cst);
84
85 // Operators
86 operator bool() const;
87 bool operator=(bool desired);
88
89 private:
90 volatile bool value;
91};
92
93} // namespace SC
int int32_t
Platform independent (4) bytes signed int.
Definition PrimitiveTypes.h:46
Atomic variables (only for int and bool for now).
Definition Atomic.h:41