diff --git a/storm/Memory.cpp b/storm/Memory.cpp index bf04ef3..19f3882 100644 --- a/storm/Memory.cpp +++ b/storm/Memory.cpp @@ -7,7 +7,7 @@ void* SMemAlloc(size_t bytes, const char* filename, int32_t linenumber, uint32_t void* result; - if (flags & 0x8) { + if (flags & SMEM_FLAG_ZEROMEMORY) { result = calloc(1, alignedBytes); } else { result = malloc(alignedBytes); diff --git a/storm/Memory.hpp b/storm/Memory.hpp index 07c8186..33e2b0d 100644 --- a/storm/Memory.hpp +++ b/storm/Memory.hpp @@ -4,12 +4,16 @@ #include #include -void* SMemAlloc(size_t bytes, const char* filename, int32_t linenumber, uint32_t flags); + +#define SMEM_FLAG_ZEROMEMORY 8 + + +void* SMemAlloc(size_t bytes, const char* filename, int32_t linenumber, uint32_t flags = 0); void SMemFree(void* ptr); -void SMemFree(void* ptr, const char* filename, int32_t linenumber, uint32_t flags); +void SMemFree(void* ptr, const char* filename, int32_t linenumber, uint32_t flags = 0); -void* SMemReAlloc(void* ptr, size_t bytes, const char* filename, int32_t linenumber, uint32_t flags); +void* SMemReAlloc(void* ptr, size_t bytes, const char* filename, int32_t linenumber, uint32_t flags = 0); #endif diff --git a/test/Memory.cpp b/test/Memory.cpp index b30b865..a6c4593 100644 --- a/test/Memory.cpp +++ b/test/Memory.cpp @@ -1,10 +1,84 @@ #include "storm/Memory.hpp" #include "test/Test.hpp" +#include +#include + + TEST_CASE("SMemAlloc", "[memory]") { SECTION("allocates memory") { - void* ptr = SMemAlloc(16, __FILE__, __LINE__, 0x0); + void* ptr = SMemAlloc(16, __FILE__, __LINE__); + REQUIRE(ptr != nullptr); + CHECK_NOTHROW(memset(ptr, 1, 16)); + SMemFree(ptr); + } + + SECTION("allocates memory initialized to 0 with flag") { + void* ptr = SMemAlloc(16, __FILE__, __LINE__, SMEM_FLAG_ZEROMEMORY); + REQUIRE(ptr != nullptr); + + uint8_t* pArray = static_cast(ptr); + CHECK(std::accumulate(pArray, pArray + 16, 0u) == 0); + + SMemFree(ptr); + } + + SECTION("allocates a memory pointer even if the size is 0") { + void* ptr = SMemAlloc(0, __FILE__, __LINE__); REQUIRE(ptr != nullptr); SMemFree(ptr); } } + +TEST_CASE("SMemFree", "[memory]") { + SECTION("does nothing on nullptr") { + CHECK_NOTHROW(SMemFree(nullptr)); + } +} + +TEST_CASE("SMemFree full args", "[memory]") { + SECTION("does nothing on nullptr") { + CHECK_NOTHROW(SMemFree(nullptr, __FILE__, __LINE__)); + } +} + +TEST_CASE("SMemReAlloc", "[memory]") { + SECTION("allocates memory") { + void* ptr = SMemReAlloc(nullptr, 16, __FILE__, __LINE__); + REQUIRE(ptr != nullptr); + CHECK_NOTHROW(memset(ptr, 1, 16)); + SMemFree(ptr); + } + + SECTION("allocates memory initialized to 0 with flag") { + void* ptr = SMemReAlloc(nullptr, 16, __FILE__, __LINE__, SMEM_FLAG_ZEROMEMORY); + REQUIRE(ptr != nullptr); + + uint8_t* pArray = static_cast(ptr); + CHECK(std::accumulate(pArray, pArray + 16, 0u) == 0); + + SMemFree(ptr); + } + + SECTION("allocates a memory pointer even if the size is 0") { + void* ptr = SMemReAlloc(nullptr, 0, __FILE__, __LINE__); + REQUIRE(ptr != nullptr); + SMemFree(ptr); + } + + SECTION("reallocates memory") { + void* ptr = SMemAlloc(16, __FILE__, __LINE__); + REQUIRE(ptr != nullptr); + + *static_cast(ptr) = 123456; + + // 1MB + void* ptr2 = SMemReAlloc(ptr, 1024 * 1024, __FILE__, __LINE__); + REQUIRE(ptr2 != nullptr); + + CHECK(*static_cast(ptr2) == 123456); + CHECK_NOTHROW(memset(ptr2, 1, 1024 * 1024)); + + SMemFree(ptr2); + } +}