[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