#pragma once #include #include #include "libipc/def.h" namespace ipc { namespace mem { class pool_alloc { public: static void* alloc(std::size_t size); static void free (void* p, std::size_t size); }; //////////////////////////////////////////////////////////////// /// construct/destruct an object //////////////////////////////////////////////////////////////// namespace detail { template struct impl { template static T* construct(T* p, P&&... params) { ::new (p) T(std::forward

(params)...); return p; } static void destruct(T* p) { reinterpret_cast(p)->~T(); } }; template struct impl { using type = T[N]; template static type* construct(type* p, P&&... params) { for (size_t i = 0; i < N; ++i) { impl::construct(&((*p)[i]), std::forward

(params)...); } return p; } static void destruct(type* p) { for (size_t i = 0; i < N; ++i) { impl::destruct(&((*p)[i])); } } }; } // namespace detail template T* construct(T* p, P&&... params) { return detail::impl::construct(p, std::forward

(params)...); } template T* construct(void* p, P&&... params) { return construct(static_cast(p), std::forward

(params)...); } template void destruct(T* p) { return detail::impl::destruct(p); } template void destruct(void* p) { destruct(static_cast(p)); } //////////////////////////////////////////////////////////////// /// general alloc/free //////////////////////////////////////////////////////////////// inline void* alloc(std::size_t size) { return pool_alloc::alloc(size); } template T* alloc(P&&... params) { return construct(pool_alloc::alloc(sizeof(T)), std::forward

(params)...); } inline void free(void* p, std::size_t size) { pool_alloc::free(p, size); } template void free(T* p) { if (p == nullptr) return; destruct(p); pool_alloc::free(p, sizeof(T)); } } // namespace mem } // namespace ipc