refactor: change memory manager API to use a type template

This commit is contained in:
Jan 2024-04-22 20:00:14 +02:00
parent 7d920e1060
commit 0845cccd12
No known key found for this signature in database
GPG Key ID: 44B581F78FF5C57C
2 changed files with 27 additions and 12 deletions

View File

@ -26,9 +26,9 @@ MemoryManager::~MemoryManager()
m_destructible.clear(); m_destructible.clear();
} }
void* MemoryManager::Alloc(const size_t size) void* MemoryManager::AllocRaw(const size_t size)
{ {
void* result = malloc(size); void* result = calloc(size, 1u);
m_allocations.push_back(result); m_allocations.push_back(result);
return result; return result;
@ -46,7 +46,7 @@ char* MemoryManager::Dup(const char* str)
return result; return result;
} }
void MemoryManager::Free(void* data) void MemoryManager::Free(const void* data)
{ {
for (auto iAlloc = m_allocations.begin(); iAlloc != m_allocations.end(); ++iAlloc) for (auto iAlloc = m_allocations.begin(); iAlloc != m_allocations.end(); ++iAlloc)
{ {
@ -59,7 +59,7 @@ void MemoryManager::Free(void* data)
} }
} }
void MemoryManager::Delete(void* data) void MemoryManager::Delete(const void* data)
{ {
for (auto iAlloc = m_destructible.begin(); iAlloc != m_destructible.end(); ++iAlloc) for (auto iAlloc = m_destructible.begin(); iAlloc != m_destructible.end(); ++iAlloc)
{ {

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <cstddef> #include <cstddef>
#include <type_traits>
#include <vector> #include <vector>
class MemoryManager class MemoryManager
@ -8,7 +9,12 @@ class MemoryManager
class IDestructible class IDestructible
{ {
public: public:
IDestructible() = default;
virtual ~IDestructible() = default; virtual ~IDestructible() = default;
IDestructible(const IDestructible& other) = default;
IDestructible(IDestructible&& other) noexcept = default;
IDestructible& operator=(const IDestructible& other) = default;
IDestructible& operator=(IDestructible&& other) noexcept = default;
}; };
template<class T> class Allocation final : public IDestructible template<class T> class Allocation final : public IDestructible
@ -16,9 +22,9 @@ class MemoryManager
public: public:
T m_entry; T m_entry;
template<class... _Valty> template<class... ValType>
explicit Allocation(_Valty&&... _Val) explicit Allocation(ValType&&... val)
: m_entry(std::forward<_Valty>(_Val)...) : m_entry(std::forward<ValType>(val)...)
{ {
} }
@ -45,17 +51,26 @@ class MemoryManager
public: public:
MemoryManager(); MemoryManager();
virtual ~MemoryManager(); virtual ~MemoryManager();
MemoryManager(const MemoryManager& other) = delete;
MemoryManager(MemoryManager&& other) noexcept = default;
MemoryManager& operator=(const MemoryManager& other) = delete;
MemoryManager& operator=(MemoryManager&& other) noexcept = default;
void* Alloc(size_t size); void* AllocRaw(size_t size);
char* Dup(const char* str); char* Dup(const char* str);
template<class T, class... _Valty> T* Create(_Valty&&... _Val) template<typename T> std::add_pointer_t<T> Alloc(const size_t count = 1u)
{ {
Allocation<T>* allocation = new Allocation<T>(std::forward<_Valty>(_Val)...); return static_cast<std::add_pointer_t<T>>(AllocRaw(sizeof(T) * count));
}
template<class T, class... ValType> std::add_pointer_t<T> Create(ValType&&... val)
{
Allocation<T>* allocation = new Allocation<T>(std::forward<ValType>(val)...);
m_destructible.emplace_back(allocation, &allocation->m_entry); m_destructible.emplace_back(allocation, &allocation->m_entry);
return &allocation->m_entry; return &allocation->m_entry;
} }
void Free(void* data); void Free(const void* data);
void Delete(void* data); void Delete(const void* data);
}; };