/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ #include #include #include #include #include #include #include #include #include "UserTypes.h" namespace UnitTest { ////////////////////////////////////////////////////////////////////////// // Fixtures struct InvokeNonCopyable { InvokeNonCopyable() = default; private: InvokeNonCopyable(const InvokeNonCopyable&) = delete; InvokeNonCopyable& operator=(const InvokeNonCopyable&) = delete; }; struct InvokeTestStruct { explicit InvokeTestStruct(int num) : m_data(num) {} int IntResultIntParameter(int) { return m_data; } int& operator()(InvokeNonCopyable&&) & { return m_data; } const int& operator()(InvokeNonCopyable&&) const & { return m_data; } volatile int& operator()(InvokeNonCopyable&&) volatile & { return m_data; } const volatile int& operator()(InvokeNonCopyable&&) const volatile & { return m_data; } int&& operator()(InvokeNonCopyable&&) && { return AZStd::move(m_data); } const int&& operator()(InvokeNonCopyable&&) const && { return AZStd::move(m_data); } volatile int&& operator()(InvokeNonCopyable&&) volatile && { return AZStd::move(m_data); } const volatile int&& operator()(InvokeNonCopyable&&) const volatile && { return AZStd::move(m_data); } int m_data; }; struct InvokeTestDerivedStruct : InvokeTestStruct { explicit InvokeTestDerivedStruct(int num) : InvokeTestStruct(num) {} }; struct InvokeTestImplicitConstructor { InvokeTestImplicitConstructor(AZ::s32) {} }; struct InvokeTestExplicitConstructor { explicit InvokeTestExplicitConstructor(AZ::s32) {} }; struct InvokeTestDeletedS32Callable { bool operator()(InvokeTestStruct) { return false; } private: bool operator()(AZ::s32) = delete; }; // Fixture for non-typed tests class InvocableTest : public AllocatorsFixture { protected: void SetUp() override { AllocatorsFixture::SetUp(); } void TearDown() override { AllocatorsFixture::TearDown(); } }; TEST_F(InvocableTest, InvalidInvocableArgsTest) { using Func = int(InvokeTestStruct::*)(int); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); } TEST_F(InvocableTest, MemberFunctionTest) { using Func = int(InvokeTestStruct::*)(int); using CLFunc = int(InvokeTestStruct::*)(int) const &; using RFunc = int(InvokeTestStruct::*)(int) &&; using CRFunc = int(InvokeTestStruct::*)(int) const &&; // Member functions require a "this" object in order to be invocable AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable>::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable>::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable>::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable>::value)); // Bullet 1 AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); // Bullet 2 using RefTest = AZStd::reference_wrapper; using RefDerivedTest = AZStd::reference_wrapper; using RefConstTest = AZStd::reference_wrapper; AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); // Bullet 3 using TestPtrType = InvokeTestStruct*; using DerivedTestPtrType = InvokeTestDerivedStruct*; using ConstTestPtrType = const InvokeTestStruct*; using UniqueTestPtrType = AZStd::unique_ptr; using SharedTestPtrType = AZStd::shared_ptr; AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); } TEST_F(InvocableTest, MemberObjectTest) { using MemberFn = int(InvokeTestStruct::*); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); // Bullet 4 AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); // Bullet 5 using RefTest = AZStd::reference_wrapper; using RefDerivedTest = AZStd::reference_wrapper; using RefConstTest = AZStd::reference_wrapper; AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); // Bullet 6 using TestPtrType = InvokeTestStruct*; using DerivedTestPtrType = InvokeTestDerivedStruct; using ConstTestPtrType = const InvokeTestStruct*; using UniqueTestPtrType = AZStd::unique_ptr; using SharedTestPtrType = AZStd::shared_ptr; AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); } TEST_F(InvocableTest, FunctionObjectTest) { using RawFuncPtr = AZStd::string_view(*)(InvokeTestStruct, int); using RawFuncRef = AZStd::string_view(&)(InvokeTestStruct&, int); using FuncObject = InvokeTestDeletedS32Callable; using StdFunctionObject = AZStd::function; AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable::value)); } TEST_F(InvocableTest, Invocable_R_Test) { using Func = int(*)(); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable_r::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable_r::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable_r::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_invocable_r::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable_r::value)); AZ_TEST_STATIC_ASSERT((!AZStd::is_invocable_r::value)); } class InvokeTest : public AllocatorsFixture { protected: void SetUp() override { AllocatorsFixture::SetUp(); } void TearDown() override { AllocatorsFixture::TearDown(); } static int RawIntFunc(int num) { return num; } static int DoubleRValueIntValue(int&& num) { return num * 2; } public: static const int s_rawFuncResult; }; const int InvokeTest::s_rawFuncResult = 24; template void InvokeMemberFunctionTester(Functor&& functor, int expectResult) { using MemberFunc = FuncSig; MemberFunc memberFunc = &InvokeTestStruct::operator(); InvokeNonCopyable nonCopyableArg; using DeducedResultType = decltype(AZStd::invoke(memberFunc, AZStd::forward(functor), AZStd::move(nonCopyableArg))); AZ_TEST_STATIC_ASSERT((AZStd::is_same::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_same>::value)); auto result = AZStd::invoke(memberFunc, AZStd::forward(functor), AZStd::move(nonCopyableArg)); EXPECT_EQ(expectResult, result); }; template void InvokeMemberObjectTester(Functor&& functor, int expectResult) { auto memberObjPtr = &InvokeTestStruct::m_data; using DeducedResultType = decltype(AZStd::invoke(memberObjPtr, AZStd::forward(functor))); AZ_TEST_STATIC_ASSERT((AZStd::is_same::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_same>::value)); auto result = AZStd::invoke(memberObjPtr, AZStd::forward(functor)); EXPECT_EQ(expectResult, result); }; template void InvokeFunctionObjectTester(Functor&& functor, int expectResult) { InvokeNonCopyable nonCopyableArg; using DeducedResultType = decltype(AZStd::invoke(AZStd::forward(functor), AZStd::move(nonCopyableArg))); AZ_TEST_STATIC_ASSERT((AZStd::is_same::value)); AZ_TEST_STATIC_ASSERT((AZStd::is_same>::value)); auto result = AZStd::invoke(AZStd::forward(functor), AZStd::move(nonCopyableArg)); EXPECT_EQ(expectResult, result); }; int InvokeRawFunc(InvokeNonCopyable&&) { return InvokeTest::s_rawFuncResult; } TEST_F(InvokeTest, MemberFunctionTest) { { // Bullet 1 { InvokeTestStruct test(1); InvokeMemberFunctionTester(test, test.m_data); InvokeMemberFunctionTester(test, test.m_data); InvokeMemberFunctionTester(test, test.m_data); InvokeMemberFunctionTester(test, test.m_data); InvokeMemberFunctionTester(AZStd::move(test), test.m_data); InvokeMemberFunctionTester(AZStd::move(test), test.m_data); InvokeMemberFunctionTester(AZStd::move(test), test.m_data); InvokeMemberFunctionTester(AZStd::move(test), test.m_data); } { InvokeTestDerivedStruct derivedTest(2); InvokeMemberFunctionTester(derivedTest, derivedTest.m_data); InvokeMemberFunctionTester(derivedTest, derivedTest.m_data); InvokeMemberFunctionTester(derivedTest, derivedTest.m_data); InvokeMemberFunctionTester(derivedTest, derivedTest.m_data); using MemberDerivedRFunc = int&& (InvokeTestDerivedStruct::*)(InvokeNonCopyable&&) &&; using MemberDerivedCRFunc = const int&& (InvokeTestDerivedStruct::*)(InvokeNonCopyable&&) const &&; using MemberDerivedVRFunc = volatile int&& (InvokeTestDerivedStruct::*)(InvokeNonCopyable&&) volatile&&; using MemberDerivedCVRFunc = const volatile int&& (InvokeTestDerivedStruct::*)(InvokeNonCopyable&&) const volatile&&; InvokeMemberFunctionTester(AZStd::move(derivedTest), derivedTest.m_data); InvokeMemberFunctionTester(AZStd::move(derivedTest), derivedTest.m_data); InvokeMemberFunctionTester(AZStd::move(derivedTest), derivedTest.m_data); InvokeMemberFunctionTester(AZStd::move(derivedTest), derivedTest.m_data); } } { // Bullet 2 { InvokeTestStruct testObj(3); AZStd::reference_wrapper test(testObj); InvokeMemberFunctionTester(test, test.get().m_data); InvokeMemberFunctionTester(test, test.get().m_data); InvokeMemberFunctionTester(test, test.get().m_data); InvokeMemberFunctionTester(test, test.get().m_data); InvokeMemberFunctionTester(AZStd::move(test), test.get().m_data); InvokeMemberFunctionTester(AZStd::move(test), test.get().m_data); InvokeMemberFunctionTester(AZStd::move(test), test.get().m_data); InvokeMemberFunctionTester(AZStd::move(test), test.get().m_data); } { InvokeTestDerivedStruct derivedTestObj(4); AZStd::reference_wrapper derivedTest(derivedTestObj); InvokeMemberFunctionTester(derivedTest, derivedTest.get().m_data); InvokeMemberFunctionTester(derivedTest, derivedTest.get().m_data); InvokeMemberFunctionTester(derivedTest, derivedTest.get().m_data); InvokeMemberFunctionTester(derivedTest, derivedTest.get().m_data); InvokeMemberFunctionTester(AZStd::move(derivedTest), derivedTest.get().m_data); InvokeMemberFunctionTester(AZStd::move(derivedTest), derivedTest.get().m_data); InvokeMemberFunctionTester(AZStd::move(derivedTest), derivedTest.get().m_data); InvokeMemberFunctionTester(AZStd::move(derivedTest), derivedTest.get().m_data); } } { // Bullet 3 { InvokeTestStruct testObj(5); InvokeTestStruct* test(&testObj); InvokeMemberFunctionTester(test, test->m_data); InvokeMemberFunctionTester(test, test->m_data); InvokeMemberFunctionTester(test, test->m_data); InvokeMemberFunctionTester(test, test->m_data); InvokeMemberFunctionTester(AZStd::move(test), test->m_data); InvokeMemberFunctionTester(AZStd::move(test), test->m_data); InvokeMemberFunctionTester(AZStd::move(test), test->m_data); InvokeMemberFunctionTester(AZStd::move(test), test->m_data); AZStd::unique_ptr testUniquePtr(&testObj); InvokeMemberFunctionTester(test, test->m_data); InvokeMemberFunctionTester(test, test->m_data); InvokeMemberFunctionTester(test, test->m_data); InvokeMemberFunctionTester(test, test->m_data); testUniquePtr.release(); } { InvokeTestDerivedStruct derivedTestObj(6); InvokeTestDerivedStruct* derivedTest(&derivedTestObj); InvokeMemberFunctionTester(derivedTest, derivedTest->m_data); InvokeMemberFunctionTester(derivedTest, derivedTest->m_data); InvokeMemberFunctionTester(derivedTest, derivedTest->m_data); InvokeMemberFunctionTester(derivedTest, derivedTest->m_data); InvokeMemberFunctionTester(AZStd::move(derivedTest), derivedTest->m_data); InvokeMemberFunctionTester(AZStd::move(derivedTest), derivedTest->m_data); InvokeMemberFunctionTester(AZStd::move(derivedTest), derivedTest->m_data); InvokeMemberFunctionTester(AZStd::move(derivedTest), derivedTest->m_data); } } } TEST_F(InvokeTest, MemberObjectTest) { { // Bullet 4 { using TestStruct = InvokeTestStruct; TestStruct test(7); InvokeMemberObjectTester(test, test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); } { using TestStruct = InvokeTestDerivedStruct; TestStruct test(8); InvokeMemberObjectTester(test, test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); InvokeMemberObjectTester(static_cast(test), test.m_data); } } { // Bullet 5 { using TestStruct = InvokeTestStruct; TestStruct testObj(9); InvokeMemberObjectTester(AZStd::reference_wrapper(testObj), testObj.m_data); InvokeMemberObjectTester(AZStd::reference_wrapper(testObj), testObj.m_data); InvokeMemberObjectTester(AZStd::reference_wrapper(testObj), testObj.m_data); InvokeMemberObjectTester(AZStd::reference_wrapper(testObj), testObj.m_data); } { using TestStruct = InvokeTestDerivedStruct; TestStruct testObj(10); InvokeMemberObjectTester(AZStd::reference_wrapper(testObj), testObj.m_data); InvokeMemberObjectTester(AZStd::reference_wrapper(testObj), testObj.m_data); InvokeMemberObjectTester(AZStd::reference_wrapper(testObj), testObj.m_data); InvokeMemberObjectTester(AZStd::reference_wrapper(testObj), testObj.m_data); } } { // Bullet 6 { using TestStruct = InvokeTestStruct; TestStruct testObj(11); TestStruct* test(&testObj); const TestStruct* cTest(&testObj); volatile TestStruct* vTest(&testObj); const volatile TestStruct* cvTest(&testObj); InvokeMemberObjectTester(test, test->m_data); InvokeMemberObjectTester(cTest, test->m_data); InvokeMemberObjectTester(vTest, test->m_data); InvokeMemberObjectTester(cvTest, test->m_data); } { using TestStruct = InvokeTestDerivedStruct; TestStruct testObj(12); TestStruct* test(&testObj); InvokeMemberObjectTester(test, test->m_data); InvokeMemberObjectTester(static_cast(test), test->m_data); InvokeMemberObjectTester(static_cast(test), test->m_data); InvokeMemberObjectTester(static_cast(test), test->m_data); } } } TEST_F(InvokeTest, FunctionObjectTest) { // Bullet 7 using RawFuncPtr = int(*)(InvokeNonCopyable&&); using RawFuncRef = int(&)(InvokeNonCopyable&&); RawFuncPtr testRawFuncPtr = &InvokeRawFunc; RawFuncRef testRawFuncRef = InvokeRawFunc; InvokeFunctionObjectTester(testRawFuncPtr, InvokeTest::s_rawFuncResult); InvokeFunctionObjectTester(testRawFuncRef, InvokeTest::s_rawFuncResult); AZStd::function testStdFunc = &RawIntFunc; int numResult = AZStd::invoke(testStdFunc, InvokeTest::s_rawFuncResult); EXPECT_EQ(InvokeTest::s_rawFuncResult, numResult); AZStd::function testStdFuncWithRValueParam = &DoubleRValueIntValue; numResult = AZStd::invoke(testStdFuncWithRValueParam, 520); EXPECT_EQ(1040, numResult); InvokeTestStruct testFunctor(13); InvokeFunctionObjectTester(testFunctor, testFunctor.m_data); InvokeFunctionObjectTester(static_cast(testFunctor), testFunctor.m_data); InvokeFunctionObjectTester(static_cast(testFunctor), testFunctor.m_data); InvokeFunctionObjectTester(static_cast(testFunctor), testFunctor.m_data); InvokeFunctionObjectTester(static_cast(testFunctor), testFunctor.m_data); InvokeFunctionObjectTester(static_cast(testFunctor), testFunctor.m_data); InvokeFunctionObjectTester(static_cast(testFunctor), testFunctor.m_data); InvokeFunctionObjectTester(static_cast(testFunctor), testFunctor.m_data); } }