[Bf-blender-cvs] [0ba4520162e] soc-2021-adaptive-cloth: bli: generational_arena: remove() with test

ishbosamiya noreply at git.blender.org
Fri Jun 18 11:22:45 CEST 2021


Commit: 0ba4520162e46d76c45b863c131642b2ee769e1b
Author: ishbosamiya
Date:   Wed Jun 16 14:21:15 2021 +0530
Branches: soc-2021-adaptive-cloth
https://developer.blender.org/rB0ba4520162e46d76c45b863c131642b2ee769e1b

bli: generational_arena: remove() with test

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

M	source/blender/blenlib/BLI_generational_arena.hh
M	source/blender/blenlib/tests/BLI_generational_arena_test.cc

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

diff --git a/source/blender/blenlib/BLI_generational_arena.hh b/source/blender/blenlib/BLI_generational_arena.hh
index c009bec750a..330b9abec4d 100644
--- a/source/blender/blenlib/BLI_generational_arena.hh
+++ b/source/blender/blenlib/BLI_generational_arena.hh
@@ -257,6 +257,31 @@ class Arena {
     }
   }
 
+  std::optional<T> remove(Index index)
+  {
+    if (index.index >= this->data.size()) {
+      return std::nullopt;
+    }
+
+    if (auto entry = std::get_if<EntryExist>(&this->data[index.index])) {
+      if (index.generation != entry->generation) {
+        return std::nullopt;
+      }
+      else {
+        /* must update the next_free list, length and generation */
+        this->length -= 1;
+        this->generation += 1;
+        auto value = std::move(entry->value);
+        this->data[index.index] = EntryNoExist(this->next_free_head);
+        this->next_free_head = index.index;
+        return value;
+      }
+    }
+    else {
+      return std::nullopt;
+    }
+  }
+
   std::optional<std::reference_wrapper<const T>> get(Index index) const
   {
     /* if index exceeds size of the container, return std::nullopt */
diff --git a/source/blender/blenlib/tests/BLI_generational_arena_test.cc b/source/blender/blenlib/tests/BLI_generational_arena_test.cc
index b58d91982af..fb827707110 100644
--- a/source/blender/blenlib/tests/BLI_generational_arena_test.cc
+++ b/source/blender/blenlib/tests/BLI_generational_arena_test.cc
@@ -37,6 +37,33 @@ TEST(generational_arena, Insert)
   EXPECT_EQ(arena.get(i5), 5);
 }
 
+TEST(generational_arena, Remove)
+{
+  Arena<int> arena(3);
+  EXPECT_EQ(arena.capacity(), 3);
+  auto i1 = arena.insert(1);
+  auto i2 = arena.insert(2);
+  auto i3 = arena.insert(3);
+  auto i4 = arena.insert(4);
+  auto i5 = arena.insert(5);
+
+  EXPECT_EQ(arena.capacity(), 6);
+  EXPECT_EQ(arena.size(), 5);
+  auto value = arena.remove(i1);
+  EXPECT_EQ(value, 1);
+  EXPECT_EQ(arena.size(), 4);
+  EXPECT_EQ(arena.get(i1), std::nullopt);
+  arena.insert(9);
+  EXPECT_EQ(arena.size(), 5);
+  EXPECT_EQ(arena.get(i1), std::nullopt);
+  EXPECT_EQ(arena.get_no_gen(0), 9);
+
+  EXPECT_EQ(arena.get(i2), 2);
+  EXPECT_EQ(arena.get(i3), 3);
+  EXPECT_EQ(arena.get(i4), 4);
+  EXPECT_EQ(arena.get(i5), 5);
+}
+
 TEST(generational_arena, Get)
 {
   Arena<int> arena(3);



More information about the Bf-blender-cvs mailing list