Browse Source

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

Michele Caini 5 years ago
parent
commit
5dd25aed4d
2 changed files with 10 additions and 6 deletions
  1. 6 4
      src/entt/meta/meta.hpp
  2. 4 2
      test/entt/meta/meta_container.cpp

+ 6 - 4
src/entt/meta/meta.hpp

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

+ 4 - 2
test/entt/meta/meta_container.cpp

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