Просмотр исходного кода

meta: allow for a smoother transition before dropping meta_associative_container::key_only

Michele Caini 2 лет назад
Родитель
Сommit
c9a5fda400
2 измененных файлов с 15 добавлено и 0 удалено
  1. 9 0
      src/entt/meta/meta.hpp
  2. 6 0
      test/entt/meta/meta_container.cpp

+ 9 - 0
src/entt/meta/meta.hpp

@@ -119,6 +119,7 @@ public:
         storage = forward_as_any(instance);
         storage = forward_as_any(instance);
     }
     }
 
 
+    [[nodiscard]] inline bool key_only() const noexcept;
     [[nodiscard]] inline meta_type key_type() const noexcept;
     [[nodiscard]] inline meta_type key_type() const noexcept;
     [[nodiscard]] inline meta_type mapped_type() const noexcept;
     [[nodiscard]] inline meta_type mapped_type() const noexcept;
     [[nodiscard]] inline meta_type value_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<bool>(storage);
     return static_cast<bool>(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.
  * @brief Returns the meta key type of a container.
  * @return The meta key type of the a container.
  * @return The meta key type of the a container.

+ 6 - 0
test/entt/meta/meta_container.cpp

@@ -314,6 +314,7 @@ TEST(MetaContainer, StdMap) {
     auto view = any.as_associative_container();
     auto view = any.as_associative_container();
 
 
     ASSERT_TRUE(view);
     ASSERT_TRUE(view);
+    ASSERT_FALSE(view.key_only());
     ASSERT_EQ(view.key_type(), entt::resolve<int>());
     ASSERT_EQ(view.key_type(), entt::resolve<int>());
     ASSERT_EQ(view.mapped_type(), entt::resolve<char>());
     ASSERT_EQ(view.mapped_type(), entt::resolve<char>());
     ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
     ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
@@ -357,6 +358,7 @@ TEST(MetaContainer, StdSet) {
     auto view = any.as_associative_container();
     auto view = any.as_associative_container();
 
 
     ASSERT_TRUE(view);
     ASSERT_TRUE(view);
+    ASSERT_TRUE(view.key_only());
     ASSERT_EQ(view.key_type(), entt::resolve<int>());
     ASSERT_EQ(view.key_type(), entt::resolve<int>());
     ASSERT_EQ(view.mapped_type(), entt::meta_type{});
     ASSERT_EQ(view.mapped_type(), entt::meta_type{});
     ASSERT_EQ(view.value_type(), entt::resolve<int>());
     ASSERT_EQ(view.value_type(), entt::resolve<int>());
@@ -403,6 +405,7 @@ TEST(MetaContainer, DenseMap) {
     map.emplace(4, '3');
     map.emplace(4, '3');
 
 
     ASSERT_TRUE(view);
     ASSERT_TRUE(view);
+    ASSERT_FALSE(view.key_only());
     ASSERT_EQ(view.key_type(), entt::resolve<int>());
     ASSERT_EQ(view.key_type(), entt::resolve<int>());
     ASSERT_EQ(view.mapped_type(), entt::resolve<char>());
     ASSERT_EQ(view.mapped_type(), entt::resolve<char>());
     ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
     ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
@@ -450,6 +453,7 @@ TEST(MetaContainer, DenseSet) {
     set.emplace(4);
     set.emplace(4);
 
 
     ASSERT_TRUE(view);
     ASSERT_TRUE(view);
+    ASSERT_TRUE(view.key_only());
     ASSERT_EQ(view.key_type(), entt::resolve<int>());
     ASSERT_EQ(view.key_type(), entt::resolve<int>());
     ASSERT_EQ(view.mapped_type(), entt::meta_type{});
     ASSERT_EQ(view.mapped_type(), entt::meta_type{});
     ASSERT_EQ(view.value_type(), entt::resolve<int>());
     ASSERT_EQ(view.value_type(), entt::resolve<int>());
@@ -540,6 +544,7 @@ TEST(MetaContainer, ConstKeyValueAssociativeContainer) {
     auto view = any.as_associative_container();
     auto view = any.as_associative_container();
 
 
     ASSERT_TRUE(view);
     ASSERT_TRUE(view);
+    ASSERT_FALSE(view.key_only());
     ASSERT_EQ(view.key_type(), entt::resolve<int>());
     ASSERT_EQ(view.key_type(), entt::resolve<int>());
     ASSERT_EQ(view.mapped_type(), entt::resolve<char>());
     ASSERT_EQ(view.mapped_type(), entt::resolve<char>());
     ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
     ASSERT_EQ(view.value_type(), (entt::resolve<std::pair<const int, char>>()));
@@ -582,6 +587,7 @@ TEST(MetaContainer, ConstKeyOnlyAssociativeContainer) {
     auto view = any.as_associative_container();
     auto view = any.as_associative_container();
 
 
     ASSERT_TRUE(view);
     ASSERT_TRUE(view);
+    ASSERT_TRUE(view.key_only());
     ASSERT_EQ(view.key_type(), entt::resolve<int>());
     ASSERT_EQ(view.key_type(), entt::resolve<int>());
     ASSERT_EQ(view.mapped_type(), entt::meta_type{});
     ASSERT_EQ(view.mapped_type(), entt::meta_type{});
     ASSERT_EQ(view.value_type(), (entt::resolve<int>()));
     ASSERT_EQ(view.value_type(), (entt::resolve<int>()));