feat(templates): add TVariant and the corresponding testing
This commit is contained in:
@ -2,6 +2,10 @@
|
||||
#include "Miscellaneous/AssertionMacros.h"
|
||||
#include "Templates/Templates.h"
|
||||
|
||||
#pragma warning(disable : 4930)
|
||||
#pragma warning(disable : 4101)
|
||||
#pragma warning(disable : 4244)
|
||||
|
||||
NAMESPACE_REDCRAFT_BEGIN
|
||||
NAMESPACE_MODULE_BEGIN(Redcraft)
|
||||
NAMESPACE_MODULE_BEGIN(Utility)
|
||||
@ -12,6 +16,7 @@ void TestTemplates()
|
||||
TestReferenceWrapper();
|
||||
TestCompare();
|
||||
TestOptional();
|
||||
TestVariant();
|
||||
TestMiscellaneous();
|
||||
}
|
||||
|
||||
@ -270,6 +275,172 @@ void TestOptional()
|
||||
TempZ = FTracker();
|
||||
}
|
||||
|
||||
void TestVariant()
|
||||
{
|
||||
TVariant<int32> TempA;
|
||||
TVariant<int32> TempB(Invalid);
|
||||
TVariant<int32> TempC(InPlaceType<int32>, 0);
|
||||
TVariant<int32> TempD(0);
|
||||
TVariant<int32> TempE(0l);
|
||||
TVariant<int32> TempF(0.0);
|
||||
TVariant<int32> TempG(TempA);
|
||||
TVariant<int32> TempH(TempD);
|
||||
TVariant<int32> TempI(TVariant<int32>(0));
|
||||
TVariant<int32> TempJ(TVariant<int32>(Invalid));
|
||||
|
||||
TVariant<int32> TempK, TempL, TempM, TempN;
|
||||
TempK = TempA;
|
||||
TempL = TempD;
|
||||
TempM = TVariant<int32>(0);
|
||||
TempN = TVariant<int32>(Invalid);
|
||||
|
||||
TempL = 303;
|
||||
TempM = 404;
|
||||
|
||||
TVariant<int32> TempO;
|
||||
TempO.Emplace<int32>(202);
|
||||
TempO.Emplace<0>(404);
|
||||
|
||||
always_check(TempO);
|
||||
always_check(TempO.IsValid());
|
||||
|
||||
always_check(TempO == 404);
|
||||
always_check(TempO.GetValue<int32>() == 404);
|
||||
always_check(TempO.Get<0>(500) == 404);
|
||||
|
||||
TempO.Reset();
|
||||
always_check(TempO == TempO);
|
||||
always_check(!(TempO != TempO));
|
||||
always_check(TempO.Get<int32>(500) == 500);
|
||||
|
||||
int32 TempP = 200;
|
||||
TempO = TempP;
|
||||
TempO = 300;
|
||||
|
||||
always_check(TempO != TempA);
|
||||
always_check(TempO != TempD);
|
||||
always_check(TempO == TempO);
|
||||
always_check(TempO == 300);
|
||||
always_check(300 == TempO);
|
||||
|
||||
Swap(TempD, TempA);
|
||||
|
||||
int16 TempQ = 1024;
|
||||
TVariant<int16, int32> TempR = TempQ;
|
||||
|
||||
TVariant<int16, int32> TempS(InPlaceType<int32>, TempQ);
|
||||
TVariant<int16, int32> TempT(TempQ);
|
||||
TVariant<int16, int32> TempU(TempR);
|
||||
TVariant<int16, int32> TempV(TVariant<int16, int32>(2048));
|
||||
|
||||
TVariant<int16, int32> TempW, TempX, TempY;
|
||||
TempW = TempQ;
|
||||
TempX = TempR;
|
||||
TempY = TVariant<int16, int32>(2048);
|
||||
|
||||
Swap(TempW, TempX);
|
||||
Swap(TempW, TempX);
|
||||
|
||||
struct FTracker
|
||||
{
|
||||
FTracker() { }
|
||||
FTracker(const FTracker& InValue) { always_check_no_entry(); }
|
||||
FTracker(FTracker&& InValue) { }
|
||||
FTracker& operator=(const FTracker& InValue) { always_check_no_entry(); return *this; }
|
||||
FTracker& operator=(FTracker&& InValue) { return *this; }
|
||||
};
|
||||
|
||||
TVariant<FTracker> TempZ(Invalid);
|
||||
TempZ = TVariant<FTracker>();
|
||||
TempZ = FTracker();
|
||||
|
||||
always_check((TIsSame<int32, TVariantAlternativeType<0, TVariant<int32, float>>::Type>::Value));
|
||||
always_check((TIsSame<float, TVariantAlternativeType<1, TVariant<int32, float>>::Type>::Value));
|
||||
always_check((TIsSame<const int32, TVariantAlternativeType<0, const TVariant<int32, float>>::Type>::Value));
|
||||
|
||||
always_check((TVariantAlternativeIndex<int32, TVariant<int32, float>>::Value == 0));
|
||||
always_check((TVariantAlternativeIndex<float, TVariant<int32, float>>::Value == 1));
|
||||
|
||||
bool bIsConst;
|
||||
bool bIsLValue;
|
||||
bool bIsRValue;
|
||||
|
||||
auto TestQualifiers = [&bIsConst, &bIsLValue, &bIsRValue](auto&& Arg) -> int32
|
||||
{
|
||||
using T = decltype(Arg);
|
||||
always_check(Arg == 10);
|
||||
always_check(TIsConst<typename TRemoveReference<T>::Type>::Value == bIsConst);
|
||||
always_check(TIsLValueReference<T>::Value == bIsLValue);
|
||||
always_check(TIsRValueReference<T>::Value == bIsRValue);
|
||||
return 0;
|
||||
};
|
||||
|
||||
bIsConst = false;
|
||||
bIsLValue = true;
|
||||
bIsRValue = false;
|
||||
|
||||
TVariant<int32> TempLA = 10;
|
||||
auto ReturnLA = TempLA.Visit(TestQualifiers);
|
||||
always_check((TIsSame<int32, decltype(ReturnLA)>::Value));
|
||||
|
||||
bIsConst = true;
|
||||
bIsLValue = true;
|
||||
bIsRValue = false;
|
||||
|
||||
const TVariant<int32> TempLB = TempLA;
|
||||
auto ReturnLB = TempLB.Visit(TestQualifiers);
|
||||
always_check((TIsSame<int32, decltype(ReturnLB)>::Value));
|
||||
|
||||
bIsConst = false;
|
||||
bIsLValue = false;
|
||||
bIsRValue = true;
|
||||
|
||||
TVariant<int32> TempRA = 10;
|
||||
auto ReturnRA = MoveTemp(TempRA).Visit(TestQualifiers);
|
||||
always_check((TIsSame<int32, decltype(ReturnRA)>::Value));
|
||||
|
||||
bIsConst = true;
|
||||
bIsLValue = false;
|
||||
bIsRValue = true;
|
||||
|
||||
const TVariant<int32> TempRB = TempLA;
|
||||
auto ReturnRB = MoveTemp(TempRB).Visit(TestQualifiers);
|
||||
always_check((TIsSame<int32, decltype(ReturnRB)>::Value));
|
||||
|
||||
bIsConst = false;
|
||||
bIsLValue = true;
|
||||
bIsRValue = false;
|
||||
|
||||
TVariant<int32> TempLC = 10;
|
||||
auto ReturnLC = TempLC.Visit<int32>(TestQualifiers);
|
||||
always_check((TIsSame<int32, decltype(ReturnLC)>::Value));
|
||||
|
||||
bIsConst = true;
|
||||
bIsLValue = true;
|
||||
bIsRValue = false;
|
||||
|
||||
const TVariant<int32> TempLD = TempLC;
|
||||
auto ReturnLD = TempLD.Visit<int32>(TestQualifiers);
|
||||
always_check((TIsSame<int32, decltype(ReturnLD)>::Value));
|
||||
|
||||
bIsConst = false;
|
||||
bIsLValue = false;
|
||||
bIsRValue = true;
|
||||
|
||||
TVariant<int32> TempRC = 10;
|
||||
auto ReturnRC = MoveTemp(TempRC).Visit<int32>(TestQualifiers);
|
||||
always_check((TIsSame<int32, decltype(ReturnRC)>::Value));
|
||||
|
||||
bIsConst = true;
|
||||
bIsLValue = false;
|
||||
bIsRValue = true;
|
||||
|
||||
const TVariant<int32> TempRD = TempLC;
|
||||
auto ReturnRD = MoveTemp(TempRD).Visit<int32>(TestQualifiers);
|
||||
always_check((TIsSame<int32, decltype(ReturnRD)>::Value));
|
||||
|
||||
}
|
||||
|
||||
NAMESPACE_UNNAMED_BEGIN
|
||||
|
||||
template <typename T>
|
||||
|
Reference in New Issue
Block a user