refactor(typetraits): TIsDestructible use Cpp17Destructible requirements instead of std::is_destructible

This commit is contained in:
_Redstone_c_ 2022-05-15 14:18:39 +08:00
parent 13e3b49118
commit 5d1f622af8
4 changed files with 41 additions and 34 deletions

View File

@ -122,9 +122,7 @@ FORCEINLINE void Destruct(ElementType* Element, size_t Count = 1)
{
while (Count)
{
typedef ElementType DestructItemsElementTypeTypedef;
Element->DestructItemsElementTypeTypedef::~DestructItemsElementTypeTypedef();
Element->~ElementType();
++Element;
--Count;
}

View File

@ -78,8 +78,7 @@ struct alignas(InlineAlignment) TAny
}
template <typename T> requires (!TIsSame<typename TDecay<T>::Type, TAny>::Value) && (!TIsTInPlaceType<typename TDecay<T>::Type>::Value)
&& TIsObject<typename TDecay<T>::Type>::Value && (!TIsArray<typename TDecay<T>::Type>::Value) && TIsDestructible<typename TDecay<T>::Type>::Value
&& TIsConstructible<typename TDecay<T>::Type, T&&>::Value
&& TIsDestructible<typename TDecay<T>::Type>::Value && TIsConstructible<typename TDecay<T>::Type, T&&>::Value
FORCEINLINE TAny(T&& InValue) : TAny(InPlaceType<typename TDecay<T>::Type>, Forward<T>(InValue))
{ }
@ -187,8 +186,7 @@ struct alignas(InlineAlignment) TAny
}
template <typename T> requires (!TIsSame<typename TDecay<T>::Type, TAny>::Value) && (!TIsTInPlaceType<typename TDecay<T>::Type>::Value)
&& TIsObject<typename TDecay<T>::Type>::Value && (!TIsArray<typename TDecay<T>::Type>::Value) && TIsDestructible<typename TDecay<T>::Type>::Value
&& TIsConstructible<typename TDecay<T>::Type, T&&>::Value
&& TIsDestructible<typename TDecay<T>::Type>::Value && TIsConstructible<typename TDecay<T>::Type, T&&>::Value
FORCEINLINE TAny& operator=(T&& InValue)
{
using SelectedType = typename TDecay<T>::Type;
@ -225,22 +223,22 @@ struct alignas(InlineAlignment) TAny
template <typename T> constexpr bool HoldsAlternative() const { return IsValid() ? GetTypeInfo() == typeid(T) : false; }
template <typename T> requires TIsSame<T, typename TDecay<T>::Type>::Value && TIsObject<typename TDecay<T>::Type>::Value && (!TIsArray<typename TDecay<T>::Type>::Value) && TIsDestructible<typename TDecay<T>::Type>::Value
template <typename T> requires TIsDestructible<typename TDecay<T>::Type>::Value
constexpr T& GetValue() & { checkf(HoldsAlternative<T>(), TEXT("It is an error to call GetValue() on an wrong TAny. Please either check HoldsAlternative() or use Get(DefaultValue) instead.")); return *reinterpret_cast< T*>(GetAllocation()); }
template <typename T> requires TIsSame<T, typename TDecay<T>::Type>::Value && TIsObject<typename TDecay<T>::Type>::Value && (!TIsArray<typename TDecay<T>::Type>::Value) && TIsDestructible<typename TDecay<T>::Type>::Value
template <typename T> requires TIsDestructible<typename TDecay<T>::Type>::Value
constexpr T&& GetValue() && { checkf(HoldsAlternative<T>(), TEXT("It is an error to call GetValue() on an wrong TAny. Please either check HoldsAlternative() or use Get(DefaultValue) instead.")); return MoveTemp(*reinterpret_cast< T*>(GetAllocation())); }
template <typename T> requires TIsSame<T, typename TDecay<T>::Type>::Value && TIsObject<typename TDecay<T>::Type>::Value && (!TIsArray<typename TDecay<T>::Type>::Value) && TIsDestructible<typename TDecay<T>::Type>::Value
template <typename T> requires TIsDestructible<typename TDecay<T>::Type>::Value
constexpr const T& GetValue() const& { checkf(HoldsAlternative<T>(), TEXT("It is an error to call GetValue() on an wrong TAny. Please either check HoldsAlternative() or use Get(DefaultValue) instead.")); return *reinterpret_cast<const T*>(GetAllocation()); }
template <typename T> requires TIsSame<T, typename TDecay<T>::Type>::Value && TIsObject<typename TDecay<T>::Type>::Value && (!TIsArray<typename TDecay<T>::Type>::Value) && TIsDestructible<typename TDecay<T>::Type>::Value
template <typename T> requires TIsDestructible<typename TDecay<T>::Type>::Value
constexpr const T&& GetValue() const&& { checkf(HoldsAlternative<T>(), TEXT("It is an error to call GetValue() on an wrong TAny. Please either check HoldsAlternative() or use Get(DefaultValue) instead.")); return MoveTemp(*reinterpret_cast<const T*>(GetAllocation())); }
template <typename T> requires TIsSame<T, typename TDecay<T>::Type>::Value&& TIsObject<typename TDecay<T>::Type>::Value && (!TIsArray<typename TDecay<T>::Type>::Value) && TIsDestructible<typename TDecay<T>::Type>::Value
template <typename T> requires TIsSame<T, typename TDecay<T>::Type>::Value&& TIsDestructible<typename TDecay<T>::Type>::Value
constexpr T& Get( T& DefaultValue) & { return HoldsAlternative<T>() ? GetValue<T>() : DefaultValue; }
template <typename T> requires TIsSame<T, typename TDecay<T>::Type>::Value&& TIsObject<typename TDecay<T>::Type>::Value && (!TIsArray<typename TDecay<T>::Type>::Value) && TIsDestructible<typename TDecay<T>::Type>::Value
template <typename T> requires TIsSame<T, typename TDecay<T>::Type>::Value&& TIsDestructible<typename TDecay<T>::Type>::Value
constexpr const T& Get(const T& DefaultValue) const& { return HoldsAlternative<T>() ? GetValue<T>() : DefaultValue; }
FORCEINLINE void Reset()

View File

@ -107,10 +107,10 @@ public:
FORCEINLINE const type_info& TargetType() const requires (!bIsRef) { return IsValid() ? Storage.GetTypeInfo() : typeid(void); };
template <typename T> FORCEINLINE T& Target() & requires (!bIsRef) && TIsSame<T, typename TDecay<T>::Type>::Value && TIsObject<typename TDecay<T>::Type>::Value && (!TIsArray<typename TDecay<T>::Type>::Value) && TIsDestructible<typename TDecay<T>::Type>::Value { return static_cast< StorageType& >(Storage).template GetValue<T>(); }
template <typename T> FORCEINLINE T&& Target() && requires (!bIsRef) && TIsSame<T, typename TDecay<T>::Type>::Value && TIsObject<typename TDecay<T>::Type>::Value && (!TIsArray<typename TDecay<T>::Type>::Value) && TIsDestructible<typename TDecay<T>::Type>::Value { return static_cast< StorageType&&>(Storage).template GetValue<T>(); }
template <typename T> FORCEINLINE const T& Target() const& requires (!bIsRef) && TIsSame<T, typename TDecay<T>::Type>::Value && TIsObject<typename TDecay<T>::Type>::Value && (!TIsArray<typename TDecay<T>::Type>::Value) && TIsDestructible<typename TDecay<T>::Type>::Value { return static_cast<const StorageType& >(Storage).template GetValue<T>(); }
template <typename T> FORCEINLINE const T&& Target() const&& requires (!bIsRef) && TIsSame<T, typename TDecay<T>::Type>::Value && TIsObject<typename TDecay<T>::Type>::Value && (!TIsArray<typename TDecay<T>::Type>::Value) && TIsDestructible<typename TDecay<T>::Type>::Value { return static_cast<const StorageType&&>(Storage).template GetValue<T>(); }
template <typename T> FORCEINLINE T& Target() & requires (!bIsRef) && TIsDestructible<typename TDecay<T>::Type>::Value { return static_cast< StorageType& >(Storage).template GetValue<T>(); }
template <typename T> FORCEINLINE T&& Target() && requires (!bIsRef) && TIsDestructible<typename TDecay<T>::Type>::Value { return static_cast< StorageType&&>(Storage).template GetValue<T>(); }
template <typename T> FORCEINLINE const T& Target() const& requires (!bIsRef) && TIsDestructible<typename TDecay<T>::Type>::Value { return static_cast<const StorageType& >(Storage).template GetValue<T>(); }
template <typename T> FORCEINLINE const T&& Target() const&& requires (!bIsRef) && TIsDestructible<typename TDecay<T>::Type>::Value { return static_cast<const StorageType&&>(Storage).template GetValue<T>(); }
constexpr void Swap(TFunctionImpl& InValue) requires (!bIsRef)
{

View File

@ -9,19 +9,28 @@ NAMESPACE_REDCRAFT_BEGIN
NAMESPACE_MODULE_BEGIN(Redcraft)
NAMESPACE_MODULE_BEGIN(Utility)
template <typename T> struct TIsDefaultConstructible : TBoolConstant<NAMESPACE_STD::is_default_constructible_v<T>> { };
template <typename T> struct TIsCopyConstructible : TBoolConstant<NAMESPACE_STD::is_copy_constructible_v<T>> { };
template <typename T> struct TIsMoveConstructible : TBoolConstant<NAMESPACE_STD::is_move_constructible_v<T>> { };
template <typename T> struct TIsCopyAssignable : TBoolConstant<NAMESPACE_STD::is_copy_assignable_v<T>> { };
template <typename T> struct TIsMoveAssignable : TBoolConstant<NAMESPACE_STD::is_move_assignable_v<T>> { };
template <typename T> struct TIsDestructible : TBoolConstant<NAMESPACE_STD::is_destructible_v<T>> { };
template <typename T> struct TIsTriviallyDefaultConstructible : TBoolConstant<NAMESPACE_STD::is_trivially_default_constructible_v<T>> { };
template <typename T> struct TIsTriviallyCopyConstructible : TBoolConstant<NAMESPACE_STD::is_trivially_copy_constructible_v<T>> { };
template <typename T> struct TIsTriviallyMoveConstructible : TBoolConstant<NAMESPACE_STD::is_trivially_move_constructible_v<T>> { };
template <typename T> struct TIsTriviallyCopyAssignable : TBoolConstant<NAMESPACE_STD::is_trivially_copy_assignable_v<T>> { };
template <typename T> struct TIsTriviallyMoveAssignable : TBoolConstant<NAMESPACE_STD::is_trivially_move_assignable_v<T>> { };
template <typename T> struct TIsTriviallyDestructible : TBoolConstant<NAMESPACE_STD::is_trivially_destructible_v<T>> { };
template <typename T> struct THasVirtualDestructor : TBoolConstant<NAMESPACE_STD::has_virtual_destructor_v<T>> { };
NAMESPACE_PRIVATE_BEGIN
// Cpp17Destructible requirements
template <typename T>
struct TIsCpp17Destructible : TBoolConstant<NAMESPACE_STD::is_object_v<T> && !NAMESPACE_STD::is_array_v<T> && NAMESPACE_STD::is_destructible_v<T>> { };
NAMESPACE_PRIVATE_END
template <typename T> struct TIsDefaultConstructible : TBoolConstant<NAMESPACE_STD::is_default_constructible_v<T>> { };
template <typename T> struct TIsCopyConstructible : TBoolConstant<NAMESPACE_STD::is_copy_constructible_v<T>> { };
template <typename T> struct TIsMoveConstructible : TBoolConstant<NAMESPACE_STD::is_move_constructible_v<T>> { };
template <typename T> struct TIsCopyAssignable : TBoolConstant<NAMESPACE_STD::is_copy_assignable_v<T>> { };
template <typename T> struct TIsMoveAssignable : TBoolConstant<NAMESPACE_STD::is_move_assignable_v<T>> { };
template <typename T> struct TIsDestructible : NAMESPACE_PRIVATE::TIsCpp17Destructible<T> { }; // Use Cpp17Destructible requirements instead of std::is_destructible
template <typename T> struct TIsTriviallyDefaultConstructible : TBoolConstant<TIsDefaultConstructible<T>::Value && NAMESPACE_STD::is_trivially_default_constructible_v<T>> { };
template <typename T> struct TIsTriviallyCopyConstructible : TBoolConstant<TIsCopyConstructible<T>::Value && NAMESPACE_STD::is_trivially_copy_constructible_v<T>> { };
template <typename T> struct TIsTriviallyMoveConstructible : TBoolConstant<TIsMoveConstructible<T>::Value && NAMESPACE_STD::is_trivially_move_constructible_v<T>> { };
template <typename T> struct TIsTriviallyCopyAssignable : TBoolConstant<TIsCopyAssignable<T>::Value && NAMESPACE_STD::is_trivially_copy_assignable_v<T>> { };
template <typename T> struct TIsTriviallyMoveAssignable : TBoolConstant<TIsMoveAssignable<T>::Value && NAMESPACE_STD::is_trivially_move_assignable_v<T>> { };
template <typename T> struct TIsTriviallyDestructible : TBoolConstant<TIsDestructible<T>::Value && NAMESPACE_STD::is_trivially_destructible_v<T>> { };
template <typename T> struct THasVirtualDestructor : TBoolConstant<TIsDestructible<T>::Value && NAMESPACE_STD::has_virtual_destructor_v<T>> { };
//template <typename T> struct TIsNothrowDefaultConstructible;
//template <typename T> struct TIsNothrowCopyConstructible;
@ -30,13 +39,15 @@ template <typename T> struct THasVirtualDestructor : TBoolConstant<NA
//template <typename T> struct TIsNothrowMoveAssignable;
//template <typename T> struct TIsNothrowDestructible;
template <typename T, typename U> struct TIsAssignable : TBoolConstant<NAMESPACE_STD::is_assignable_v<T, U>> { };
template <typename T, typename U> struct TIsTriviallyAssignable : TBoolConstant<NAMESPACE_STD::is_trivially_assignable_v<T, U>> { };
template <typename T, typename U> struct TIsAssignable : TBoolConstant<NAMESPACE_STD::is_assignable_v<T, U>> { };
template <typename T, typename U> struct TIsTriviallyAssignable : TBoolConstant<TIsAssignable<T, U>::Value && NAMESPACE_STD::is_trivially_assignable_v<T, U>> { };
//template <typename T, typename U> struct TIsNothrowAssignable;
template <typename T, typename... Args> struct TIsConstructible : TBoolConstant<NAMESPACE_STD::is_constructible_v<T, Args...>> { };
template <typename T, typename... Args> struct TIsTriviallyConstructible : TBoolConstant<NAMESPACE_STD::is_trivially_constructible_v<T, Args...>> { };
template <typename T, typename... Args> struct TIsConstructible : TBoolConstant<NAMESPACE_STD::is_constructible_v<T, Args...>> { };
template <typename T, typename... Args> struct TIsTriviallyConstructible : TBoolConstant<TIsConstructible<T, Args...>::Value && NAMESPACE_STD::is_trivially_constructible_v<T, Args...>> { };
//template <typename T, typename... Args> struct TIsNothrowConstructible;