[Bf-blender-cvs] [7de7ac55d2b] soc-2021-adaptive-cloth: bli: generational_arena: get related tests and respective fixes

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


Commit: 7de7ac55d2b0a42dc037276583a5471da626a28f
Author: ishbosamiya
Date:   Wed Jun 16 13:56:28 2021 +0530
Branches: soc-2021-adaptive-cloth
https://developer.blender.org/rB7de7ac55d2b0a42dc037276583a5471da626a28f

bli: generational_arena: get related tests and respective fixes

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

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 05ca740a06e..c009bec750a 100644
--- a/source/blender/blenlib/BLI_generational_arena.hh
+++ b/source/blender/blenlib/BLI_generational_arena.hh
@@ -85,6 +85,11 @@ class Index {
     this->generation = generation;
   }
 
+  inline bool operator==(const Index &other) const
+  {
+    return (this->index == other.index) && (this->generation == other.generation);
+  }
+
   static inline Index invalid()
   {
     return Index(std::numeric_limits<usize>::max(), std::numeric_limits<usize>::max());
@@ -299,7 +304,12 @@ class Arena {
       return std::nullopt;
     }
 
-    return std::cref(this->data[index]);
+    if (auto entry = std::get_if<EntryExist>(&this->data[index])) {
+      return std::cref(entry->value);
+    }
+    else {
+      return std::nullopt;
+    }
   }
 
   std::optional<std::reference_wrapper<T>> get_no_gen(usize index)
@@ -309,7 +319,12 @@ class Arena {
       return std::nullopt;
     }
 
-    return std::ref(this->data[index]);
+    if (auto entry = std::get_if<EntryExist>(&this->data[index])) {
+      return std::ref(entry->value);
+    }
+    else {
+      return std::nullopt;
+    }
   }
 
   std::optional<Index> get_no_gen_index(usize index) const
@@ -320,12 +335,12 @@ class Arena {
     }
 
     std::optional<Index> res;
-    std::visit(extra::overloaded{
-                   [&res](EntryNoExist &entry) { res = std::nullopt; },
-                   [&res, index](EntryExist &entry) { res = Index(index, entry.generation); }},
-               this->data[index]);
-
-    return res;
+    if (auto entry = std::get_if<EntryExist>(&this->data[index])) {
+      return Index(index, entry->generation);
+    }
+    else {
+      return std::nullopt;
+    }
   }
 
   isize capacity() const
diff --git a/source/blender/blenlib/tests/BLI_generational_arena_test.cc b/source/blender/blenlib/tests/BLI_generational_arena_test.cc
index 0e5730046f8..b58d91982af 100644
--- a/source/blender/blenlib/tests/BLI_generational_arena_test.cc
+++ b/source/blender/blenlib/tests/BLI_generational_arena_test.cc
@@ -37,4 +37,45 @@ TEST(generational_arena, Insert)
   EXPECT_EQ(arena.get(i5), 5);
 }
 
+TEST(generational_arena, Get)
+{
+  Arena<int> arena(3);
+  EXPECT_EQ(arena.capacity(), 3);
+  auto i1 = arena.insert(1);
+  auto i2 = arena.insert(2);
+  EXPECT_EQ(arena.capacity(), 3);
+  EXPECT_EQ(arena.size(), 2);
+  (*arena.get(i1)).get() = 5;
+  EXPECT_EQ(arena.get(i1), 5);
+  EXPECT_EQ(arena.get(i2), 2);
+}
+
+TEST(generational_arena, GetNoGen)
+{
+  Arena<int> arena(3);
+  EXPECT_EQ(arena.capacity(), 3);
+  auto i1 = arena.insert(1);
+  auto i2 = arena.insert(2);
+  EXPECT_EQ(arena.capacity(), 3);
+  EXPECT_EQ(arena.size(), 2);
+  (*arena.get_no_gen(0)).get() = 5;
+  EXPECT_EQ(arena.get(i1), 5);
+  EXPECT_EQ(arena.get(i2), 2);
+  EXPECT_EQ(arena.get_no_gen(1), 2);
+  EXPECT_EQ(arena.get_no_gen(2), std::nullopt);
+}
+
+TEST(generational_arena, GetNoGenIndex)
+{
+  Arena<int> arena(3);
+  EXPECT_EQ(arena.capacity(), 3);
+  auto i1 = arena.insert(1);
+  auto i2 = arena.insert(2);
+  EXPECT_EQ(arena.capacity(), 3);
+  EXPECT_EQ(arena.size(), 2);
+  EXPECT_EQ(arena.get_no_gen_index(0), i1);
+  EXPECT_EQ(arena.get_no_gen_index(1), i2);
+  EXPECT_EQ(arena.get_no_gen(2), std::nullopt);
+}
+
 } /* namespace blender::tests */



More information about the Bf-blender-cvs mailing list