Răsfoiți Sursa

registry: remove_if_exists returns the number of components actually removed (close #483)

Michele Caini 5 ani în urmă
părinte
comite
39baa59625
2 a modificat fișierele cu 7 adăugiri și 8 ștergeri
  1. 5 6
      src/entt/entity/registry.hpp
  2. 2 2
      test/entt/entity/registry.cpp

+ 5 - 6
src/entt/entity/registry.hpp

@@ -826,16 +826,15 @@ public:
      *
      * @tparam Component Types of components to remove.
      * @param entity A valid entity identifier.
+     * @return The number of components actually removed.
      */
     template<typename... Component>
-    void remove_if_exists(const entity_type entity) {
+    size_type remove_if_exists(const entity_type entity) {
         ENTT_ASSERT(valid(entity));
 
-        ([this, entity](auto &&cpool) {
-            if(cpool.contains(entity)) {
-                cpool.remove(*this, entity);
-            }
-        }(assure<Component>()), ...);
+        return ([this, entity](auto &&cpool) {
+            return cpool.contains(entity) ? (cpool.remove(*this, entity), true) : false;
+        }(assure<Component>()) + ... + size_type{});
     }
 
     /**

+ 2 - 2
test/entt/entity/registry.cpp

@@ -244,8 +244,8 @@ TEST(Registry, Functionalities) {
 
     registry.emplace<int>(e4);
 
-    ASSERT_NO_THROW(registry.remove_if_exists<int>(e4));
-    ASSERT_NO_THROW(registry.remove_if_exists<int>(e5));
+    ASSERT_EQ(registry.remove_if_exists<int>(e4), 1u);
+    ASSERT_EQ(registry.remove_if_exists<int>(e5), 0u);
 
     ASSERT_EQ(registry.size<int>(), entt::registry::size_type{0});
     ASSERT_EQ(registry.size<char>(), entt::registry::size_type{0});