[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