3#include "../FoundationBase.h"
5#if defined(COGS_SINGLETHREADED)
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;
19 Atomic& operator=(
const Atomic<T>&) =
delete;
22 constexpr T operator=(
const T value)
noexcept {
28 constexpr T exchange(
T desired)
noexcept
36 constexpr T load() const noexcept {
return value; }
39 void store(
T desired)
noexcept { value = desired; }
42 constexpr T fetch_add(
const T incr)
noexcept {
T temp = value; value += incr;
return temp; }
45 constexpr T fetch_sub(
const T incr)
noexcept {
T temp = value; value -= incr;
return temp; }
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; }
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; }
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; }
62 constexpr T operator++() noexcept {
return ++value; }
65 constexpr T operator--() noexcept {
return --value; }
68 constexpr T operator++(
int)
noexcept {
T temp = value++;
return temp; }
71 constexpr T operator--(
int)
noexcept {
T temp = value--;
return temp; }
74 constexpr Atomic& operator+=(
T i)
noexcept { value += i;
return *
this; }
77 constexpr Atomic& operator-=(
T i)
noexcept { value -= i;
return *
this; }
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; }
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; }
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; }
93 constexpr operator T() const noexcept {
return value; }
107 template<
typename T>
using Atomic = std::atomic<T>;
FieldFlags & operator|=(FieldFlags &lhs, FieldFlags rhs)
Or assignment operator.
Definition: Field.h:62
Main Cogs namespace.
Definition: MortonCode.h:5
std::atomic< T > Atomic
Definition: Atomic.h:107