diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-01-03 01:49:42 +0100 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-01-03 01:49:42 +0100 |
commit | c2d4216695b48dfe6bf7083c11e0a7fcbb671e2e (patch) | |
tree | 600719b0f7d7d491eb70ca416b8af3b47bbc28eb /asl/atomic.hpp | |
parent | eb58edf811a328ddcc5e671a258be208da212630 (diff) |
Add atomic & is_integer
Diffstat (limited to 'asl/atomic.hpp')
-rw-r--r-- | asl/atomic.hpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/asl/atomic.hpp b/asl/atomic.hpp new file mode 100644 index 0000000..cf6968c --- /dev/null +++ b/asl/atomic.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include "asl/meta.hpp" + +namespace asl +{ + +enum class memory_order : int // NOLINT(*-enum-size) +{ + relaxed = __ATOMIC_RELAXED, + acquire = __ATOMIC_ACQUIRE, + release = __ATOMIC_RELEASE, + acq_rel = __ATOMIC_ACQ_REL, + seq_cst = __ATOMIC_SEQ_CST, +}; + +template<typename T> struct atomic { T m_value{}; }; + +inline void atomic_fence(memory_order order) +{ + __atomic_thread_fence((int)order); +} + +template<is_integer T> +inline void atomic_store(atomic<T>* a, T value, memory_order order = memory_order::relaxed) +{ + __atomic_store(&a->m_value, &value, (int)order); +} + +template<is_integer T> +inline T atomic_load(atomic<T>* a, memory_order order = memory_order::relaxed) +{ + T value; + __atomic_load(&a->m_value, &value, (int)order); + return value; +} + +template<typename T> +inline T atomic_fetch_increment(atomic<T>* a, memory_order order = memory_order::relaxed) +{ + return __atomic_fetch_add(&a->m_value, 1, (int)order); +} + +template<typename T> +inline T atomic_fetch_decrement(atomic<T>* a, memory_order order = memory_order::relaxed) +{ + return __atomic_fetch_sub(&a->m_value, 1, (int)order); +} + +} // namespace asl + |