feat(templates): add type traits to determine if it is TAny etc

This commit is contained in:
_Redstone_c_ 2022-03-31 17:36:48 +08:00
parent 54ab72224f
commit 5f4b0d8c22
6 changed files with 33 additions and 24 deletions

View File

@ -119,12 +119,12 @@ struct TAnyRTTIHelper
}; };
}; };
inline constexpr size_t ANY_DEFAULT_INLINE_SIZE = 64 - sizeof(FTypeInfo) - sizeof(const FAnyRTTI*);
inline constexpr size_t ANY_DEFAULT_INLINE_ALIGNMENT = Memory::MINIMUM_ALIGNMENT;
NAMESPACE_PRIVATE_END NAMESPACE_PRIVATE_END
template <size_t InlineSize, size_t InlineAlignment = NAMESPACE_PRIVATE::ANY_DEFAULT_INLINE_ALIGNMENT> inline constexpr size_t ANY_DEFAULT_INLINE_SIZE = 64 - sizeof(FTypeInfo) - sizeof(const NAMESPACE_PRIVATE::FAnyRTTI*);
inline constexpr size_t ANY_DEFAULT_INLINE_ALIGNMENT = Memory::MINIMUM_ALIGNMENT;
template <size_t InlineSize, size_t InlineAlignment = ANY_DEFAULT_INLINE_ALIGNMENT>
struct TAny struct TAny
{ {
template <typename T> template <typename T>
@ -186,7 +186,7 @@ struct TAny
} }
} }
template <typename T> requires (!TIsSame<typename TDecay<T>::Type, TAny>::Value) && (!TIsInPlaceTypeSpecialization<typename TDecay<T>::Type>::Value) 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 && 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 && TIsConstructible<typename TDecay<T>::Type, T&&>::Value
TAny(T&& InValue) : TAny(InPlaceType<typename TDecay<T>::Type>, Forward<T>(InValue)) TAny(T&& InValue) : TAny(InPlaceType<typename TDecay<T>::Type>, Forward<T>(InValue))
@ -255,7 +255,7 @@ struct TAny
return *this; return *this;
} }
template <typename T> requires (!TIsSame<typename TDecay<T>::Type, TAny>::Value) && (!TIsInPlaceTypeSpecialization<typename TDecay<T>::Type>::Value) 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 && 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 && TIsConstructible<typename TDecay<T>::Type, T&&>::Value
TAny& operator=(T&& InValue) TAny& operator=(T&& InValue)
@ -451,7 +451,10 @@ constexpr void Swap(TAny<InlineSize, InlineAlignment>& A, TAny<InlineSize, Inlin
B = MoveTemp(Temp); B = MoveTemp(Temp);
} }
using FAny = TAny<NAMESPACE_PRIVATE::ANY_DEFAULT_INLINE_SIZE>; template <typename T> struct TIsTAny : FFalse { };
template <size_t InlineSize, size_t InlineAlignment> struct TIsTAny<TAny<InlineSize, InlineAlignment>> : FTrue { };
using FAny = TAny<ANY_DEFAULT_INLINE_SIZE>;
static_assert(sizeof(FAny) == 64, "The byte size of FAny is unexpected"); static_assert(sizeof(FAny) == 64, "The byte size of FAny is unexpected");

View File

@ -321,6 +321,9 @@ constexpr void Swap(TOptional<T>& A, TOptional<T>& B)
Swap(*A, *B); Swap(*A, *B);
} }
template <typename T> struct TIsTOptional : FFalse { };
template <typename T> struct TIsTOptional<TOptional<T>> : FTrue { };
NAMESPACE_MODULE_END(Utility) NAMESPACE_MODULE_END(Utility)
NAMESPACE_MODULE_END(Redcraft) NAMESPACE_MODULE_END(Redcraft)
NAMESPACE_REDCRAFT_END NAMESPACE_REDCRAFT_END

View File

@ -40,6 +40,9 @@ private:
template <typename T> template <typename T>
TReferenceWrapper(T&) -> TReferenceWrapper<T>; TReferenceWrapper(T&) -> TReferenceWrapper<T>;
template <typename T> struct TIsTReferenceWrapper : FFalse { };
template <typename T> struct TIsTReferenceWrapper<TReferenceWrapper<T>> : FTrue { };
template <typename T> struct TUnwrapReference { using Type = T; }; template <typename T> struct TUnwrapReference { using Type = T; };
template <typename T> struct TUnwrapReference<TReferenceWrapper<T>> { using Type = T&; }; template <typename T> struct TUnwrapReference<TReferenceWrapper<T>> { using Type = T&; };

