Cogs.Core
Atomic.h
1#pragma once
2
3#include "../FoundationBase.h"
4
5#if defined(COGS_SINGLETHREADED)
6
7#include <type_traits>
8
9namespace Cogs {
10
13 template<typename T> struct Atomic {
14 constexpr Atomic() noexcept = default;
15 constexpr Atomic(T t) noexcept : value(t) {}
16 Atomic(const Atomic<T>&) = delete;
17
19 Atomic& operator=(const Atomic<T>&) = delete;
20
22 constexpr T operator=(const T value) noexcept {
23 this->value = value;
24 return value;
25 }
26
28 constexpr T exchange(T desired) noexcept
29 {
30 T current = value;
31 value = desired;
32 return current;
33 }
34
36 constexpr T load() const noexcept { return value; }
37
39 void store(T desired) noexcept { value = desired; }
40
42 constexpr T fetch_add(const T incr) noexcept { T temp = value; value += incr; return temp; }
43
45 constexpr T fetch_sub(const T incr) noexcept { T temp = value; value -= incr; return temp; }
46
48 template <typename Integer, typename = std::enable_if_t<std::is_integral<Integer>::value>>
49 constexpr T fetch_and(Integer incr) noexcept { T temp = value; value &= incr; return temp; }
50
52 template <typename Integer, typename = std::enable_if_t<std::is_integral<Integer>::value>>
53 constexpr T fetch_or(Integer incr) noexcept { T temp = value; value |= incr; return temp; }
54
56 template <typename Integer, typename = std::enable_if_t<std::is_integral<Integer>::value>>
57 constexpr T fetch_xor(Integer incr) noexcept { T temp = value; value ^= incr; return temp; }
58
59 // ---- Operators
60
62 constexpr T operator++() noexcept { return ++value; }
63
65 constexpr T operator--() noexcept { return --value; }
66
68 constexpr T operator++(int) noexcept { T temp = value++; return temp; }
69
71 constexpr T operator--(int) noexcept { T temp = value--; return temp; }
72
74 constexpr Atomic& operator+=(T i) noexcept { value += i; return *this; }
75
77 constexpr Atomic& operator-=(T i) noexcept { value -= i; return *this; }
78
79 // ---- Bitwice operators
80
82 template <typename Integer, typename = std::enable_if_t<std::is_integral<Integer>::value>>
83 constexpr T operator&=(Integer arg) noexcept { value &= arg; return value; }
84
86 template <typename Integer, typename = std::enable_if_t<std::is_integral<Integer>::value>>
87 constexpr T operator|=(Integer arg) noexcept { value |= arg; return value; }
88
90 template <typename Integer, typename = std::enable_if_t<std::is_integral<Integer>::value>>
91 constexpr T operator^=(Integer arg) noexcept { value ^= arg; return value; }
92
93 constexpr operator T() const noexcept { return value; }
94
95 private:
96 T value = {};
97 };
98
99}
100
101#else
102
103#include <atomic>
104
105namespace Cogs {
106
107 template<typename T> using Atomic = std::atomic<T>;
108
109}
110
111#endif
CPUFeature & operator|=(CPUFeature &lhs, CPUFeature rhs)
Bitmask convenience operator.
Definition: Features.h:86
CPUFeature & operator&=(CPUFeature &lhs, CPUFeature rhs)
Bitmask convenience operator.
Definition: Features.h:99
Contains all Cogs related functionality.
Definition: FieldSetter.h:23