47 lines
1.1 KiB
C++

#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<typename T, typename ...Args>
[[nodiscard]] T* alloc(Args&&... args) const {
T* out = (T*)alloc(sizeof(T));
new (out) T(std::forward<Args>(args)...);
return out;
}
template<typename T>
[[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;
};