[Bf-blender-cvs] [c26a23f245d] functions: fix set vector remove

Jacques Lucke noreply at git.blender.org
Tue Aug 20 18:32:44 CEST 2019


Commit: c26a23f245da324346b0d9fc15433ffd11b84530
Author: Jacques Lucke
Date:   Tue Aug 20 12:34:39 2019 +0200
Branches: functions
https://developer.blender.org/rBc26a23f245da324346b0d9fc15433ffd11b84530

fix set vector remove

===================================================================

M	source/blender/blenlib/BLI_set_vector.hpp
M	tests/gtests/blenlib/BLI_set_vector_test.cc

===================================================================

diff --git a/source/blender/blenlib/BLI_set_vector.hpp b/source/blender/blenlib/BLI_set_vector.hpp
index 7206140b3a2..399a0e6de6f 100644
--- a/source/blender/blenlib/BLI_set_vector.hpp
+++ b/source/blender/blenlib/BLI_set_vector.hpp
@@ -87,6 +87,11 @@ template<typename T, typename Allocator = GuardedAllocator> class SetVector {
       return m_value;
     }
 
+    int32_t &index_ref()
+    {
+      return m_value;
+    }
+
     void set_index(uint index)
     {
       BLI_assert(!this->is_set());
@@ -175,8 +180,18 @@ template<typename T, typename Allocator = GuardedAllocator> class SetVector {
     BLI_assert(this->contains(value));
     ITER_SLOTS_BEGIN (value, m_array, , slot) {
       if (slot.has_value(value, m_elements)) {
+        uint old_index = m_elements.size() - 1;
+        uint new_index = slot.index();
+
+        m_elements.remove_and_reorder(new_index);
         slot.set_dummy();
         m_array.update__set_to_dummy();
+
+        if (old_index != new_index) {
+          T &moved_value = m_elements[new_index];
+          this->update_slot_index(moved_value, old_index, new_index);
+        }
+        return;
       }
     }
     ITER_SLOTS_END;
@@ -258,6 +273,18 @@ template<typename T, typename Allocator = GuardedAllocator> class SetVector {
   }
 
  private:
+  void update_slot_index(T &value, uint old_index, uint new_index)
+  {
+    ITER_SLOTS_BEGIN (value, m_array, , slot) {
+      int32_t &stored_index = slot.index_ref();
+      if (stored_index == old_index) {
+        stored_index = new_index;
+        return;
+      }
+    }
+    ITER_SLOTS_END;
+  }
+
   void add_new_in_slot(Slot &slot, const T &value)
   {
     uint index = m_elements.size();
diff --git a/tests/gtests/blenlib/BLI_set_vector_test.cc b/tests/gtests/blenlib/BLI_set_vector_test.cc
index 10680493fba..afd25d4fb93 100644
--- a/tests/gtests/blenlib/BLI_set_vector_test.cc
+++ b/tests/gtests/blenlib/BLI_set_vector_test.cc
@@ -80,3 +80,23 @@ TEST(set_vector, IndexTry)
   EXPECT_EQ(set.index_try(6), 1);
   EXPECT_EQ(set.index_try(2), -1);
 }
+
+TEST(set_vector, Remove)
+{
+  IntSetVector set = {4, 5, 6, 7};
+  EXPECT_EQ(set.size(), 4);
+  set.remove(5);
+  EXPECT_EQ(set.size(), 3);
+  EXPECT_EQ(set[0], 4);
+  EXPECT_EQ(set[1], 7);
+  EXPECT_EQ(set[2], 6);
+  set.remove(6);
+  EXPECT_EQ(set.size(), 2);
+  EXPECT_EQ(set[0], 4);
+  EXPECT_EQ(set[1], 7);
+  set.remove(4);
+  EXPECT_EQ(set.size(), 1);
+  EXPECT_EQ(set[0], 7);
+  set.remove(7);
+  EXPECT_EQ(set.size(), 0);
+}



More information about the Bf-blender-cvs mailing list