diff --git a/src/entt/core/type_traits.hpp b/src/entt/core/type_traits.hpp index 25f55bac6..a2f62cc9e 100644 --- a/src/entt/core/type_traits.hpp +++ b/src/entt/core/type_traits.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include "../config/config.h" @@ -387,8 +388,19 @@ template struct value_list_element<0u, value_list> { /*! @brief Searched value. */ static constexpr auto value = Value; + + /*! @brief Searched type. */ + using type = decltype(Value); }; +/** + * @brief Helper type. + * @tparam Index Index of the type to return. + * @tparam List Value list to search into. + */ +template +using value_list_element_t = typename value_list_element::type; + /** * @brief Helper type. * @tparam Index Index of the value to return. @@ -894,4 +906,16 @@ using nth_argument_t = typename nth_argument::type; } // namespace entt +template +struct std::tuple_size>: std::integral_constant::size> {}; + +template +struct std::tuple_element>: entt::type_list_element> {}; + +template +struct std::tuple_size>: std::integral_constant::size> {}; + +template +struct std::tuple_element>: entt::value_list_element> {}; + #endif diff --git a/test/entt/core/type_traits.cpp b/test/entt/core/type_traits.cpp index a6f2e4647..625424f84 100644 --- a/test/entt/core/type_traits.cpp +++ b/test/entt/core/type_traits.cpp @@ -238,3 +238,27 @@ TEST(Tag, Functionalities) { static_assert(entt::tag<"foobar"_hs>::value == entt::hashed_string::value("foobar")); static_assert(std::is_same_v::value_type, entt::id_type>); } + +TEST(TypeList, TupleSize) { + ASSERT_EQ(std::tuple_size_v>, 0u); + ASSERT_EQ(std::tuple_size_v>, 1u); + ASSERT_EQ((std::tuple_size_v>), 2u); +} + +TEST(TypeList, TupleElement) { + ASSERT_TRUE((std::is_same_v>>)); + ASSERT_TRUE((std::is_same_v>>)); + ASSERT_TRUE((std::is_same_v>>)); +} + +TEST(ValueList, TupleSize) { + ASSERT_EQ(std::tuple_size_v>, 0u); + ASSERT_EQ(std::tuple_size_v>, 1u); + ASSERT_EQ((std::tuple_size_v>), 2u); +} + +TEST(ValueList, TupleElement) { + ASSERT_TRUE((std::is_same_v>>)); + ASSERT_TRUE((std::is_same_v>>)); + ASSERT_TRUE((std::is_same_v>>)); +}