#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 */