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

This commit is contained in:
Michele Caini
2022-06-24 15:03:45 +02:00
parent 6ac14f35ad
commit c2475381fd
3 changed files with 19 additions and 20 deletions

View File

@@ -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);
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) {

View File

@@ -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);
}

View File

@@ -230,11 +230,11 @@ TEST_F(MetaContainer, StdMap) {
ASSERT_EQ(view.find(0)->second.cast<char>(), 'a');
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_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<char>(), '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<int>(), 0);
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_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<const int>(), nullptr);
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_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(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_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<char>(), '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<int>(), 0);
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_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<const int>(), nullptr);
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_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<char>(), '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<int>(), 2);
ASSERT_FALSE(view.erase(2));
ASSERT_EQ(view.erase(2), 0u);
ASSERT_EQ(view.size(), 1u);
ASSERT_NE(view.find(2), view.end());