#ifndef PKE_MEMORY_HPP #define PKE_MEMORY_HPP #include "macros.hpp" #include #include #include #include #include #define DEFAULT_BUCKET_SIZE 1UL << 27 namespace pke { struct MemBucket; void *PkeNew(std::size_t sz); void *PkeNew(std::size_t sz, MemBucket *bkt); void PkeDelete(const void *ptr, std::size_t sz); void PkeDelete(const void *ptr, std::size_t sz, MemBucket *bkt); MemBucket *BeginTransientBucket(int64_t sz = DEFAULT_BUCKET_SIZE); // 256MB void EndTransientBucket(MemBucket *bkt); void Flush(); template inline T *PkeNew() { return reinterpret_cast(PkeNew(sizeof(T))); } template inline T *PkeNew(long count) { return reinterpret_cast(PkeNew(sizeof(T) * count)); } template inline void PkeDelete(const void *ptr) { return PkeDelete(ptr, sizeof(T)); } template inline void PkeDelete(const void *ptr, long count) { return PkeDelete(ptr, sizeof(T) * count); } } /* pke */ uint64_t Buckets_NewHandle(std::size_t bucketBytes, uint64_t bucketItemCount, uint64_t &bucketIncrementer, uint64_t &bucketCounter, uint64_t &itemCounter, void*& buckets); template inline uint64_t Buckets_NewHandle(uint64_t bucketItemCount, uint64_t &bucketIncrementer, uint64_t &bucketCounter, uint64_t &itemCounter, T*& buckets) { void *ptr = reinterpret_cast(buckets); uint64_t handle = Buckets_NewHandle(sizeof(T), bucketItemCount, bucketIncrementer, bucketCounter, itemCounter, ptr); buckets = reinterpret_cast(ptr); return handle; } static inline constexpr uint64_t Buckets_GetBucketIndex(uint64_t handle) { return handle & 0x00000000FFFFFFFF; } static inline constexpr uint64_t Buckets_GetItemIndex(uint64_t handle) { return handle >> 32; } #endif /* PKE_MEMORY_HPP */