diff options
Diffstat (limited to 'src/lib/netlist/plib/pmempool.h')
-rw-r--r-- | src/lib/netlist/plib/pmempool.h | 60 |
1 files changed, 22 insertions, 38 deletions
diff --git a/src/lib/netlist/plib/pmempool.h b/src/lib/netlist/plib/pmempool.h index 00e78b09fb6..5449595c86c 100644 --- a/src/lib/netlist/plib/pmempool.h +++ b/src/lib/netlist/plib/pmempool.h @@ -23,21 +23,6 @@ namespace plib { - template <typename P, typename T> - struct pool_deleter - { - constexpr pool_deleter() noexcept = default; - - template<typename PU, typename U, typename = typename - std::enable_if<std::is_convertible< U*, T*>::value>::type> - pool_deleter(const pool_deleter<PU, U>&) noexcept { } - - void operator()(T *p) const - { - P::free(p); - } - }; - //============================================================ // Memory pool //============================================================ @@ -100,8 +85,11 @@ namespace plib { std::vector<block *> m_blocks; public: + static constexpr const bool is_stateless = false; + template <class T, std::size_t ALIGN = alignof(T)> + using allocator_type = arena_allocator<mempool, T, ALIGN>; - mempool(size_t min_alloc, size_t min_align) + mempool(size_t min_alloc = (1<<21), size_t min_align = 16) : m_min_alloc(min_alloc), m_min_align(min_align) { } @@ -122,10 +110,8 @@ namespace plib { } } - template <std::size_t ALIGN> - void *alloc(size_t size) + void *allocate(size_t align, size_t size) { - size_t align = ALIGN; if (align < m_min_align) align = m_min_align; @@ -164,11 +150,8 @@ namespace plib { } } - template <typename T> - static void free(T *ptr) + static void deallocate(void *ptr) { - /* call destructor */ - ptr->~T(); auto it = sinfo().find(ptr); if (it == sinfo().end()) @@ -188,19 +171,18 @@ namespace plib { } template <typename T> - using poolptr = plib::owned_ptr<T, pool_deleter<mempool, T>>; + using owned_pool_ptr = plib::owned_ptr<T, arena_deleter<mempool, T>>; template<typename T, typename... Args> - poolptr<T> make_poolptr(Args&&... args) + owned_pool_ptr<T> make_poolptr(Args&&... args) { - auto *mem = this->alloc<alignof(T)>(sizeof(T)); - auto *obj = new (mem) T(std::forward<Args>(args)...); - poolptr<T> a(obj, true); - return std::move(a); + auto *mem = this->allocate(alignof(T), sizeof(T)); + return owned_pool_ptr<T>(new (mem) T(std::forward<Args>(args)...), true, arena_deleter<mempool, T>(this)); } }; +#if 0 class mempool_default { private: @@ -210,7 +192,11 @@ namespace plib { public: - mempool_default(size_t min_alloc, size_t min_align) + static constexpr const bool is_stateless = true; + template <class T, std::size_t ALIGN = alignof(T)> + using allocator_type = arena_allocator<mempool_default, T, ALIGN>; + + mempool_default(size_t min_alloc = 16, size_t min_align = (1 << 21)) : m_min_alloc(min_alloc), m_min_align(min_align) { } @@ -219,24 +205,22 @@ namespace plib { ~mempool_default() = default; -#if 0 - void *alloc(size_t size) + void *allocate(size_t alignment, size_t size) { plib::unused_var(m_min_alloc); // -Wunused-private-field fires without plib::unused_var(m_min_align); + plib::unused_var(alignment); return ::operator new(size); } -#endif - template <typename T> - static void free(T *ptr) + static void deallocate(void *ptr) { - plib::pdelete(ptr); + ::operator delete(ptr); } template <typename T> - using poolptr = plib::owned_ptr<T, pool_deleter<mempool_default, T>>; + using poolptr = plib::owned_ptr<T, arena_deleter<mempool_default, T>>; template<typename T, typename... Args> poolptr<T> make_poolptr(Args&&... args) @@ -249,7 +233,7 @@ namespace plib { return std::move(a); } }; - +#endif } // namespace plib |