Kaynağa Gözat

meta: safe self-assignment for meta_any

skypjack 5 ay önce
ebeveyn
işleme
f73409e9ad
2 değiştirilmiş dosya ile 14 ekleme ve 14 silme
  1. 0 5
      src/entt/meta/meta.hpp
  2. 14 9
      test/entt/meta/meta_any.cpp

+ 0 - 5
src/entt/meta/meta.hpp

@@ -351,15 +351,10 @@ public:
 
     /**
      * @brief Move assignment operator.
-     *
-     * @warning
-     * Self-moving puts objects in a safe but unspecified state.
-     *
      * @param other The instance to move from.
      * @return This meta any object.
      */
     meta_any &operator=(meta_any &&other) noexcept {
-        reset();
         storage = std::move(other.storage);
         ctx = other.ctx;
         resolve = std::exchange(other.resolve, nullptr);

+ 14 - 9
test/entt/meta/meta_any.cpp

@@ -372,9 +372,11 @@ TEST_F(MetaAny, SBOSelfMoveAssignment) {
     // avoid warnings due to self-assignment
     any = std::move(*&any);
 
-    ASSERT_FALSE(any);
-    ASSERT_FALSE(any.type());
-    ASSERT_EQ(any.base().data(), nullptr);
+    ASSERT_TRUE(any);
+    ASSERT_FALSE(any.try_cast<std::size_t>());
+    ASSERT_EQ(any.cast<int>(), 3);
+    ASSERT_EQ(any, entt::meta_any{3});
+    ASSERT_NE(any, entt::meta_any{0});
 }
 
 TEST_F(MetaAny, SBODirectAssignment) {
@@ -707,9 +709,11 @@ TEST_F(MetaAny, NoSBOSelfMoveAssignment) {
     // avoid warnings due to self-assignment
     any = std::move(*&any);
 
-    ASSERT_FALSE(any);
-    ASSERT_FALSE(any.type());
-    ASSERT_EQ(any.base().data(), nullptr);
+    ASSERT_TRUE(any);
+    ASSERT_FALSE(any.try_cast<std::size_t>());
+    ASSERT_EQ(any.cast<fat>(), instance);
+    ASSERT_EQ(any, entt::meta_any{instance});
+    ASSERT_NE(any, fat{});
 }
 
 TEST_F(MetaAny, NoSBODirectAssignment) {
@@ -962,9 +966,10 @@ TEST_F(MetaAny, VoidSelfMoveAssignment) {
     // avoid warnings due to self-assignment
     any = std::move(*&any);
 
-    ASSERT_FALSE(any);
-    ASSERT_FALSE(any.type());
-    ASSERT_EQ(any.base().data(), nullptr);
+    ASSERT_TRUE(any);
+    ASSERT_FALSE(any.try_cast<std::size_t>());
+    ASSERT_EQ(any.type(), entt::resolve<void>());
+    ASSERT_EQ(any, entt::meta_any{std::in_place_type<void>});
 }
 
 TEST_F(MetaAny, SBOMoveInvalidate) {