diff --git a/storm/Atomic.cpp b/storm/Atomic.cpp new file mode 100644 index 0000000..2031bfc --- /dev/null +++ b/storm/Atomic.cpp @@ -0,0 +1,25 @@ +#include "storm/Atomic.hpp" + +#if defined(WHOA_SYSTEM_WIN) +#include +#endif + +int32_t SInterlockedDecrement(int32_t* ptr) { +#if defined(WHOA_SYSTEM_WIN) + return InterlockedDecrement(ptr); +#endif + +#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) + return __sync_fetch_and_sub(ptr, 1) - 1; +#endif +} + +int32_t SInterlockedIncrement(int32_t* ptr) { +#if defined(WHOA_SYSTEM_WIN) + return InterlockedIncrement(ptr); +#endif + +#if defined(WHOA_SYSTEM_MAC) || defined(WHOA_SYSTEM_LINUX) + return __sync_fetch_and_add(ptr, 1) + 1; +#endif +} diff --git a/storm/Atomic.hpp b/storm/Atomic.hpp new file mode 100644 index 0000000..58ce744 --- /dev/null +++ b/storm/Atomic.hpp @@ -0,0 +1,10 @@ +#ifndef STORM_ATOMIC_HPP +#define STORM_ATOMIC_HPP + +#include + +int32_t SInterlockedDecrement(int32_t* ptr); + +int32_t SInterlockedIncrement(int32_t* ptr); + +#endif diff --git a/test/Atomic.cpp b/test/Atomic.cpp new file mode 100644 index 0000000..205c9cd --- /dev/null +++ b/test/Atomic.cpp @@ -0,0 +1,20 @@ +#include "storm/Atomic.hpp" +#include "test/Test.hpp" + +TEST_CASE("SInterlockedDecrement", "[atomic]") { + SECTION("decrements value") { + int32_t value = 1; + auto decremented = SInterlockedDecrement(&value); + CHECK(value == 0); + CHECK(decremented == 0); + } +} + +TEST_CASE("SInterlockedIncrement", "[atomic]") { + SECTION("increments value") { + int32_t value = { 1 }; + auto incremented = SInterlockedIncrement(&value); + CHECK(value == 2); + CHECK(incremented == 2); + } +}