Просмотр исходного кода

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

Michele Caini 5 лет назад
Родитель
Сommit
cf0da32fd0
2 измененных файлов с 10 добавлено и 7 удалено
  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;
         case operation::DEREF:
             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 {
-                *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;
         }

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

@@ -259,9 +259,9 @@ TEST_F(MetaContainer, StdSet) {
     ASSERT_EQ(view.size(), 4u);
     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.clear());
@@ -365,8 +365,9 @@ TEST_F(MetaContainer, ConstKeyOnlyAssociativeContainer) {
     ASSERT_EQ(view.size(), 1u);
     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<const int &>(), 2);
 
     ASSERT_FALSE(view.insert(0));
@@ -422,8 +423,10 @@ TEST_F(MetaContainer, KeyOnlyAssociativeContainerConstMetaAny) {
 
         ASSERT_TRUE(view);
         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<const int &>(), 2);
     };