#include "Testing/ConceptsTesting.h" #include "Miscellaneous/AssertionMacros.h" #include "Concepts/Concepts.h" NAMESPACE_REDCRAFT_BEGIN NAMESPACE_MODULE_BEGIN(Redcraft) NAMESPACE_MODULE_BEGIN(Utility) // Warning: The test here is not a complete test, it is only used to determine whether the environment supports the concepts NAMESPACE_UNNAMED_BEGIN int32 TestObject; void TestFunction() { } struct FTestStructA { }; struct FTestStructB : FTestStructA { int32 Member; }; struct FTestStructC { FTestStructC() { } }; struct FTestStructD { FTestStructD(const FTestStructD&) { } }; struct FTestStructE { virtual void Member() = 0; }; struct FTestStructF { int32 MemberA; private: int32 MemberB; }; struct FTestStructG { char MemberA; float MemberB; short MemberC; int MemberD; }; struct FTestStructH final : FTestStructE { virtual void Member() override { } }; struct FTestStructI { int32 MemberA; double MemberB; FTestStructI(int32 A, double B) { } FTestStructI& operator=(int32) { return *this; }; }; struct FTestStructJ { int32 MemberA; double MemberB; FTestStructJ() { }; }; struct FTestStructK { int32 MemberA; double MemberB; FTestStructK() = default; }; struct FTestStructL { int32 MemberA; double MemberB; FTestStructL() = delete; }; struct FTestStructM { int32 MemberA; double MemberB; FTestStructM(const FTestStructM&) { }; FTestStructM& operator=(const FTestStructM&) { return *this; }; }; struct FTestStructN { int32 MemberA; double MemberB; FTestStructN(const FTestStructN&) = default; FTestStructN& operator=(const FTestStructN&) = default; }; struct FTestStructO { int32 MemberA; double MemberB; FTestStructO(const FTestStructO&) = delete; FTestStructO& operator=(const FTestStructO&) = delete; }; struct FTestStructP { int32 MemberA; double MemberB; FTestStructP(FTestStructP&&) { }; FTestStructP& operator=(FTestStructP&&) { return *this; }; }; struct FTestStructQ { int32 MemberA; double MemberB; FTestStructQ(FTestStructQ&&) = default; FTestStructQ& operator=(FTestStructQ&&) = default; }; struct FTestStructR { int32 MemberA; double MemberB; FTestStructR(FTestStructR&&) = delete; FTestStructR& operator=(FTestStructR&&) = delete; }; struct FTestStructS { int32 MemberA; double MemberB; ~FTestStructS() { } }; struct FTestStructT { int32 MemberA; double MemberB; ~FTestStructT() = default; }; struct FTestStructU { int32 MemberA; double MemberB; ~FTestStructU() = delete; }; struct FTestStructV { int32 MemberA; double MemberB; virtual ~FTestStructV() { }; }; struct FTestStructW { int32 MemberA; double MemberB; operator FTestStructV() { return FTestStructV(); } }; enum ETestEnum { }; enum class ETestEnumClass { }; enum class ETestEnumClass8 : uint8 { }; enum class ETestEnumClass32 : uint32 { }; enum class ETestEnumClass64 : uint64 { }; union FTestUnion { }; NAMESPACE_UNNAMED_END void TestConcepts() { // Same.h always_check(!(CSameAs)); always_check((CSameAs)); // Destructible.h always_check(CDestructible); always_check(CDestructible); always_check(!CDestructible); // Derived.h always_check(!(CDerivedFrom)); always_check((CDerivedFrom)); always_check(!(CDerivedFrom)); // Convertible.h always_check((CConvertibleTo)); always_check(!(CConvertibleTo)); always_check((CConvertibleTo)); always_check(!(CConvertibleTo)); always_check((CConvertibleTo)); // Constructible.h always_check((CConstructibleFrom)); always_check((CConstructibleFrom)); always_check(!(CConstructibleFrom)); always_check((CConstructibleFrom)); always_check((CConstructibleFrom)); always_check(!CDefaultInitializable); always_check(CDefaultInitializable); always_check(CDefaultInitializable); always_check(!CDefaultInitializable); always_check(CMoveConstructible); always_check(CMoveConstructible); always_check(!CMoveConstructible); always_check(CCopyConstructible); always_check(CCopyConstructible); always_check(!CCopyConstructible); // BuiltinType.h always_check(CIntegral); always_check(CIntegral); always_check(!CIntegral); always_check(CSignedIntegral); always_check(!CSignedIntegral); always_check(!CUnsignedIntegral); always_check(CUnsignedIntegral); always_check(!CNonBooleanIntegral); always_check(CNonBooleanIntegral); always_check(!CNonBooleanIntegral); always_check(!CFloatingPoint); always_check(CFloatingPoint); // BooleanTestable.h always_check(CBooleanTestable); always_check(CBooleanTestable); always_check(CBooleanTestable); always_check(!CBooleanTestable); // Assignable.h always_check((CAssignableFrom)); always_check((CAssignableFrom)); always_check((CAssignableFrom)); always_check(!(CAssignableFrom)); always_check(!(CAssignableFrom)); // Common.h always_check((CCommonWith)); always_check((CCommonWith)); always_check((CCommonWith)); always_check(!(CCommonWith)); always_check((CCommonReferenceWith)); always_check((CCommonReferenceWith)); always_check((CCommonReferenceWith)); always_check(!(CCommonReferenceWith)); // Comparable.h always_check((CEqualityComparable)); always_check(!(CEqualityComparable)); always_check((CEqualityComparableWith)); always_check((CEqualityComparableWith)); always_check(!(CEqualityComparableWith)); always_check((CTotallyOrdered)); always_check(!(CTotallyOrdered)); always_check((CTotallyOrderedWith)); always_check((CTotallyOrderedWith)); always_check(!(CTotallyOrderedWith)); // Objects.h always_check(CMovable); always_check(CCopyable); always_check(CSemiregular); always_check(CRegular); always_check(CMovable); always_check(!CCopyable); always_check(!CSemiregular); always_check(!CRegular); always_check(CMovable); always_check(CCopyable); always_check(!CSemiregular); always_check(!CRegular); // Swappable.h always_check(CSwappable); always_check(CSwappable); always_check(CSwappable); always_check(!CSwappable); always_check((CSwappableWith)); // Invocable.h always_check((CInvocable void { }) >)); always_check((CRegularInvocable int32 { return A; }), int32 >)); always_check((CPredicate bool { return (A + B + C) == 0; }), int32, int32, int32 >)); always_check((CRelation bool { return (A ^ B) == 0; }), int32, int32 >)); always_check((CEquivalenceRelation bool { return A == B; }), int32, int32 >)); always_check((CStrictWeakOrder bool { return A < B; }), int32, int32 >)); } NAMESPACE_MODULE_END(Utility) NAMESPACE_MODULE_END(Redcraft) NAMESPACE_REDCRAFT_END