#pragma once #include "ncx_slab.h" class mempool { public: mempool(size_t pool_size = 1024000) { const auto space = (u_char*)malloc(pool_size); mem_pool_ = (ncx_slab_pool_t*)space; mem_pool_->addr = space; mem_pool_->min_shift = 3; mem_pool_->end = space + pool_size; ncx_slab_init(mem_pool_); } ~mempool() { free(mem_pool_->addr); } [[nodiscard]] void* alloc(size_t size) const { return ncx_slab_alloc(mem_pool_, size); } template [[nodiscard]] T* alloc(Args&&... args) const { T* out = (T*)alloc(sizeof(T)); new (out) T(std::forward(args)...); return out; } template [[nodiscard]] T* alloc() const { T* out = (T*)alloc(sizeof(T)); new (out) T(); return out; } void free(void* p) const { ncx_slab_free(mem_pool_, p); } [[nodiscard]] ncx_slab_stat_t stat() const { ncx_slab_stat_t out; ncx_slab_stat(mem_pool_, &out); return out; } private: ncx_slab_pool_t* mem_pool_ = nullptr; };