View File

@ -379,16 +379,16 @@ TTuple(Types...) -> TTuple<Types...>;
template <typename T, typename U> template <typename T, typename U>
using TPair = TTuple<T, U>; using TPair = TTuple<T, U>;
template <typename T > struct TIsTupleSpecialization : FFalse { }; template <typename T > struct TIsTTuple : FFalse { };
template <typename... Types> struct TIsTupleSpecialization<TTuple<Types...>> : FTrue { }; template <typename... Types> struct TIsTTuple<TTuple<Types...>> : FTrue { };
template <typename TupleType> requires TIsTupleSpecialization<typename TRemoveCVRef<TupleType>::Type>::Value template <typename TupleType> requires TIsTTuple<typename TRemoveCVRef<TupleType>::Type>::Value
struct TTupleElementSize : TConstant<size_t, TRemoveCVRef<TupleType>::Type::ElementSize> { }; struct TTupleElementSize : TConstant<size_t, TRemoveCVRef<TupleType>::Type::ElementSize> { };
template <size_t I, typename TupleType> requires TIsTupleSpecialization<typename TRemoveCVRef<TupleType>::Type>::Value template <size_t I, typename TupleType> requires TIsTTuple<typename TRemoveCVRef<TupleType>::Type>::Value
struct TTupleElementType { using Type = typename TCopyCVRef<typename TRemoveReference<TupleType>::Type, typename TRemoveCVRef<TupleType>::Type::template TElementType<I>::Type>::Type; }; struct TTupleElementType { using Type = typename TCopyCVRef<typename TRemoveReference<TupleType>::Type, typename TRemoveCVRef<TupleType>::Type::template TElementType<I>::Type>::Type; };
template <typename T, typename TupleType> requires TIsTupleSpecialization<typename TRemoveCVRef<TupleType>::Type>::Value template <typename T, typename TupleType> requires TIsTTuple<typename TRemoveCVRef<TupleType>::Type>::Value
struct TTupleElementIndex : TupleType::template TElementIndex<T> { }; struct TTupleElementIndex : TupleType::template TElementIndex<T> { };
template <typename... Types> template <typename... Types>
@ -553,10 +553,10 @@ struct TTupleVisitImpl<TIndexSequence<>>
NAMESPACE_PRIVATE_END NAMESPACE_PRIVATE_END
template <typename... TTupleTypes> requires (true && ... && (TIsTupleSpecialization<typename TRemoveCVRef<TTupleTypes>::Type>::Value)) template <typename... TTupleTypes> requires (true && ... && (TIsTTuple<typename TRemoveCVRef<TTupleTypes>::Type>::Value))
struct TTupleCatResult { using Type = typename NAMESPACE_PRIVATE::TTupleCatResultImpl<typename TRemoveReference<TTupleTypes>::Type..., NAMESPACE_PRIVATE::FTupleEndFlag>::Type; }; struct TTupleCatResult { using Type = typename NAMESPACE_PRIVATE::TTupleCatResultImpl<typename TRemoveReference<TTupleTypes>::Type..., NAMESPACE_PRIVATE::FTupleEndFlag>::Type; };
template <typename... TTupleTypes> requires (true && ... && (TIsTupleSpecialization<typename TRemoveCVRef<TTupleTypes>::Type>::Value)) template <typename... TTupleTypes> requires (true && ... && (TIsTTuple<typename TRemoveCVRef<TTupleTypes>::Type>::Value))
constexpr auto TupleCat(TTupleTypes&&... Args) constexpr auto TupleCat(TTupleTypes&&... Args)
{ {
using R = typename TTupleCatResult<TTupleTypes...>::Type; using R = typename TTupleCatResult<TTupleTypes...>::Type;

View File

@ -245,7 +245,7 @@ struct TVariant
{ } { }
template <typename T> requires NAMESPACE_PRIVATE::TVariantSelectedType<typename TRemoveReference<T>::Type, Types...>::Value template <typename T> requires NAMESPACE_PRIVATE::TVariantSelectedType<typename TRemoveReference<T>::Type, Types...>::Value
&& (!TIsInPlaceTypeSpecialization<typename TRemoveCVRef<T>::Type>::Value) && (!TIsInPlaceIndexSpecialization<typename TRemoveCVRef<T>::Type>::Value) && (!TIsTInPlaceType<typename TRemoveCVRef<T>::Type>::Value) && (!TIsTInPlaceIndex<typename TRemoveCVRef<T>::Type>::Value)
&& (!TIsSame<typename TRemoveCVRef<T>::Type, TVariant>::Value) && (!TIsSame<typename TRemoveCVRef<T>::Type, TVariant>::Value)
constexpr TVariant(T&& InValue) : TVariant(InPlaceType<typename NAMESPACE_PRIVATE::TVariantSelectedType<typename TRemoveReference<T>::Type, Types...>::Type>, Forward<T>(InValue)) constexpr TVariant(T&& InValue) : TVariant(InPlaceType<typename NAMESPACE_PRIVATE::TVariantSelectedType<typename TRemoveReference<T>::Type, Types...>::Type>, Forward<T>(InValue))
{ } { }
@ -532,16 +532,16 @@ constexpr void Swap(TVariant<Types...>& A, TVariant<Types...>& B)
B = MoveTemp(Temp); B = MoveTemp(Temp);
} }
template <typename T > struct TIsVariantSpecialization : FFalse { }; template <typename T > struct TIsTVariant : FFalse { };
template <typename... Types> struct TIsVariantSpecialization<TVariant<Types...>> : FTrue { }; template <typename... Types> struct TIsTVariant<TVariant<Types...>> : FTrue { };
template <typename VariantType> requires TIsVariantSpecialization<typename TRemoveCVRef<VariantType>::Type>::Value template <typename VariantType> requires TIsTVariant<typename TRemoveCVRef<VariantType>::Type>::Value
struct TVariantAlternativeSize : TConstant<size_t, VariantType::AlternativeSize> { }; struct TVariantAlternativeSize : TConstant<size_t, VariantType::AlternativeSize> { };
template <size_t I, typename VariantType> requires TIsVariantSpecialization<typename TRemoveCVRef<VariantType>::Type>::Value template <size_t I, typename VariantType> requires TIsTVariant<typename TRemoveCVRef<VariantType>::Type>::Value
struct TVariantAlternativeType { using Type = typename TCopyCV<typename TRemoveReference<VariantType>::Type, typename TRemoveCVRef<VariantType>::Type::template TAlternativeType<I>::Type>::Type; }; struct TVariantAlternativeType { using Type = typename TCopyCV<typename TRemoveReference<VariantType>::Type, typename TRemoveCVRef<VariantType>::Type::template TAlternativeType<I>::Type>::Type; };
template <typename T, typename VariantType> requires TIsVariantSpecialization<typename TRemoveCVRef<VariantType>::Type>::Value template <typename T, typename VariantType> requires TIsTVariant<typename TRemoveCVRef<VariantType>::Type>::Value
struct TVariantAlternativeIndex : VariantType::template TAlternativeIndex<T> { }; struct TVariantAlternativeIndex : VariantType::template TAlternativeIndex<T> { };
NAMESPACE_MODULE_END(Utility) NAMESPACE_MODULE_END(Utility)

View File

@ -7,11 +7,11 @@ NAMESPACE_REDCRAFT_BEGIN
NAMESPACE_MODULE_BEGIN(Redcraft) NAMESPACE_MODULE_BEGIN(Redcraft)
NAMESPACE_MODULE_BEGIN(Utility) NAMESPACE_MODULE_BEGIN(Utility)
template <typename T> struct TIsInPlaceTypeSpecialization : FFalse { }; template <typename T> struct TIsTInPlaceType : FFalse { };
template <typename T> struct TIsInPlaceTypeSpecialization<TInPlaceType<T>> : FTrue { }; template <typename T> struct TIsTInPlaceType<TInPlaceType<T>> : FTrue { };
template <typename T> struct TIsInPlaceIndexSpecialization : FFalse { }; template <typename T> struct TIsTInPlaceIndex : FFalse { };
template <size_t I> struct TIsInPlaceIndexSpecialization<TInPlaceIndex<I>> : FTrue { }; template <size_t I> struct TIsTInPlaceIndex<TInPlaceIndex<I>> : FTrue { };
NAMESPACE_MODULE_END(Utility) NAMESPACE_MODULE_END(Utility)
NAMESPACE_MODULE_END(Redcraft) NAMESPACE_MODULE_END(Redcraft)