feat(templates): add Invoke function and corresponding peripheral tools

This commit is contained in:
2022-02-04 21:11:05 +08:00
parent b0c170f803
commit 63fdd34789
9 changed files with 219 additions and 16 deletions

View File

@ -183,6 +183,15 @@ void TestConcepts()
always_check((CSwappableWith<int32&, int32&>));
// Invocable.h
always_check((CInvocable <decltype([]( ) -> void { }) >));
always_check((CRegularInvocable <decltype([](int32 A ) -> int32 { return A; }), int32 >));
always_check((CPredicate <decltype([](int32 A, int32 B, int32 C) -> bool { return (A + B + C) == 0; }), int32, int32, int32 >));
always_check((CRelation <decltype([](int32 A, int32 B ) -> bool { return (A ^ B) == 0; }), int32, int32 >));
always_check((CEquivalenceRelation<decltype([](int32 A, int32 B ) -> bool { return A == B; }), int32, int32 >));
always_check((CStrictWeakOrder <decltype([](int32 A, int32 B ) -> bool { return A < B; }), int32, int32 >));
}
NAMESPACE_MODULE_END(Utility)

View File

@ -0,0 +1,49 @@
#include "Testing/TemplatesTesting.h"
#include "Misc/AssertionMacros.h"
#include "Templates/Templates.h"
NAMESPACE_REDCRAFT_BEGIN
NAMESPACE_MODULE_BEGIN(Redcraft)
NAMESPACE_MODULE_BEGIN(Utility)
void TestTemplates()
{
TestInvoke();
}
NAMESPACE_UNNAMED_BEGIN
int32 TestFunctionA(int32 A, int32 B, int32 C)
{
return A + B + C;
}
struct FTestStructA
{
int32 Num;
FTestStructA(int32 InNum) : Num(InNum) { }
int32 Add(int32 A) const { return Num + A; }
};
NAMESPACE_UNNAMED_END
void TestInvoke()
{
Invoke([=]() { });
FTestStructA TempA(123);
always_check(Invoke(TestFunctionA, 1, 2, 3) == 6);
always_check(Invoke(&FTestStructA::Add, TempA, 1) == 124);
always_check(Invoke(&FTestStructA::Add, &TempA, 1) == 124);
int32 TempB = Invoke(&FTestStructA::Num, &TempA);
int32 TempC = Invoke(&FTestStructA::Num, TempA);
always_check(TempB == 123);
always_check(TempC == 123);
int64 TempD = InvokeResult<int64>(&FTestStructA::Num, &TempA);
int64 TempE = InvokeResult<int64>(&FTestStructA::Num, TempA);
always_check(TempD == 123);
always_check(TempE == 123);
}
NAMESPACE_MODULE_END(Utility)
NAMESPACE_MODULE_END(Redcraft)
NAMESPACE_REDCRAFT_END

View File

@ -313,11 +313,16 @@ void TestTypeTraits()
always_check(!(TIsConvertible<FTestStructE*, FTestStructH*>::Value));
always_check((TIsConvertible<FTestStructW, FTestStructV>::Value));
always_check((TIsInvocable<void, int32()>::Value));
always_check((TIsInvocable<int32, int32()>::Value));
always_check((TIsInvocable<int32, int32(int32), int32>::Value));
always_check(!(TIsInvocable<int32, int32(int32), FTestStructA>::Value));
always_check(!(TIsInvocable<FTestStructA, int32(int32), int32>::Value));
always_check((TIsInvocable<int32()>::Value));
always_check((TIsInvocable<int32(int32), int32>::Value));
always_check(!(TIsInvocable<int32(int32), FTestStructA>::Value));
always_check((TIsInvocable<int32(int32), int32>::Value));
always_check((TIsInvocableResult<void, int32()>::Value));
always_check((TIsInvocableResult<int32, int32()>::Value));
always_check((TIsInvocableResult<int32, int32(int32), int32>::Value));
always_check(!(TIsInvocableResult<int32, int32(int32), FTestStructA>::Value));
always_check(!(TIsInvocableResult<FTestStructA, int32(int32), int32>::Value));
always_check((TIsSame<int32, TRemoveConst<int32>::Type>::Value));
always_check(!(TIsSame<int32, TRemoveConst<int32*>::Type>::Value));