#include "storm/Memory.hpp" #include constexpr size_t ALIGNMENT = 8; void* operator new(size_t bytes) { return SMemAlloc(bytes, "new", -1, 0x0); } void* operator new[](size_t bytes) { return SMemAlloc(bytes, "new[]", -1, 0x0); } void operator delete(void* ptr) noexcept { if (ptr) { SMemFree(ptr, "delete", -1, 0x0); } } void operator delete[](void* ptr) noexcept { if (ptr) { SMemFree(ptr, "delete[]", -1, 0x0); } } void* STORMAPI SMemAlloc(size_t bytes, const char* filename, int32_t linenumber, uint32_t flags) { size_t alignedBytes = (bytes + (ALIGNMENT - 1)) & ~(ALIGNMENT - 1); void* result; if (flags & SMEM_FLAG_ZEROMEMORY) { result = calloc(1, alignedBytes); } else { result = malloc(alignedBytes); } if (result) { return result; } else { // TODO handle errors return nullptr; } } int STORMAPI SMemCmp(void* ptrA, void* ptrB, size_t bytes) { return memcmp(ptrA, ptrB, bytes); } void STORMAPI SMemCopy(void* dst, void* src, size_t bytes) { memmove(dst, src, bytes); } void STORMAPI SMemFill(void* ptr, size_t bytes, uint8_t value) { memset(ptr, value, bytes); } void STORMAPI SMemFree(void* ptr, const char* filename, int32_t linenumber, uint32_t flags) { if (ptr) { free(ptr); } } void STORMAPI SMemMove(void* dst, void* src, size_t bytes) { memmove(dst, src, bytes); } void* STORMAPI SMemReAlloc(void* ptr, size_t bytes, const char* filename, int32_t linenumber, uint32_t flags) { if (flags == 0xB00BEEE5) { return nullptr; } if (!ptr) { return SMemAlloc(bytes, filename, linenumber, flags); } if (flags & 0x10) { return nullptr; } size_t alignedBytes = (bytes + (ALIGNMENT - 1)) & ~(ALIGNMENT - 1); void* result = realloc(ptr, alignedBytes); if (result) { if (flags & 0x8) { // TODO zero out expanded portion } return result; } else { if (alignedBytes) { // TODO handle errors } return nullptr; } } void STORMAPI SMemZero(void* ptr, size_t bytes) { uint8_t* ptrdata = static_cast(ptr); for (size_t i = 0; i < bytes; i++) { ptrdata[i] = 0; } }