Procházet zdrojové kódy

meta: make meta_associative_container::erase return the number of elements removed

Michele Caini před 3 roky
rodič
revize
c2475381fd

+ 2 - 3
src/entt/meta/container.hpp

@@ -131,10 +131,9 @@ struct basic_meta_associative_container_traits {
         }
         }
     }
     }
 
 
-    [[nodiscard]] static bool erase(any &container, meta_any &key) {
+    [[nodiscard]] static size_type erase(any &container, meta_any &key) {
         auto *const cont = any_cast<Type>(&container);
         auto *const cont = any_cast<Type>(&container);
-        return cont && key.allow_cast<const typename Type::key_type &>()
-               && (cont->erase(key.cast<const typename Type::key_type &>()) != cont->size());
+        return cont && key.allow_cast<const typename Type::key_type &>() ? cont->erase(key.cast<const typename Type::key_type &>()) : size_type{};
     }
     }
 
 
     [[nodiscard]] static iterator find(any &container, meta_any &key) {
     [[nodiscard]] static iterator find(any &container, meta_any &key) {

+ 3 - 3
src/entt/meta/meta.hpp

@@ -119,7 +119,7 @@ public:
     [[nodiscard]] inline iterator begin();
     [[nodiscard]] inline iterator begin();
     [[nodiscard]] inline iterator end();
     [[nodiscard]] inline iterator end();
     inline bool insert(meta_any, meta_any);
     inline bool insert(meta_any, meta_any);
-    inline bool erase(meta_any);
+    inline size_type erase(meta_any);
     [[nodiscard]] inline iterator find(meta_any);
     [[nodiscard]] inline iterator find(meta_any);
     [[nodiscard]] inline explicit operator bool() const noexcept;
     [[nodiscard]] inline explicit operator bool() const noexcept;
 
 
@@ -132,7 +132,7 @@ private:
     bool (*clear_fn)(any &) = nullptr;
     bool (*clear_fn)(any &) = nullptr;
     iterator (*iter_fn)(any &, const bool) = nullptr;
     iterator (*iter_fn)(any &, const bool) = nullptr;
     bool (*insert_fn)(any &, meta_any &, meta_any &) = nullptr;
     bool (*insert_fn)(any &, meta_any &, meta_any &) = nullptr;
-    bool (*erase_fn)(any &, meta_any &) = nullptr;
+    size_type (*erase_fn)(any &, meta_any &) = nullptr;
     iterator (*find_fn)(any &, meta_any &) = nullptr;
     iterator (*find_fn)(any &, meta_any &) = nullptr;
     any storage{};
     any storage{};
 };
 };
