CelticCraft/Plugins/VoxelFree/Source/Voxel/Public/VoxelSharedPtr.h

77 lines
No EOL
2.3 KiB
C++

// Copyright 2020 Phyronnaz
#pragma once
#include "CoreMinimal.h"
template<typename T>
using TVoxelSharedRef = TSharedRef<T, ESPMode::ThreadSafe>;
template<typename T>
using TVoxelSharedPtr = TSharedPtr<T, ESPMode::ThreadSafe>;
template<typename T>
using TVoxelWeakPtr = TWeakPtr<T, ESPMode::ThreadSafe>;
template<typename T>
using TVoxelSharedFromThis = TSharedFromThis<T, ESPMode::ThreadSafe>;
template<typename CastToType, typename CastFromType>
inline TVoxelSharedRef<CastToType> StaticCastVoxelSharedRef(const TVoxelSharedRef<CastFromType>& InSharedRef)
{
return StaticCastSharedRef<CastToType, CastFromType, ESPMode::ThreadSafe>(InSharedRef);
}
template<typename CastToType, typename CastFromType>
inline TVoxelSharedPtr<CastToType> StaticCastVoxelSharedPtr(const TVoxelSharedPtr<CastFromType>& InSharedPtr)
{
return StaticCastSharedPtr<CastToType, CastFromType, ESPMode::ThreadSafe>(InSharedPtr);
}
template<typename T, typename... InArgTypes>
inline TVoxelSharedRef<T> MakeVoxelShared(InArgTypes&&... Args)
{
return MakeShared<T, ESPMode::ThreadSafe>(Forward<InArgTypes>(Args)...);
}
template<typename T, template<class, ESPMode> class TPtr>
inline TVoxelWeakPtr<T> MakeVoxelWeakPtr(const TPtr<T, ESPMode::ThreadSafe>& Ptr)
{
return TVoxelWeakPtr<T>(Ptr);
}
template<typename T>
inline TVoxelWeakPtr<T> MakeVoxelWeakPtr(T* Ptr)
{
return TVoxelWeakPtr<T>(StaticCastVoxelSharedRef<T>(Ptr->AsShared()));
}
template<typename T, template<class, ESPMode> class TPtr>
inline TWeakPtr<T> MakeWeakPtr(const TPtr<T, ESPMode::ThreadSafe>& Ptr)
{
return TWeakPtr<T>(Ptr);
}
template<typename T>
inline TWeakPtr<T> MakeWeakPtr(T* Ptr)
{
return TWeakPtr<T>(StaticCastSharedRef<T>(Ptr->AsShared()));
}
// Need TEnableIf as &&& is equivalent to &, so T could get matched with Smthg&
template<typename T>
inline typename TEnableIf<!TIsReferenceType<T>::Value, TSharedRef<T>>::Type MakeSharedCopy(T&& Data)
{
return MakeShared<T>(MoveTemp(Data));
}
template<typename T>
inline typename TEnableIf<!TIsReferenceType<T>::Value, TVoxelSharedRef<T>>::Type MakeVoxelSharedCopy(T&& Data)
{
return MakeVoxelShared<T>(MoveTemp(Data));
}
template<typename T>
inline TSharedRef<T> MakeSharedCopy(const T& Data)
{
return MakeShared<T>(Data);
}
template<typename T>
inline TVoxelSharedRef<T> MakeVoxelSharedCopy(const T& Data)
{
return MakeVoxelShared<T>(Data);
}