fix(memory): support for creating TUniqueRef object from MakeUnique()

This commit is contained in:
2023-02-14 23:53:34 +08:00
parent fb0d1e978d
commit c4e0528d93
3 changed files with 110 additions and 30 deletions

View File

@ -435,22 +435,6 @@ public:
: Pointer(InPtr), Controller(InController)
{ }
template <typename U> requires (CArray<T> == CArray<U> && ((!CArray<U> && CConvertibleTo<T(*)[], U(*)[]>)
|| (CArray<U> && CConvertibleTo<TRemoveExtent<T>(*)[], TRemoveExtent<U>(*)[]>)))
NODISCARD FORCEINLINE operator TSharedRef<U>() &&
{
check_code({ return TSharedRef<U>(Pointer, Exchange(Controller, nullptr)); });
return TSharedRef<U>(Pointer, Controller);
}
template <typename U> requires (CArray<T> == CArray<U> && ((!CArray<U> && CConvertibleTo<T(*)[], U(*)[]>)
|| (CArray<U> && CConvertibleTo<TRemoveExtent<T>(*)[], TRemoveExtent<U>(*)[]>)))
NODISCARD FORCEINLINE operator TSharedPtr<U>() &&
{
check_code({ return TSharedPtr<U>(Pointer, Exchange(Controller, nullptr)); });
return TSharedPtr<U>(Pointer, Controller);
}
# if DO_CHECK
FORCEINLINE ~TSharedProxy() { checkf(Controller == nullptr, TEXT("The return value from MakeShared() is incorrectly ignored.")); }
@ -462,6 +446,10 @@ private:
TRemoveExtent<T>* Pointer;
FSharedController* Controller;
template <typename U> requires (CObject<U> && !CBoundedArray<U>) friend class NAMESPACE_REDCRAFT::TSharedRef;
template <typename U> requires (CObject<U> && !CBoundedArray<U>) friend class NAMESPACE_REDCRAFT::TSharedPtr;
template <typename U> requires (CObject<U> && !CBoundedArray<U>) friend class NAMESPACE_REDCRAFT::TWeakPtr;
};
struct FSharedPtrConstructor { explicit FSharedPtrConstructor() = default; };
@ -714,6 +702,15 @@ public:
Swap(A.Controller, B.Controller);
}
public:
template <typename U> requires (CConvertibleTo<U*, T*> && !CArray<U>)
FORCEINLINE TSharedRef(NAMESPACE_PRIVATE::TSharedProxy<U>&& InValue)
: Pointer(InValue.Pointer), Controller(InValue.Controller)
{
check_code({ InValue.Controller = nullptr; });
}
private:
T* Pointer;
@ -755,8 +752,6 @@ private:
template <typename U> requires (CObject<U> && !CBoundedArray<U>) friend class TSharedPtr;
template <typename U> requires (CObject<U> && !CBoundedArray<U>) friend class TWeakPtr;
template <typename U> friend class NAMESPACE_PRIVATE::TSharedProxy;
friend struct NAMESPACE_PRIVATE::FSharedHelper;
};
@ -932,6 +927,15 @@ public:
Swap(A.Controller, B.Controller);
}
public:
template <typename U> requires (CConvertibleTo<TRemoveExtent<U>(*)[], T(*)[]> && CArray<U>)
FORCEINLINE TSharedRef(NAMESPACE_PRIVATE::TSharedProxy<U>&& InValue)
: Pointer(InValue.Pointer), Controller(InValue.Controller)
{
check_code({ InValue.Controller = nullptr; });
}
private:
T* Pointer;
@ -958,8 +962,6 @@ private:
template <typename U> requires (CObject<U> && !CBoundedArray<U>) friend class TSharedPtr;
template <typename U> requires (CObject<U> && !CBoundedArray<U>) friend class TWeakPtr;
template <typename U> friend class NAMESPACE_PRIVATE::TSharedProxy;
friend struct NAMESPACE_PRIVATE::FSharedHelper;
};
@ -1185,6 +1187,15 @@ public:
Swap(A.Controller, B.Controller);
}
public:
template <typename U> requires (CConvertibleTo<U*, T*> && !CArray<U>)
FORCEINLINE TSharedPtr(NAMESPACE_PRIVATE::TSharedProxy<U>&& InValue)
: Pointer(InValue.Pointer), Controller(InValue.Controller)
{
check_code({ InValue.Controller = nullptr; });
}
private:
T* Pointer;
@ -1224,8 +1235,6 @@ private:
template <typename U> requires (CObject<U> && !CBoundedArray<U>) friend class TSharedPtr;
template <typename U> requires (CObject<U> && !CBoundedArray<U>) friend class TWeakPtr;
template <typename U> friend class NAMESPACE_PRIVATE::TSharedProxy;
friend struct NAMESPACE_PRIVATE::FSharedHelper;
};
@ -1453,6 +1462,15 @@ public:
Swap(A.Controller, B.Controller);
}
public:
template <typename U> requires (CConvertibleTo<TRemoveExtent<U>(*)[], T(*)[]> && CArray<U>)
FORCEINLINE TSharedPtr(NAMESPACE_PRIVATE::TSharedProxy<U>&& InValue)
: Pointer(InValue.Pointer), Controller(InValue.Controller)
{
check_code({ InValue.Controller = nullptr; });
}
private:
T* Pointer;
@ -1477,8 +1495,6 @@ private:
template <typename U> requires (CObject<U> && !CBoundedArray<U>) friend class TSharedPtr;
template <typename U> requires (CObject<U> && !CBoundedArray<U>) friend class TWeakPtr;
template <typename U> friend class NAMESPACE_PRIVATE::TSharedProxy;
friend struct NAMESPACE_PRIVATE::FSharedHelper;
};