diff --git a/tests/callable_tests.cc b/tests/callable_tests.cc new file mode 100644 index 0000000..a726b0b --- /dev/null +++ b/tests/callable_tests.cc @@ -0,0 +1,50 @@ +#include "doctest.h" +#include "util/callable.hh" + +TEST_CASE("Callable Function") { + auto capture{0}; + auto func = Function{[&capture](int a, int b) { + capture += 10; + return a + b + capture; + }}; + + CHECK(func(10, 10) == 30); + CHECK(capture == 10); + CHECK(func(10, 10) == 40); + CHECK(capture == 20); +} + +TEST_CASE("Callable Function mixed params") { + auto capture{0}; + auto func = Function{[&capture](int a, float b) { + capture += 10; + return a + b + capture; + }}; + + CHECK(func(10, 10.f) == 30); + CHECK(capture == 10); + CHECK(func(10, 10.f) == 40); + CHECK(capture == 20); +} + +TEST_CASE("Callable Function lots of params") { + struct A { + int a; + char b; + float d; + double e; + }; + auto capture{0}; + auto func = Function{[&capture](int a, float b, char x, A aa, A bb) { + capture += 10; + if (x == 'a') + return aa.a + bb.b + capture * 2.f; + else + return a + b + capture; + }}; + + CHECK(func(10, 10.f, 'x', {}, {2, 'b', 1.2f, 1.4}) == 30); + CHECK(capture == 10); + CHECK(func(10, 10.f, 'a', {}, {2, 'a', 1.2f, 1.4}) == 137); + CHECK(capture == 20); +} diff --git a/util/callable.hh b/util/callable.hh index 9d09893..91b4431 100644 --- a/util/callable.hh +++ b/util/callable.hh @@ -104,19 +104,19 @@ public: Ret call(Args... args) { if (m_callback) - return m_callback(&m_data[0], std::forward(args)...); + return m_callback(&m_data[0], std::forward(args)...); return Ret(); } Ret operator()(Args... args) { - return call(std::forward(args)...); + return call(std::forward(args)...); } private: template static Ret invoke(void *object, Args... args) { Callable &callable = *reinterpret_cast(object); - callable(std::forward(args)...); + return callable(std::forward(args)...); } template