#pragma once extern "C" { #include "../common.h" } /** * Utility methods for memory management. Typically helpers and wrappers around the C standard library. */ namespace Memory { template T * Allocate() { return (T*)malloc(sizeof(T)); } template T * Allocate(size_t size) { return (T*)malloc(size); } template T * AllocateArray(size_t count) { return (T*)malloc(count * sizeof(T)); } template T * Reallocate(T * ptr, size_t size) { if (ptr == NULL) { return (T*)malloc(size); } else { return (T*)realloc((void*)ptr, size); } } template T * ReallocateArray(T * ptr, size_t count) { if (ptr == NULL) { return (T*)malloc(count * sizeof(T)); } else { return (T*)realloc((void*)ptr, count * sizeof(T)); } } template void Free(T * ptr) { free((void*)ptr); } template T * Copy(T * dst, const T * src, size_t size) { if (size == 0) return (T*)dst; return (T*)memcpy((void*)dst, (const void*)src, size); } template T * CopyArray(T *dst, const T * src, size_t count) { if (count == 0) return (T*)dst; return (T*)memcpy((void*)dst, (const void*)src, count * sizeof(T)); } template T * Duplicate(const T * src, size_t size) { T *result = Allocate(size); return Copy(result, src, size); } template T * DuplicateArray(const T * src, size_t count) { T *result = AllocateArray(count); return CopyArray(result, src, count); } template T * Set(T * dst, uint8 value, size_t size) { return (T*)memset((void*)dst, (int)value, size); } }