@@ -1764,7 +1764,7 @@ inline bool meta_associative_container::insert(meta_any key, meta_any value = {}
  * @param key The key of the element to remove.
  * @param key The key of the element to remove.
  * @return A bool denoting whether the removal took place.
  * @return A bool denoting whether the removal took place.
  */
  */
-inline bool meta_associative_container::erase(meta_any key) {
+inline meta_associative_container::size_type meta_associative_container::erase(meta_any key) {
     return erase_fn(storage, key);
     return erase_fn(storage, key);
 }
 }
 
 

+ 14 - 14
test/entt/meta/meta_container.cpp

@@ -230,11 +230,11 @@ TEST_F(MetaContainer, StdMap) {
     ASSERT_EQ(view.find(0)->second.cast<char>(), 'a');
     ASSERT_EQ(view.find(0)->second.cast<char>(), 'a');
     ASSERT_EQ(view.find(1.)->second.cast<char>(), 'b');
     ASSERT_EQ(view.find(1.)->second.cast<char>(), 'b');
 
 
-    ASSERT_FALSE(view.erase(invalid_type{}));
+    ASSERT_EQ(view.erase(invalid_type{}), 0u);
     ASSERT_FALSE(view.find(invalid_type{}));
     ASSERT_FALSE(view.find(invalid_type{}));
     ASSERT_EQ(view.size(), 5u);
     ASSERT_EQ(view.size(), 5u);
 
 
-    ASSERT_TRUE(view.erase(0));
+    ASSERT_EQ(view.erase(0), 1u);
     ASSERT_EQ(view.size(), 4u);
     ASSERT_EQ(view.size(), 4u);
     ASSERT_EQ(view.find(0), view.end());
     ASSERT_EQ(view.find(0), view.end());
 
 
@@ -242,7 +242,7 @@ TEST_F(MetaContainer, StdMap) {
 
 
     ASSERT_EQ(view.find(1.f)->second.cast<char>(), 'f');
     ASSERT_EQ(view.find(1.f)->second.cast<char>(), 'f');
 
 
-    ASSERT_TRUE(view.erase(1.));
+    ASSERT_EQ(view.erase(1.), 1u);
     ASSERT_TRUE(view.clear());
     ASSERT_TRUE(view.clear());
     ASSERT_EQ(view.size(), 0u);
     ASSERT_EQ(view.size(), 0u);
 }
 }
@@ -272,11 +272,11 @@ TEST_F(MetaContainer, StdSet) {
     ASSERT_EQ(view.find(0)->first.cast<int>(), 0);
     ASSERT_EQ(view.find(0)->first.cast<int>(), 0);
     ASSERT_EQ(view.find(1.)->first.cast<int>(), 1);
     ASSERT_EQ(view.find(1.)->first.cast<int>(), 1);
 
 
-    ASSERT_FALSE(view.erase(invalid_type{}));
+    ASSERT_EQ(view.erase(invalid_type{}), 0u);
     ASSERT_FALSE(view.find(invalid_type{}));
     ASSERT_FALSE(view.find(invalid_type{}));
     ASSERT_EQ(view.size(), 5u);
     ASSERT_EQ(view.size(), 5u);
 
 
-    ASSERT_TRUE(view.erase(0));
+    ASSERT_EQ(view.erase(0), 1u);
     ASSERT_EQ(view.size(), 4u);
     ASSERT_EQ(view.size(), 4u);
     ASSERT_EQ(view.find(0), view.end());
     ASSERT_EQ(view.find(0), view.end());
 
 
@@ -284,7 +284,7 @@ TEST_F(MetaContainer, StdSet) {
     ASSERT_NE(view.find(1.)->first.try_cast<const int>(), nullptr);
     ASSERT_NE(view.find(1.)->first.try_cast<const int>(), nullptr);
     ASSERT_EQ(view.find(true)->first.cast<const int &>(), 1);
     ASSERT_EQ(view.find(true)->first.cast<const int &>(), 1);
 
 
-    ASSERT_TRUE(view.erase(1.));
+    ASSERT_EQ(view.erase(1.), 1u);
     ASSERT_TRUE(view.clear());
     ASSERT_TRUE(view.clear());
     ASSERT_EQ(view.size(), 0u);
     ASSERT_EQ(view.size(), 0u);
 }
 }
@@ -319,11 +319,11 @@ TEST_F(MetaContainer, DenseMap) {
     ASSERT_EQ(view.find(0)->second.cast<char>(), 'a');
     ASSERT_EQ(view.find(0)->second.cast<char>(), 'a');
     ASSERT_EQ(view.find(1.)->second.cast<char>(), 'b');
     ASSERT_EQ(view.find(1.)->second.cast<char>(), 'b');
 
 
-    ASSERT_FALSE(view.erase(invalid_type{}));
+    ASSERT_EQ(view.erase(invalid_type{}), 0u);
     ASSERT_FALSE(view.find(invalid_type{}));
     ASSERT_FALSE(view.find(invalid_type{}));
     ASSERT_EQ(view.size(), 5u);
     ASSERT_EQ(view.size(), 5u);
 
 
-    ASSERT_TRUE(view.erase(0));
+    ASSERT_EQ(view.erase(0), 1u);
     ASSERT_EQ(view.size(), 4u);
     ASSERT_EQ(view.size(), 4u);
     ASSERT_EQ(view.find(0), view.end());
     ASSERT_EQ(view.find(0), view.end());
 
 
@@ -331,7 +331,7 @@ TEST_F(MetaContainer, DenseMap) {
 
 
     ASSERT_EQ(view.find(1.f)->second.cast<char>(), 'f');
     ASSERT_EQ(view.find(1.f)->second.cast<char>(), 'f');
 
 
-    ASSERT_TRUE(view.erase(1.));
+    ASSERT_EQ(view.erase(1.), 1u);
     ASSERT_TRUE(view.clear());
     ASSERT_TRUE(view.clear());
     ASSERT_EQ(view.size(), 0u);
     ASSERT_EQ(view.size(), 0u);
 }
 }
@@ -365,11 +365,11 @@ TEST_F(MetaContainer, DenseSet) {
     ASSERT_EQ(view.find(0)->first.cast<int>(), 0);
     ASSERT_EQ(view.find(0)->first.cast<int>(), 0);
     ASSERT_EQ(view.find(1.)->first.cast<int>(), 1);
     ASSERT_EQ(view.find(1.)->first.cast<int>(), 1);
 
 
-    ASSERT_FALSE(view.erase(invalid_type{}));
+    ASSERT_EQ(view.erase(invalid_type{}), 0u);
     ASSERT_FALSE(view.find(invalid_type{}));
     ASSERT_FALSE(view.find(invalid_type{}));
     ASSERT_EQ(view.size(), 5u);
     ASSERT_EQ(view.size(), 5u);
 
 
-    ASSERT_TRUE(view.erase(0));
+    ASSERT_EQ(view.erase(0), 1u);
     ASSERT_EQ(view.size(), 4u);
     ASSERT_EQ(view.size(), 4u);
     ASSERT_EQ(view.find(0), view.end());
     ASSERT_EQ(view.find(0), view.end());
 
 
@@ -377,7 +377,7 @@ TEST_F(MetaContainer, DenseSet) {
     ASSERT_NE(view.find(1.)->first.try_cast<const int>(), nullptr);
     ASSERT_NE(view.find(1.)->first.try_cast<const int>(), nullptr);
     ASSERT_EQ(view.find(true)->first.cast<const int &>(), 1);
     ASSERT_EQ(view.find(true)->first.cast<const int &>(), 1);
 
 
-    ASSERT_TRUE(view.erase(1.));
+    ASSERT_EQ(view.erase(1.), 1u);
     ASSERT_TRUE(view.clear());
     ASSERT_TRUE(view.clear());
     ASSERT_EQ(view.size(), 0u);
     ASSERT_EQ(view.size(), 0u);
 }
 }
@@ -454,7 +454,7 @@ TEST_F(MetaContainer, ConstKeyValueAssociativeContainer) {
     ASSERT_EQ(view.find(0), view.end());
     ASSERT_EQ(view.find(0), view.end());
     ASSERT_EQ(view.find(2)->second.cast<char>(), 'c');
     ASSERT_EQ(view.find(2)->second.cast<char>(), 'c');
 
 
-    ASSERT_FALSE(view.erase(2));
+    ASSERT_EQ(view.erase(2), 0u);
     ASSERT_EQ(view.size(), 1u);
     ASSERT_EQ(view.size(), 1u);
     ASSERT_NE(view.find(2), view.end());
     ASSERT_NE(view.find(2), view.end());
 
 
@@ -500,7 +500,7 @@ TEST_F(MetaContainer, ConstKeyOnlyAssociativeContainer) {
     ASSERT_EQ(view.find(0), view.end());
     ASSERT_EQ(view.find(0), view.end());
     ASSERT_EQ(view.find(2)->first.cast<int>(), 2);
     ASSERT_EQ(view.find(2)->first.cast<int>(), 2);
 
 
-    ASSERT_FALSE(view.erase(2));
+    ASSERT_EQ(view.erase(2), 0u);
     ASSERT_EQ(view.size(), 1u);
     ASSERT_EQ(view.size(), 1u);
     ASSERT_NE(view.find(2), view.end());
     ASSERT_NE(view.find(2), view.end());