utility.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include <utility>
  2. #include <gtest/gtest.h>
  3. #include <entt/core/type_traits.hpp>
  4. #include <entt/core/utility.hpp>
  5. struct functions {
  6. static void foo(int) {}
  7. static void foo() {}
  8. void bar(int) {}
  9. void bar() {}
  10. };
  11. TEST(Identity, Functionalities) {
  12. const entt::identity identity;
  13. int value = 2;
  14. ASSERT_TRUE(entt::is_transparent_v<entt::identity>);
  15. ASSERT_EQ(identity(value), value);
  16. ASSERT_EQ(&identity(value), &value);
  17. }
  18. TEST(Overload, Functionalities) {
  19. ASSERT_EQ(entt::overload<void(int)>(&functions::foo), static_cast<void (*)(int)>(&functions::foo));
  20. ASSERT_EQ(entt::overload<void()>(&functions::foo), static_cast<void (*)()>(&functions::foo));
  21. ASSERT_EQ(entt::overload<void(int)>(&functions::bar), static_cast<void (functions::*)(int)>(&functions::bar));
  22. ASSERT_EQ(entt::overload<void()>(&functions::bar), static_cast<void (functions::*)()>(&functions::bar));
  23. functions instance; // NOLINT
  24. ASSERT_NO_THROW(entt::overload<void(int)>(&functions::foo)(0));
  25. ASSERT_NO_THROW(entt::overload<void()>(&functions::foo)());
  26. ASSERT_NO_THROW((instance.*entt::overload<void(int)>(&functions::bar))(0));
  27. ASSERT_NO_THROW((instance.*entt::overload<void()>(&functions::bar))());
  28. }
  29. TEST(Overloaded, Functionalities) {
  30. int iv = 0;
  31. char cv = '\0';
  32. const entt::overloaded func{
  33. [&iv](int value) { iv = value; },
  34. [&cv](char value) { cv = value; }};
  35. func(2);
  36. func('c');
  37. ASSERT_EQ(iv, 2);
  38. ASSERT_EQ(cv, 'c');
  39. }
  40. TEST(YCombinator, Functionalities) {
  41. entt::y_combinator gauss([](const auto &self, auto value) -> unsigned int {
  42. return value ? (value + self(value - 1u)) : 0;
  43. });
  44. ASSERT_EQ(gauss(3u), 3u * 4u / 2u);
  45. ASSERT_EQ(std::as_const(gauss)(7u), 7u * 8u / 2u);
  46. }