From c2475381fd704c8d8d0d3435fedddc3319ea3235 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Fri, 24 Jun 2022 15:03:45 +0200 Subject: [PATCH] meta: make meta_associative_container::erase return the number of elements removed --- src/entt/meta/container.hpp | 5 ++--- src/entt/meta/meta.hpp | 6 +++--- test/entt/meta/meta_container.cpp | 28 ++++++++++++++-------------- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/entt/meta/container.hpp b/src/entt/meta/container.hpp index 81e695531..c9a48bbab 100644 --- a/src/entt/meta/container.hpp +++ b/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(&container); - return cont && key.allow_cast() - && (cont->erase(key.cast()) != cont->size()); + return cont && key.allow_cast() ? cont->erase(key.cast()) : size_type{}; } [[nodiscard]] static iterator find(any &container, meta_any &key) { diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index baf1b2ac1..97a5d345c 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -119,7 +119,7 @@ public: [[nodiscard]] inline iterator begin(); [[nodiscard]] inline iterator end(); 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 explicit operator bool() const noexcept; @@ -132,7 +132,7 @@ private: bool (*clear_fn)(any &) = nullptr; iterator (*iter_fn)(any &, const bool) = 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; 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. * @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); } diff --git a/test/entt/meta/meta_container.cpp b/test/entt/meta/meta_container.cpp index b85961139..17861101f 100644 --- a/test/entt/meta/meta_container.cpp +++ b/test/entt/meta/meta_container.cpp @@ -230,11 +230,11 @@ TEST_F(MetaContainer, StdMap) { ASSERT_EQ(view.find(0)->second.cast(), 'a'); ASSERT_EQ(view.find(1.)->second.cast(), 'b'); - ASSERT_FALSE(view.erase(invalid_type{})); + ASSERT_EQ(view.erase(invalid_type{}), 0u); ASSERT_FALSE(view.find(invalid_type{})); ASSERT_EQ(view.size(), 5u); - ASSERT_TRUE(view.erase(0)); + ASSERT_EQ(view.erase(0), 1u); ASSERT_EQ(view.size(), 4u); ASSERT_EQ(view.find(0), view.end()); @@ -242,7 +242,7 @@ TEST_F(MetaContainer, StdMap) { ASSERT_EQ(view.find(1.f)->second.cast(), 'f'); - ASSERT_TRUE(view.erase(1.)); + ASSERT_EQ(view.erase(1.), 1u); ASSERT_TRUE(view.clear()); ASSERT_EQ(view.size(), 0u); } @@ -272,11 +272,11 @@ TEST_F(MetaContainer, StdSet) { ASSERT_EQ(view.find(0)->first.cast(), 0); ASSERT_EQ(view.find(1.)->first.cast(), 1); - ASSERT_FALSE(view.erase(invalid_type{})); + ASSERT_EQ(view.erase(invalid_type{}), 0u); ASSERT_FALSE(view.find(invalid_type{})); ASSERT_EQ(view.size(), 5u); - ASSERT_TRUE(view.erase(0)); + ASSERT_EQ(view.erase(0), 1u); ASSERT_EQ(view.size(), 4u); ASSERT_EQ(view.find(0), view.end()); @@ -284,7 +284,7 @@ TEST_F(MetaContainer, StdSet) { ASSERT_NE(view.find(1.)->first.try_cast(), nullptr); ASSERT_EQ(view.find(true)->first.cast(), 1); - ASSERT_TRUE(view.erase(1.)); + ASSERT_EQ(view.erase(1.), 1u); ASSERT_TRUE(view.clear()); ASSERT_EQ(view.size(), 0u); } @@ -319,11 +319,11 @@ TEST_F(MetaContainer, DenseMap) { ASSERT_EQ(view.find(0)->second.cast(), 'a'); ASSERT_EQ(view.find(1.)->second.cast(), 'b'); - ASSERT_FALSE(view.erase(invalid_type{})); + ASSERT_EQ(view.erase(invalid_type{}), 0u); ASSERT_FALSE(view.find(invalid_type{})); ASSERT_EQ(view.size(), 5u); - ASSERT_TRUE(view.erase(0)); + ASSERT_EQ(view.erase(0), 1u); ASSERT_EQ(view.size(), 4u); ASSERT_EQ(view.find(0), view.end()); @@ -331,7 +331,7 @@ TEST_F(MetaContainer, DenseMap) { ASSERT_EQ(view.find(1.f)->second.cast(), 'f'); - ASSERT_TRUE(view.erase(1.)); + ASSERT_EQ(view.erase(1.), 1u); ASSERT_TRUE(view.clear()); ASSERT_EQ(view.size(), 0u); } @@ -365,11 +365,11 @@ TEST_F(MetaContainer, DenseSet) { ASSERT_EQ(view.find(0)->first.cast(), 0); ASSERT_EQ(view.find(1.)->first.cast(), 1); - ASSERT_FALSE(view.erase(invalid_type{})); + ASSERT_EQ(view.erase(invalid_type{}), 0u); ASSERT_FALSE(view.find(invalid_type{})); ASSERT_EQ(view.size(), 5u); - ASSERT_TRUE(view.erase(0)); + ASSERT_EQ(view.erase(0), 1u); ASSERT_EQ(view.size(), 4u); ASSERT_EQ(view.find(0), view.end()); @@ -377,7 +377,7 @@ TEST_F(MetaContainer, DenseSet) { ASSERT_NE(view.find(1.)->first.try_cast(), nullptr); ASSERT_EQ(view.find(true)->first.cast(), 1); - ASSERT_TRUE(view.erase(1.)); + ASSERT_EQ(view.erase(1.), 1u); ASSERT_TRUE(view.clear()); ASSERT_EQ(view.size(), 0u); } @@ -454,7 +454,7 @@ TEST_F(MetaContainer, ConstKeyValueAssociativeContainer) { ASSERT_EQ(view.find(0), view.end()); ASSERT_EQ(view.find(2)->second.cast(), 'c'); - ASSERT_FALSE(view.erase(2)); + ASSERT_EQ(view.erase(2), 0u); ASSERT_EQ(view.size(), 1u); 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(2)->first.cast(), 2); - ASSERT_FALSE(view.erase(2)); + ASSERT_EQ(view.erase(2), 0u); ASSERT_EQ(view.size(), 1u); ASSERT_NE(view.find(2), view.end());