From 73e0097395b38da7fe70952950f548cbc480c9a0 Mon Sep 17 00:00:00 2001 From: Adam Heinermann Date: Mon, 1 Sep 2025 20:31:23 -0700 Subject: [PATCH] feat(memory): add SMemCopy and SMemMove --- storm/Memory.cpp | 10 ++++++++ storm/Memory.hpp | 4 +++ test/Memory.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/storm/Memory.cpp b/storm/Memory.cpp index 9b4d58a..7763f1c 100644 --- a/storm/Memory.cpp +++ b/storm/Memory.cpp @@ -2,8 +2,10 @@ #include + constexpr size_t ALIGNMENT = 8; + void* SMemAlloc(size_t bytes, const char* filename, int32_t linenumber, uint32_t flags) { size_t alignedBytes = (bytes + (ALIGNMENT - 1)) & ~(ALIGNMENT - 1); @@ -23,6 +25,10 @@ void* SMemAlloc(size_t bytes, const char* filename, int32_t linenumber, uint32_t } } +void SMemCopy(void* dst, void* src, size_t bytes) { + memmove(dst, src, bytes); +} + void SMemFill(void* ptr, size_t bytes, uint8_t value) { memset(ptr, value, bytes); } @@ -39,6 +45,10 @@ void SMemFree(void* ptr, const char* filename, int32_t linenumber, uint32_t flag } } +void SMemMove(void* dst, void* src, size_t bytes) { + memmove(dst, src, bytes); +} + void* SMemReAlloc(void* ptr, size_t bytes, const char* filename, int32_t linenumber, uint32_t flags) { if (flags == 0xB00BEEE5) { return nullptr; diff --git a/storm/Memory.hpp b/storm/Memory.hpp index 8bf77c5..6bdb2c8 100644 --- a/storm/Memory.hpp +++ b/storm/Memory.hpp @@ -10,12 +10,16 @@ void* SMemAlloc(size_t bytes, const char* filename, int32_t linenumber, uint32_t flags = 0); +void SMemCopy(void* dst, void* src, size_t bytes); + void SMemFill(void* ptr, size_t bytes, uint8_t value); void SMemFree(void* ptr); void SMemFree(void* ptr, const char* filename, int32_t linenumber, uint32_t flags = 0); +void SMemMove(void* dst, void* src, size_t bytes); + void* SMemReAlloc(void* ptr, size_t bytes, const char* filename, int32_t linenumber, uint32_t flags = 0); void SMemZero(void* ptr, size_t bytes); diff --git a/test/Memory.cpp b/test/Memory.cpp index c41385e..87872e9 100644 --- a/test/Memory.cpp +++ b/test/Memory.cpp @@ -3,6 +3,7 @@ #include #include +#include TEST_CASE("SMemAlloc", "[memory]") { @@ -30,6 +31,38 @@ TEST_CASE("SMemAlloc", "[memory]") { } } +TEST_CASE("SMemCopy", "[memory]") { + std::vector data = { 1, 255, 128, 42, 69, 99, 13, 37 }; + + SECTION("copies memory") { + std::vector dest(8); + SMemCopy(dest.data(), data.data(), 8); + + CHECK_THAT(dest, Catch::Matchers::Equals(data)); + } + + SECTION("copies nothing if size is 0") { + std::vector dest(8); + SMemCopy(dest.data(), data.data(), 0); + + CHECK(std::accumulate(dest.begin(), dest.end(), 0u) == 0); + } + + SECTION("copies overlapping memory right") { + std::vector result = { 1, 255, 1, 255, 128, 42, 13, 37 }; + SMemCopy(data.data() + 2, data.data(), 4); + + CHECK_THAT(data, Catch::Matchers::Equals(result)); + } + + SECTION("copies overlapping memory left") { + std::vector result = { 1, 255, 69, 99, 13, 37, 13, 37 }; + SMemCopy(data.data() + 2, data.data() + 4, 4); + + CHECK_THAT(data, Catch::Matchers::Equals(result)); + } +} + TEST_CASE("SMemFill", "[memory]") { std::vector data = { 1, 255, 128, 42, 69, 99, 13, 37 }; @@ -63,6 +96,38 @@ TEST_CASE("SMemFree full args", "[memory]") { } } +TEST_CASE("SMemMove", "[memory]") { + std::vector data = { 1, 255, 128, 42, 69, 99, 13, 37 }; + + SECTION("copies memory") { + std::vector dest(8); + SMemMove(dest.data(), data.data(), 8); + + CHECK_THAT(dest, Catch::Matchers::Equals(data)); + } + + SECTION("copies nothing if size is 0") { + std::vector dest(8); + SMemMove(dest.data(), data.data(), 0); + + CHECK(std::accumulate(dest.begin(), dest.end(), 0u) == 0); + } + + SECTION("copies overlapping memory right") { + std::vector result = { 1, 255, 1, 255, 128, 42, 13, 37 }; + SMemMove(data.data() + 2, data.data(), 4); + + CHECK_THAT(data, Catch::Matchers::Equals(result)); + } + + SECTION("copies overlapping memory left") { + std::vector result = { 1, 255, 69, 99, 13, 37, 13, 37 }; + SMemMove(data.data() + 2, data.data() + 4, 4); + + CHECK_THAT(data, Catch::Matchers::Equals(result)); + } +} + TEST_CASE("SMemReAlloc", "[memory]") { SECTION("allocates memory") { void* ptr = SMemReAlloc(nullptr, 16, __FILE__, __LINE__);