Metahuman_DNA_Calibration/dnacalib/DNACalib/include/pma/utils/ManagedInstance.h
2022-11-29 14:25:24 +01:00

61 lines
1.4 KiB
C++

// 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 <functional>
#include <memory>
#include <utility>
#ifdef _MSC_VER
#pragma warning(pop)
#endif
namespace pma {
class MemoryResource;
namespace impl {
template<class TPointer, class TTarget, class TBase = TTarget>
class ManagedInstance {
public:
using PointerType = TPointer;
private:
explicit ManagedInstance(MemoryResource* memRes) : pMemRes{memRes} {
}
public:
static ManagedInstance with(MemoryResource* memRes) {
return ManagedInstance{memRes};
}
template<typename ... Args>
PointerType create(Args&& ... args) {
pma::PolyAllocator<TTarget> alloc{pMemRes};
auto deleter = [alloc](TBase* ptr) mutable {
alloc.deleteObject(static_cast<TTarget*>(ptr));
};
return {alloc.newObject(std::forward<Args>(args)...), deleter};
}
private:
MemoryResource* pMemRes;
};
} // namespace impl
template<class TTarget, class TBase = TTarget>
using UniqueInstance = impl::ManagedInstance<std::unique_ptr<TBase, std::function<void (TBase*)> >, TTarget, TBase>;
template<class TTarget, class TBase = TTarget>
using SharedInstance = impl::ManagedInstance<std::shared_ptr<TBase>, TTarget, TBase>;
} // namespace pma