diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index 54f0d89d3..d4257eebf 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -119,6 +119,7 @@ public: storage = forward_as_any(instance); } + [[nodiscard]] inline bool key_only() const noexcept; [[nodiscard]] inline meta_type key_type() const noexcept; [[nodiscard]] inline meta_type mapped_type() const noexcept; [[nodiscard]] inline meta_type value_type() const noexcept; @@ -1861,6 +1862,14 @@ inline meta_sequence_container::iterator meta_sequence_container::erase(iterator return static_cast(storage); } +/** + * @brief Returns true if a container is also key-only, false otherwise. + * @return True if the associative container is also key-only, false otherwise. + */ +[[nodiscard]] inline bool meta_associative_container::key_only() const noexcept { + return (mapped_type_node == nullptr); +} + /** * @brief Returns the meta key type of a container. * @return The meta key type of the a container. diff --git a/test/entt/meta/meta_container.cpp b/test/entt/meta/meta_container.cpp index 3cfaac89c..3af8e4f15 100644 --- a/test/entt/meta/meta_container.cpp +++ b/test/entt/meta/meta_container.cpp @@ -314,6 +314,7 @@ TEST(MetaContainer, StdMap) { auto view = any.as_associative_container(); ASSERT_TRUE(view); + ASSERT_FALSE(view.key_only()); ASSERT_EQ(view.key_type(), entt::resolve()); ASSERT_EQ(view.mapped_type(), entt::resolve()); ASSERT_EQ(view.value_type(), (entt::resolve>())); @@ -357,6 +358,7 @@ TEST(MetaContainer, StdSet) { auto view = any.as_associative_container(); ASSERT_TRUE(view); + ASSERT_TRUE(view.key_only()); ASSERT_EQ(view.key_type(), entt::resolve()); ASSERT_EQ(view.mapped_type(), entt::meta_type{}); ASSERT_EQ(view.value_type(), entt::resolve()); @@ -403,6 +405,7 @@ TEST(MetaContainer, DenseMap) { map.emplace(4, '3'); ASSERT_TRUE(view); + ASSERT_FALSE(view.key_only()); ASSERT_EQ(view.key_type(), entt::resolve()); ASSERT_EQ(view.mapped_type(), entt::resolve()); ASSERT_EQ(view.value_type(), (entt::resolve>())); @@ -450,6 +453,7 @@ TEST(MetaContainer, DenseSet) { set.emplace(4); ASSERT_TRUE(view); + ASSERT_TRUE(view.key_only()); ASSERT_EQ(view.key_type(), entt::resolve()); ASSERT_EQ(view.mapped_type(), entt::meta_type{}); ASSERT_EQ(view.value_type(), entt::resolve()); @@ -540,6 +544,7 @@ TEST(MetaContainer, ConstKeyValueAssociativeContainer) { auto view = any.as_associative_container(); ASSERT_TRUE(view); + ASSERT_FALSE(view.key_only()); ASSERT_EQ(view.key_type(), entt::resolve()); ASSERT_EQ(view.mapped_type(), entt::resolve()); ASSERT_EQ(view.value_type(), (entt::resolve>())); @@ -582,6 +587,7 @@ TEST(MetaContainer, ConstKeyOnlyAssociativeContainer) { auto view = any.as_associative_container(); ASSERT_TRUE(view); + ASSERT_TRUE(view.key_only()); ASSERT_EQ(view.key_type(), entt::resolve()); ASSERT_EQ(view.mapped_type(), entt::meta_type{}); ASSERT_EQ(view.value_type(), (entt::resolve()));