meta_template.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #include <gtest/gtest.h>
  2. #include <entt/core/type_traits.hpp>
  3. #include <entt/meta/meta.hpp>
  4. #include <entt/meta/resolve.hpp>
  5. #include <entt/meta/template.hpp>
  6. #include <entt/meta/type_traits.hpp>
  7. template<typename>
  8. struct function_type;
  9. template<typename Ret, typename... Args>
  10. struct function_type<Ret(Args...)> {};
  11. template<typename Ret, typename... Args>
  12. struct entt::meta_template_traits<function_type<Ret(Args...)>> {
  13. using class_type = meta_class_template_tag<function_type>;
  14. using args_type = type_list<Ret, Args...>;
  15. };
  16. TEST(MetaTemplate, Invalid) {
  17. const auto type = entt::resolve<int>();
  18. ASSERT_FALSE(type.is_template_specialization());
  19. ASSERT_EQ(type.template_arity(), 0u);
  20. ASSERT_EQ(type.template_type(), entt::meta_type{});
  21. ASSERT_EQ(type.template_arg(0u), entt::meta_type{});
  22. }
  23. TEST(MetaTemplate, Valid) {
  24. const auto type = entt::resolve<entt::type_list<int, char>>();
  25. ASSERT_TRUE(type.is_template_specialization());
  26. ASSERT_EQ(type.template_arity(), 2u);
  27. ASSERT_EQ(type.template_type(), entt::resolve<entt::meta_class_template_tag<entt::type_list>>());
  28. ASSERT_EQ(type.template_arg(0u), entt::resolve<int>());
  29. ASSERT_EQ(type.template_arg(1u), entt::resolve<char>());
  30. ASSERT_EQ(type.template_arg(2u), entt::meta_type{});
  31. }
  32. TEST(MetaTemplate, CustomTraits) {
  33. const auto type = entt::resolve<function_type<void(int, const char &)>>();
  34. ASSERT_TRUE(type.is_template_specialization());
  35. ASSERT_EQ(type.template_arity(), 3u);
  36. ASSERT_EQ(type.template_type(), entt::resolve<entt::meta_class_template_tag<function_type>>());
  37. ASSERT_EQ(type.template_arg(0u), entt::resolve<void>());
  38. ASSERT_EQ(type.template_arg(1u), entt::resolve<int>());
  39. ASSERT_EQ(type.template_arg(2u), entt::resolve<char>());
  40. ASSERT_EQ(type.template_arg(3u), entt::meta_type{});
  41. }