meta: assoc container's ::erase/::find accept also convertible keys

This commit is contained in:
Michele Caini
2020-06-26 14:57:33 +02:00
parent 6ddc725b75
commit 5dd25aed4d
2 changed files with 10 additions and 6 deletions

View File

@@ -1817,20 +1817,22 @@ struct meta_associative_container::meta_associative_container_proxy {
}
[[nodiscard]] static bool erase(void *container, meta_any key) {
using k_type = typename meta_associative_container_traits<Type>::key_type;
bool ret = false;
if(const auto *k_ptr = key.try_cast<typename meta_associative_container_traits<Type>::key_type>(); k_ptr) {
ret = meta_associative_container_traits<Type>::erase(*static_cast<Type *>(container), *k_ptr);
if(const auto *k_ptr = key.try_cast<typename meta_associative_container_traits<Type>::key_type>(); k_ptr || key.convert<k_type>()) {
ret = meta_associative_container_traits<Type>::erase(*static_cast<Type *>(container), k_ptr ? *k_ptr : key.cast<k_type>());
}
return ret;
}
[[nodiscard]] static iterator find(void *container, meta_any key) {
using k_type = typename meta_associative_container_traits<Type>::key_type;
iterator ret{};
if(const auto *k_ptr = key.try_cast<typename meta_associative_container_traits<Type>::key_type>(); k_ptr) {
ret = iterator{std::in_place_type<Type>, meta_associative_container_traits<Type>::find(*static_cast<Type *>(container), *k_ptr)};
if(const auto *k_ptr = key.try_cast<typename meta_associative_container_traits<Type>::key_type>(); k_ptr || key.convert<k_type>()) {
ret = iterator{std::in_place_type<Type>, meta_associative_container_traits<Type>::find(*static_cast<Type *>(container), k_ptr ? *k_ptr : key.cast<k_type>())};
}
return ret;

View File

@@ -184,7 +184,7 @@ TEST_F(MetaContainer, StdMap) {
ASSERT_EQ(view.size(), 5u);
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_TRUE(view.erase(0));
ASSERT_EQ(view.size(), 4u);
@@ -194,6 +194,7 @@ TEST_F(MetaContainer, StdMap) {
ASSERT_EQ((*view.find(1)).second.cast<char>(), 'f');
ASSERT_TRUE(view.erase(1.));
ASSERT_TRUE(view.clear());
ASSERT_EQ(view.size(), 0u);
}
@@ -236,7 +237,7 @@ TEST_F(MetaContainer, StdSet) {
ASSERT_EQ(view.size(), 5u);
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_TRUE(view.erase(0));
ASSERT_EQ(view.size(), 4u);
@@ -246,6 +247,7 @@ TEST_F(MetaContainer, StdSet) {
ASSERT_EQ((*view.find(1)).first.cast<int>(), 1);
ASSERT_TRUE(view.erase(1.));
ASSERT_TRUE(view.clear());
ASSERT_EQ(view.size(), 0u);
}