feat(templates): add Invoke function and corresponding peripheral tools
This commit is contained in:
@ -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)
|
||||
|
49
Redcraft.Utility/Source/Private/Testing/TemplatesTesting.cpp
Normal file
49
Redcraft.Utility/Source/Private/Testing/TemplatesTesting.cpp
Normal 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
|
@ -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));
|
||||
|
Reference in New Issue
Block a user