perf(templates): add requires on the content of TOptional and TVariant
This commit is contained in:
parent
e03cfa956c
commit
e0aab7e0b9
@ -9,7 +9,7 @@ NAMESPACE_REDCRAFT_BEGIN
|
|||||||
NAMESPACE_MODULE_BEGIN(Redcraft)
|
NAMESPACE_MODULE_BEGIN(Redcraft)
|
||||||
NAMESPACE_MODULE_BEGIN(Utility)
|
NAMESPACE_MODULE_BEGIN(Utility)
|
||||||
|
|
||||||
template <typename OptionalType>
|
template <typename OptionalType> requires (TIsObject<OptionalType>::Value && !TIsArray<OptionalType>::Value&& TIsDestructible<OptionalType>::Value)
|
||||||
struct TOptional
|
struct TOptional
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -85,7 +85,7 @@ template <typename T>
|
|||||||
constexpr void VariantCopyConstruct(void* Target, const void* Source)
|
constexpr void VariantCopyConstruct(void* Target, const void* Source)
|
||||||
{
|
{
|
||||||
if constexpr (!TIsCopyConstructible<T>::Value || TIsConst<T>::Value) check_no_entry();
|
if constexpr (!TIsCopyConstructible<T>::Value || TIsConst<T>::Value) check_no_entry();
|
||||||
new(reinterpret_cast<T*>(Target)) T(*reinterpret_cast<const T*>(Source));
|
else new(reinterpret_cast<T*>(Target)) T(*reinterpret_cast<const T*>(Source));
|
||||||
}
|
}
|
||||||
|
|
||||||
using FVariantCopyConstructFunc = void(*)(void*, const void*);
|
using FVariantCopyConstructFunc = void(*)(void*, const void*);
|
||||||
@ -94,7 +94,7 @@ template <typename T>
|
|||||||
constexpr void VariantMoveConstruct(void* Target, void* Source)
|
constexpr void VariantMoveConstruct(void* Target, void* Source)
|
||||||
{
|
{
|
||||||
if constexpr (!TIsMoveConstructible<T>::Value || TIsConst<T>::Value) check_no_entry();
|
if constexpr (!TIsMoveConstructible<T>::Value || TIsConst<T>::Value) check_no_entry();
|
||||||
new(reinterpret_cast<T*>(Target)) T(MoveTemp(*reinterpret_cast<T*>(Source)));
|
else new(reinterpret_cast<T*>(Target)) T(MoveTemp(*reinterpret_cast<T*>(Source)));
|
||||||
}
|
}
|
||||||
|
|
||||||
using FVariantMoveConstructFunc = void(*)(void*, void*);
|
using FVariantMoveConstructFunc = void(*)(void*, void*);
|
||||||
@ -103,7 +103,7 @@ template <typename T>
|
|||||||
constexpr void VariantCopyAssign(void* Target, const void* Source)
|
constexpr void VariantCopyAssign(void* Target, const void* Source)
|
||||||
{
|
{
|
||||||
if constexpr (!TIsCopyAssignable<T>::Value || TIsConst<T>::Value) check_no_entry();
|
if constexpr (!TIsCopyAssignable<T>::Value || TIsConst<T>::Value) check_no_entry();
|
||||||
*reinterpret_cast<T*>(Target) = *reinterpret_cast<const T*>(Source);
|
else *reinterpret_cast<T*>(Target) = *reinterpret_cast<const T*>(Source);
|
||||||
}
|
}
|
||||||
|
|
||||||
using FVariantCopyAssignFunc = void(*)(void*, const void*);
|
using FVariantCopyAssignFunc = void(*)(void*, const void*);
|
||||||
@ -112,7 +112,7 @@ template <typename T>
|
|||||||
constexpr void VariantMoveAssign(void* Target, void* Source)
|
constexpr void VariantMoveAssign(void* Target, void* Source)
|
||||||
{
|
{
|
||||||
if constexpr (!TIsMoveAssignable<T>::Value || TIsConst<T>::Value) check_no_entry();
|
if constexpr (!TIsMoveAssignable<T>::Value || TIsConst<T>::Value) check_no_entry();
|
||||||
*reinterpret_cast<T*>(Target) = MoveTemp(*reinterpret_cast<T*>(Source));
|
else *reinterpret_cast<T*>(Target) = MoveTemp(*reinterpret_cast<T*>(Source));
|
||||||
}
|
}
|
||||||
|
|
||||||
using FVariantMoveAssignFunc = void(*)(void*, void*);
|
using FVariantMoveAssignFunc = void(*)(void*, void*);
|
||||||
@ -149,14 +149,6 @@ struct TVariantHelper
|
|||||||
static constexpr FVariantInequalityOperatorFunc InequalityOperatorFuncs[] = { VariantInequalityOperator<Types>... };
|
static constexpr FVariantInequalityOperatorFunc InequalityOperatorFuncs[] = { VariantInequalityOperator<Types>... };
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename... Types> constexpr FVariantDestroyFunc TVariantHelper<Types...>::DestroyFuncs[];
|
|
||||||
template <typename... Types> constexpr FVariantCopyConstructFunc TVariantHelper<Types...>::CopyConstructFuncs[];
|
|
||||||
template <typename... Types> constexpr FVariantMoveConstructFunc TVariantHelper<Types...>::MoveConstructFuncs[];
|
|
||||||
template <typename... Types> constexpr FVariantCopyAssignFunc TVariantHelper<Types...>::CopyAssignFuncs[];
|
|
||||||
template <typename... Types> constexpr FVariantMoveAssignFunc TVariantHelper<Types...>::MoveAssignFuncs[];
|
|
||||||
template <typename... Types> constexpr FVariantEqualityOperatorFunc TVariantHelper<Types...>::EqualityOperatorFuncs[];
|
|
||||||
template <typename... Types> constexpr FVariantInequalityOperatorFunc TVariantHelper<Types...>::InequalityOperatorFuncs[];
|
|
||||||
|
|
||||||
template <typename R, typename F, typename T>
|
template <typename R, typename F, typename T>
|
||||||
constexpr R VariantVisitLValue(F&& Func, void* Arg)
|
constexpr R VariantVisitLValue(F&& Func, void* Arg)
|
||||||
{
|
{
|
||||||
@ -210,14 +202,9 @@ struct TVariantVisitHelper
|
|||||||
static constexpr FVariantVisitConstRValueFunc<R, F> VisitConstRValueFuncs[] = { VariantVisitConstRValue<R, F, Types>... };
|
static constexpr FVariantVisitConstRValueFunc<R, F> VisitConstRValueFuncs[] = { VariantVisitConstRValue<R, F, Types>... };
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename R, typename F, typename... Types> constexpr FVariantVisitLValueFunc<R, F> TVariantVisitHelper<R, F, Types...>::VisitLValueFuncs[];
|
|
||||||
template <typename R, typename F, typename... Types> constexpr FVariantVisitRValueFunc<R, F> TVariantVisitHelper<R, F, Types...>::VisitRValueFuncs[];
|
|
||||||
template <typename R, typename F, typename... Types> constexpr FVariantVisitConstLValueFunc<R, F> TVariantVisitHelper<R, F, Types...>::VisitConstLValueFuncs[];
|
|
||||||
template <typename R, typename F, typename... Types> constexpr FVariantVisitConstRValueFunc<R, F> TVariantVisitHelper<R, F, Types...>::VisitConstRValueFuncs[];
|
|
||||||
|
|
||||||
NAMESPACE_PRIVATE_END
|
NAMESPACE_PRIVATE_END
|
||||||
|
|
||||||
template <typename... Types>
|
template <typename... Types> requires (true && ... && (TIsObject<Types>::Value && !TIsArray<Types>::Value && TIsDestructible<Types>::Value))
|
||||||
struct TVariant
|
struct TVariant
|
||||||
{
|
{
|
||||||
struct FAlternativeSize : TConstant<size_t, sizeof...(Types)> { };
|
struct FAlternativeSize : TConstant<size_t, sizeof...(Types)> { };
|
||||||
@ -241,7 +228,7 @@ struct TVariant
|
|||||||
if (GetIndex() != INDEX_NONE) FHelper::MoveConstructFuncs[InValue.GetIndex()](&Value, &InValue.Value);
|
if (GetIndex() != INDEX_NONE) FHelper::MoveConstructFuncs[InValue.GetIndex()](&Value, &InValue.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t I, typename... ArgTypes> requires (I < FAlternativeSize::Value)
|
template <size_t I, typename... ArgTypes> requires (I < FAlternativeSize::Value)
|
||||||
&& TIsConstructible<typename TAlternativeType<I>::Type, ArgTypes...>::Value
|
&& TIsConstructible<typename TAlternativeType<I>::Type, ArgTypes...>::Value
|
||||||
constexpr explicit TVariant(TInPlaceIndex<I>, ArgTypes&&... Args)
|
constexpr explicit TVariant(TInPlaceIndex<I>, ArgTypes&&... Args)
|
||||||
: TypeIndex(I)
|
: TypeIndex(I)
|
||||||
@ -250,7 +237,7 @@ struct TVariant
|
|||||||
new(&Value) SelectedType(Forward<ArgTypes>(Args)...);
|
new(&Value) SelectedType(Forward<ArgTypes>(Args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename... ArgTypes> requires (TAlternativeIndex<T>::Value != INDEX_NONE)
|
template <typename T, typename... ArgTypes> requires (TAlternativeIndex<T>::Value != INDEX_NONE)
|
||||||
&& TIsConstructible<typename TAlternativeType<TAlternativeIndex<T>::Value>::Type, ArgTypes...>::Value
|
&& TIsConstructible<typename TAlternativeType<TAlternativeIndex<T>::Value>::Type, ArgTypes...>::Value
|
||||||
constexpr explicit TVariant(TInPlaceType<T>, ArgTypes&&... Args)
|
constexpr explicit TVariant(TInPlaceType<T>, ArgTypes&&... Args)
|
||||||
: TVariant(InPlaceIndex<TAlternativeIndex<T>::Value>, Forward<ArgTypes>(Args)...)
|
: TVariant(InPlaceIndex<TAlternativeIndex<T>::Value>, Forward<ArgTypes>(Args)...)
|
||||||
|
Loading…
Reference in New Issue
Block a user