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

meta: add a test (and a fix) for a corner case of meta_reset

Michele Caini 3 лет назад
Родитель
Сommit
65ee240e8e
2 измененных файлов с 14 добавлено и 2 удалено
  1. 3 1
      src/entt/meta/factory.hpp
  2. 11 1
      test/entt/meta/meta_type.cpp

+ 3 - 1
src/entt/meta/factory.hpp

@@ -453,9 +453,11 @@ template<typename Type>
 inline void meta_reset(const id_type id) noexcept {
     auto &&context = internal::meta_context::from(locator<meta_ctx>::value_or());
 
-    for(auto it = context.value.begin(); it != context.value.end(); ++it) {
+    for(auto it = context.value.begin(); it != context.value.end();) {
         if(it->second->id == id) {
             it = context.value.erase(it);
+        } else {
+            ++it;
         }
     }
 }

+ 11 - 1
test/entt/meta/meta_type.cpp

@@ -5,9 +5,9 @@
 #include <vector>
 #include <gtest/gtest.h>
 #include <entt/core/hashed_string.hpp>
-#include <entt/locator/locator.hpp>
 #include <entt/core/type_info.hpp>
 #include <entt/core/utility.hpp>
+#include <entt/locator/locator.hpp>
 #include <entt/meta/container.hpp>
 #include <entt/meta/context.hpp>
 #include <entt/meta/factory.hpp>
@@ -525,6 +525,16 @@ TEST_F(MetaType, Reset) {
     ASSERT_TRUE(entt::resolve("clazz"_hs));
 }
 
+TEST_F(MetaType, ResetLast) {
+    auto id = (entt::resolve().cend() - 1u)->second.id();
+
+    ASSERT_TRUE(entt::resolve(id));
+
+    entt::meta_reset(id);
+
+    ASSERT_FALSE(entt::resolve(id));
+}
+
 TEST_F(MetaType, ResetAll) {
     using namespace entt::literals;