#pragma once #include "deimos/core/base.h" namespace deimos { enum class MemoryOrder : int // NOLINT(*-enum-size) { kRelaxed = __ATOMIC_RELAXED, kAcquire = __ATOMIC_ACQUIRE, kRelease = __ATOMIC_RELEASE, kAcqRel = __ATOMIC_ACQ_REL, kSeqCst = __ATOMIC_SEQ_CST, }; template struct Atomic { T value{}; }; inline void AtomicFence(MemoryOrder order) { __atomic_thread_fence((int)order); } template inline void AtomicStore(Atomic* a, T value, MemoryOrder order = MemoryOrder::kRelaxed) { __atomic_store(&a->value, &value, (int)order); } template inline T AtomicLoad(Atomic* a, MemoryOrder order = MemoryOrder::kRelaxed) { T value; __atomic_load(&a->value, &value, (int)order); return value; } template inline T AtomicFetchIncrement(Atomic* a, MemoryOrder order = MemoryOrder::kRelaxed) { return __atomic_fetch_add(&a->value, 1, (int)order); } template inline T AtomicFetchDecrement(Atomic* a, MemoryOrder order = MemoryOrder::kRelaxed) { return __atomic_fetch_sub(&a->value, 1, (int)order); } } // namespace deimos