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>;
CPUFeature & operator|=(CPUFeature &lhs, CPUFeature rhs)
Bitmask convenience operator.
CPUFeature & operator&=(CPUFeature &lhs, CPUFeature rhs)
Bitmask convenience operator.
Contains all Cogs related functionality.