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