#pragma once #include #include #include "libipc/platform/detail.h" #include "libipc/utility/concept.h" #include "libipc/pool_alloc.h" namespace ipc { // pimpl small object optimization helpers template using IsImplComfortable = ipc::require<(sizeof(T) <= sizeof(T*)), R>; template using IsImplUncomfortable = ipc::require<(sizeof(T) > sizeof(T*)), R>; template IPC_CONSTEXPR_ auto make_impl(P&&... params) -> IsImplComfortable { T* buf {}; ::new (&buf) T { std::forward

(params)... }; return buf; } template IPC_CONSTEXPR_ auto impl(T* const (& p)) -> IsImplComfortable { return reinterpret_cast(&const_cast(reinterpret_cast(p))); } template IPC_CONSTEXPR_ auto clear_impl(T* p) -> IsImplComfortable { if (p != nullptr) impl(p)->~T(); } template IPC_CONSTEXPR_ auto make_impl(P&&... params) -> IsImplUncomfortable { return mem::alloc(std::forward

(params)...); } template IPC_CONSTEXPR_ auto clear_impl(T* p) -> IsImplUncomfortable { mem::free(p); } template IPC_CONSTEXPR_ auto impl(T* const (& p)) -> IsImplUncomfortable { return p; } template struct pimpl { template IPC_CONSTEXPR_ static T* make(P&&... params) { return make_impl(std::forward

(params)...); } IPC_CONSTEXPR_ void clear() { clear_impl(static_cast(const_cast(this))); } }; } // namespace ipc