/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: Heap.hpp Date: 2021-6-9 Author: Reece ***/ #pragma once namespace Aurora::Memory { class Heap { public: virtual Types::size_t GetChunkSize(const void *head) = 0; template T ZAlloc(Types::size_t length) { return reinterpret_cast(_ZAlloc(length)); } template T ZAlloc(Types::size_t length, Types::size_t align) { return reinterpret_cast(_ZAlloc(length, align)); } template T *ZAlloc() { return reinterpret_cast(_ZAlloc(sizeof(T))); } template T *NewArray(Types::size_t count) { return ZAlloc(count * sizeof(T)); } template T *NewArray(Types::size_t count, Types::size_t align) { return ZAlloc(count * sizeof(T), align); } /// Fast, unsafe alloc template T FAlloc(Types::size_t length) { return reinterpret_cast(_FAlloc(length)); } template T FAlloc(Types::size_t length, Types::size_t align) { return reinterpret_cast(_FAlloc(length, align)); } template T ZRealloc(T in, Types::size_t length) { return reinterpret_cast(_ZRealloc(reinterpret_cast(in), length)); } template T ZRealloc(T in, Types::size_t length, Types::size_t alloc) { return reinterpret_cast(_ZRealloc(reinterpret_cast(in), length), alloc); } template T FRealloc(T in, Types::size_t length) { return reinterpret_cast(_SRealloc(reinterpret_cast(in), length)); } template T FRealloc(T in, Types::size_t length, Types::size_t alloc) { return reinterpret_cast(_SRealloc(reinterpret_cast(in), length), alloc); } template void Free(T in) { _Free(reinterpret_cast(in)); } template AuSPtr ToSmartPointer(T *in) { if (in == nullptr) return {}; return std::shared_ptr(in, [=](T *delt) { if constexpr (std::is_class_v) { delt->~T(); } this->Free(delt); }); } template static AuSPtr ToSmartPointer(AuSPtr heap, T *in) { return std::shared_ptr(in, [=](T *delt) { heap->Free(delt); }); } private: virtual AU_ALLOC void *_ZAlloc(Types::size_t length) = 0; virtual AU_ALLOC void *_ZAlloc(Types::size_t length, Types::size_t align) = 0; virtual AU_ALLOC void *_FAlloc(Types::size_t length) = 0; virtual AU_ALLOC void *_FAlloc(Types::size_t length, Types::size_t align) = 0; virtual AU_ALLOC void *_ZRealloc(void *buffer, Types::size_t length, Types::size_t align) = 0; virtual AU_ALLOC void *_ZRealloc(void *buffer, Types::size_t length) = 0; virtual AU_ALLOC void *_FRealloc(void *buffer, Types::size_t length, Types::size_t align) = 0; virtual AU_ALLOC void *_FRealloc(void *buffer, Types::size_t length) = 0; virtual void _Free(void* buffer) = 0; }; /** Returns a heap interface backed by the default allocator */ AUKN_SHARED_API(GetDefaultDiscontiguousHeap, Heap); /** Allocates Fize amount of memory @return a heap backed by allocated memory */ AUKN_SHARED_API(AllocHeap, Heap, AuUInt size); }