[Bf-blender-cvs] [7f194771f79] soc-2021-adaptive-cloth: bli: generational_arena: test for ensuring next_free list is correct

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


Commit: 7f194771f790464b08cb8168da71a961e2f85ee7
Author: ishbosamiya
Date:   Wed Jun 16 19:17:34 2021 +0530
Branches: soc-2021-adaptive-cloth
https://developer.blender.org/rB7f194771f790464b08cb8168da71a961e2f85ee7

bli: generational_arena: test for ensuring next_free list is correct

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

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 c1cdb0ce01f..95a2f962b77 100644
--- a/source/blender/blenlib/BLI_generational_arena.hh
+++ b/source/blender/blenlib/BLI_generational_arena.hh
@@ -60,6 +60,8 @@
 
 #include "BLI_vector.hh"
 
+#include "testing/testing.h"
+
 namespace blender::generational_arena {
 
 namespace extra {
@@ -384,6 +386,27 @@ class Arena {
  private:
   /* all private static methods */
   /* all private non-static methods */
+
+  FRIEND_TEST(generational_arena, GetNextFreeLocations);
+
+  blender::Vector<usize> get_next_free_locations() const
+  {
+    auto next_free = this->next_free_head;
+    blender::Vector<usize> locs;
+    locs.reserve(this->capacity() - this->size());
+
+    while (next_free) {
+      locs.append(*next_free);
+      if (auto entry = std::get_if<EntryNoExist>(&this->data[*next_free])) {
+        next_free = entry->next_free;
+      }
+      else {
+        BLI_assert_unreachable();
+      }
+    }
+
+    return locs;
+  }
 };
 
 } /* namespace blender::generational_arena */
diff --git a/source/blender/blenlib/tests/BLI_generational_arena_test.cc b/source/blender/blenlib/tests/BLI_generational_arena_test.cc
index 4e0e668385a..e677b293434 100644
--- a/source/blender/blenlib/tests/BLI_generational_arena_test.cc
+++ b/source/blender/blenlib/tests/BLI_generational_arena_test.cc
@@ -125,3 +125,73 @@ TEST(generational_arena, GetNoGenIndex)
 }
 
 } /* namespace blender::tests */
+
+namespace blender::generational_arena {
+
+TEST(generational_arena, GetNextFreeLocations)
+{
+  Arena<int> arena;
+  auto i0 = arena.insert(0);
+  auto i1 = arena.insert(1);
+  auto i2 = arena.insert(2);
+  auto i3 = arena.insert(3);
+
+  arena.remove(i0);
+  arena.remove(i1);
+  arena.remove(i2);
+  arena.remove(i3);
+
+  auto locs = arena.get_next_free_locations();
+  EXPECT_EQ(locs.size(), 4);
+  EXPECT_EQ(locs[0], 3);
+  EXPECT_EQ(locs[1], 2);
+  EXPECT_EQ(locs[2], 1);
+  EXPECT_EQ(locs[3], 0);
+
+  i0 = arena.insert(0);
+  i1 = arena.insert(1);
+  i2 = arena.insert(2);
+  i3 = arena.insert(3);
+
+  locs = arena.get_next_free_locations();
+  EXPECT_EQ(locs.size(), 0);
+
+  auto i4 = arena.insert(4);
+  arena.remove(i1);
+  arena.remove(i4);
+  locs = arena.get_next_free_locations();
+  EXPECT_EQ(locs.size(), 5);
+  EXPECT_EQ(locs[0], 4);
+  EXPECT_EQ(locs[1], 2);
+  EXPECT_EQ(locs[2], 5);
+  EXPECT_EQ(locs[3], 6);
+  EXPECT_EQ(locs[4], 7);
+
+  auto i_0 = arena.insert(10);
+  auto i_1 = arena.insert(11);
+  auto i_2 = arena.insert(12);
+  auto i_3 = arena.insert(13);
+  auto i_4 = arena.insert(14);
+
+  EXPECT_EQ(arena.size(), 8);
+  EXPECT_EQ(arena.get(i0), 0);
+  EXPECT_EQ(arena.get(i1), std::nullopt);
+  EXPECT_EQ(arena.get(i2), 2);
+  EXPECT_EQ(arena.get(i3), 3);
+  EXPECT_EQ(arena.get(i4), std::nullopt);
+  EXPECT_EQ(arena.get(i_0), 10);
+  EXPECT_EQ(arena.get(i_1), 11);
+  EXPECT_EQ(arena.get(i_2), 12);
+  EXPECT_EQ(arena.get(i_3), 13);
+  EXPECT_EQ(arena.get(i_4), 14);
+  EXPECT_EQ(arena.get_no_gen(0), 3);
+  EXPECT_EQ(arena.get_no_gen(1), 2);
+  EXPECT_EQ(arena.get_no_gen(2), 11);
+  EXPECT_EQ(arena.get_no_gen(3), 0);
+  EXPECT_EQ(arena.get_no_gen(4), 10);
+  EXPECT_EQ(arena.get_no_gen(5), 12);
+  EXPECT_EQ(arena.get_no_gen(6), 13);
+  EXPECT_EQ(arena.get_no_gen(7), 14);
+}
+
+} /* namespace blender::generational_arena */



More information about the Bf-blender-cvs mailing list