// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "pma/PolyAllocator.h" #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4365 4987) #endif #include #include #include #ifdef _MSC_VER #pragma warning(pop) #endif namespace pma { class MemoryResource; namespace impl { template class ManagedInstance { public: using PointerType = TPointer; private: explicit ManagedInstance(MemoryResource* memRes) : pMemRes{memRes} { } public: static ManagedInstance with(MemoryResource* memRes) { return ManagedInstance{memRes}; } template PointerType create(Args&& ... args) { pma::PolyAllocator alloc{pMemRes}; auto deleter = [alloc](TBase* ptr) mutable { alloc.deleteObject(static_cast(ptr)); }; return {alloc.newObject(std::forward(args)...), deleter}; } private: MemoryResource* pMemRes; }; } // namespace impl template using UniqueInstance = impl::ManagedInstance >, TTarget, TBase>; template using SharedInstance = impl::ManagedInstance, TTarget, TBase>; } // namespace pma