#include #include #include #include struct functions { static void foo(int) {} static void foo() {} void bar(int) {} void bar() {} }; TEST(Identity, Functionalities) { entt::identity identity; int value = 42; ASSERT_TRUE(entt::is_transparent_v); ASSERT_EQ(identity(value), value); ASSERT_EQ(&identity(value), &value); } TEST(Overload, Functionalities) { ASSERT_EQ(entt::overload(&functions::foo), static_cast(&functions::foo)); ASSERT_EQ(entt::overload(&functions::foo), static_cast(&functions::foo)); ASSERT_EQ(entt::overload(&functions::bar), static_cast(&functions::bar)); ASSERT_EQ(entt::overload(&functions::bar), static_cast(&functions::bar)); functions instance; ASSERT_NO_FATAL_FAILURE(entt::overload(&functions::foo)(0)); ASSERT_NO_FATAL_FAILURE(entt::overload(&functions::foo)()); ASSERT_NO_FATAL_FAILURE((instance.*entt::overload(&functions::bar))(0)); ASSERT_NO_FATAL_FAILURE((instance.*entt::overload(&functions::bar))()); } TEST(Overloaded, Functionalities) { int iv = 0; char cv = '\0'; entt::overloaded func{ [&iv](int value) { iv = value; }, [&cv](char value) { cv = value; }}; func(42); func('c'); ASSERT_EQ(iv, 42); ASSERT_EQ(cv, 'c'); } TEST(YCombinator, Functionalities) { entt::y_combinator gauss([](const auto &self, auto value) -> unsigned int { return value ? (value + self(value - 1u)) : 0; }); ASSERT_EQ(gauss(3u), 3u * 4u / 2u); ASSERT_EQ(std::as_const(gauss)(7u), 7u * 8u / 2u); }