From 9d6c681037eb4fb3c6d9eca6b1ff1d01d429614e Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Thu, 7 Sep 2023 22:44:12 -0400 Subject: entities and memory allocation checkpoint --- src/memory-allocator.hpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/memory-allocator.hpp (limited to 'src/memory-allocator.hpp') diff --git a/src/memory-allocator.hpp b/src/memory-allocator.hpp new file mode 100644 index 0000000..c14304a --- /dev/null +++ b/src/memory-allocator.hpp @@ -0,0 +1,54 @@ +#ifndef PKE_MEMORY_ALLOCATOR_HPP +#define PKE_MEMORY_ALLOCATOR_HPP + +#include "memory.hpp" + +template class PkeTransAllocator { +public: + typedef T value_type; + MemBucket *transientBucket = nullptr; + + PkeTransAllocator() : transientBucket(Pke_BeginTransientBucket(SZ)) { + } + ~PkeTransAllocator() { + Pke_EndTransientBucket(this->transientBucket); + } + + template struct rebind {typedef PkeTransAllocator other;}; + template explicit PkeTransAllocator(const PkeTransAllocator &other) { + (void)other; + } + + T *allocate(std::size_t n) { + auto *ptr = reinterpret_cast(Pke_New(sizeof(T) * n, this->transientBucket)); + if (ptr) return ptr; + throw "Pke-Allocator Failed to allocate"; + } + + void deallocate(const T *ptr, std::size_t n) { + Pke_Delete(ptr, sizeof(T) * n, this->transientBucket); + } +}; + +template class PkeAllocator { +public: + typedef T value_type; + + PkeAllocator() = default; + + template explicit PkeAllocator(const PkeAllocator &other) { + (void)other; + } + + T *allocate(std::size_t n) { + auto *ptr = Pke_New(n); + if (ptr) return ptr; + throw "Pke-Allocator Failed to allocate"; + } + + void deallocate(const T *ptr, std::size_t n) { + Pke_Delete(ptr, n); + } +}; + +#endif /* PKE_MEMORY_ALLOCATOR_HPP */ -- cgit v1.2.3