Răsfoiți Sursa

meta: iterators of meta associative containers return keys by const reference rather than by copy

Michele Caini 5 ani în urmă
părinte
comite
cf0da32fd0
2 a modificat fișierele cu 10 adăugiri și 7 ștergeri
  1. 2 2
      src/entt/meta/meta.hpp
  2. 8 5
      test/entt/meta/meta_container.cpp

+ 2 - 2
src/entt/meta/meta.hpp

@@ -2044,9 +2044,9 @@ class meta_associative_container::meta_iterator {
             break;
             break;
         case operation::DEREF:
         case operation::DEREF:
             if constexpr(KeyOnly) {
             if constexpr(KeyOnly) {
-                static_cast<std::pair<meta_any, meta_any> *>(to)->first = *any_cast<const It &>(from);
+                static_cast<std::pair<meta_any, meta_any> *>(to)->first = std::cref(*any_cast<const It &>(from));
             } else {
             } else {
-                *static_cast<std::pair<meta_any, meta_any> *>(to) = std::make_pair<meta_any, meta_any>(any_cast<const It &>(from)->first, std::reference_wrapper{any_cast<const It &>(from)->second});
+                *static_cast<std::pair<meta_any, meta_any> *>(to) = std::make_pair<meta_any, meta_any>(std::cref(any_cast<const It &>(from)->first), std::reference_wrapper{any_cast<const It &>(from)->second});
             }
             }
             break;
             break;
         }
         }

+ 8 - 5
test/entt/meta/meta_container.cpp

@@ -259,9 +259,9 @@ TEST_F(MetaContainer, StdSet) {
     ASSERT_EQ(view.size(), 4u);
     ASSERT_EQ(view.size(), 4u);
     ASSERT_EQ(view.find(0), view.end());
     ASSERT_EQ(view.find(0), view.end());
 
 
-    (*view.find(1)).first.cast<int &>() = 42;
-
-    ASSERT_EQ((*view.find(1)).first.cast<int>(), 1);
+    ASSERT_EQ((*view.find(1)).first.try_cast<int>(), nullptr);
+    ASSERT_NE((*view.find(1)).first.try_cast<const int>(), nullptr);
+    ASSERT_EQ((*view.find(1)).first.cast<const int &>(), 1);
 
 
     ASSERT_TRUE(view.erase(1.));
     ASSERT_TRUE(view.erase(1.));
     ASSERT_TRUE(view.clear());
     ASSERT_TRUE(view.clear());
@@ -365,8 +365,9 @@ TEST_F(MetaContainer, ConstKeyOnlyAssociativeContainer) {
     ASSERT_EQ(view.size(), 1u);
     ASSERT_EQ(view.size(), 1u);
     ASSERT_NE(view.begin(), view.end());
     ASSERT_NE(view.begin(), view.end());
 
 
+    ASSERT_EQ((*view.find(2)).first.try_cast<int>(), nullptr);
+    ASSERT_NE((*view.find(2)).first.try_cast<const int>(), nullptr);
     ASSERT_EQ((*view.find(2)).first.cast<int>(), 2);
     ASSERT_EQ((*view.find(2)).first.cast<int>(), 2);
-    ASSERT_EQ((*view.find(2)).first.cast<int &>(), 2);
     ASSERT_EQ((*view.find(2)).first.cast<const int &>(), 2);
     ASSERT_EQ((*view.find(2)).first.cast<const int &>(), 2);
 
 
     ASSERT_FALSE(view.insert(0));
     ASSERT_FALSE(view.insert(0));
@@ -422,8 +423,10 @@ TEST_F(MetaContainer, KeyOnlyAssociativeContainerConstMetaAny) {
 
 
         ASSERT_TRUE(view);
         ASSERT_TRUE(view);
         ASSERT_EQ(view.value_type(), (entt::resolve<int>()));
         ASSERT_EQ(view.value_type(), (entt::resolve<int>()));
+
+        ASSERT_EQ((*view.find(2)).first.try_cast<int>(), nullptr);
+        ASSERT_NE((*view.find(2)).first.try_cast<const int>(), nullptr);
         ASSERT_EQ((*view.find(2)).first.cast<int>(), 2);
         ASSERT_EQ((*view.find(2)).first.cast<int>(), 2);
-        ASSERT_EQ((*view.find(2)).first.cast<int &>(), 2);
         ASSERT_EQ((*view.find(2)).first.cast<const int &>(), 2);
         ASSERT_EQ((*view.find(2)).first.cast<const int &>(), 2);
     };
     };