[Bf-blender-cvs] [20497c448c3] soc-2021-adaptive-cloth: bli: generational_arena: insert()
ishbosamiya
noreply at git.blender.org
Fri Jun 18 11:22:44 CEST 2021
Commit: 20497c448c38c25682dd625ee287624ab497a27a
Author: ishbosamiya
Date: Tue Jun 15 21:41:04 2021 +0530
Branches: soc-2021-adaptive-cloth
https://developer.blender.org/rB20497c448c38c25682dd625ee287624ab497a27a
bli: generational_arena: insert()
===================================================================
M source/blender/blenlib/BLI_generational_arena.hh
===================================================================
diff --git a/source/blender/blenlib/BLI_generational_arena.hh b/source/blender/blenlib/BLI_generational_arena.hh
index 65851467c5b..30a147ba157 100644
--- a/source/blender/blenlib/BLI_generational_arena.hh
+++ b/source/blender/blenlib/BLI_generational_arena.hh
@@ -52,6 +52,7 @@
*/
/* TODO(ish): need to complete documentation */
+#include <limits>
#include <optional>
#include <tuple>
#include <variant>
@@ -60,6 +61,32 @@
namespace blender::generational_arena {
+namespace extra {
+template<typename... Ts> struct overloaded : Ts... {
+ using Ts::operator()...;
+};
+template<typename... Ts> overloaded(Ts...) -> overloaded<Ts...>;
+} /* namespace extra */
+
+class Index {
+ using usize = uint64_t;
+
+ usize index;
+ usize generation;
+
+ public:
+ Index(usize index, usize generation)
+ {
+ this->index = index;
+ this->generation = generation;
+ }
+
+ std::tuple<usize, usize> get_raw() const
+ {
+ return std::make_tuple(this->index, this->generation);
+ }
+};
+
template<
/**
* Type of the values stored in this vector. It has to be movable.
@@ -109,6 +136,12 @@ class Arena {
struct EntryExist {
T value;
usize generation;
+
+ EntryExist(T value, usize generation)
+ {
+ this->value = value;
+ this->generation = generation;
+ }
};
blender::Vector<Entry> data;
@@ -158,6 +191,50 @@ class Arena {
this->next_free_head = start;
}
+ /* TODO(ish): add optimization by moving `value`, can be done by
+ * returning value if `try_insert()` fails */
+ std::optional<Index> try_insert(T value)
+ {
+ if (this->next_free_head) {
+ auto loc = this->next_free_head;
+ std::visit(extra::overloaded{[this, value](EntryNoExist &data) {
+ this->next_free_head = data.next_free;
+ data = EntryExist(value, this->generation);
+ },
+ [](EntryExist &data) {
+ /* The linked list created to
+ * know where to insert next is
+ * corrupted.
+ * `this->next_free_head` is corrupted */
+ BLI_assert_unreachable();
+ }},
+ this->data[loc]);
+ this->length += 1;
+ return Index(loc, this->generation);
+ }
+ return std::nullopt;
+ }
+
+ Index insert(T value)
+ {
+ if (auto index = this->try_insert(value)) {
+ return index;
+ }
+ else {
+ /* couldn't insert the value within reserved memory space */
+ /* TODO(ish): might be possible that `this->data.size()` is 0,
+ * needs a special case for that */
+ this->reserve(this->data.size() * 2);
+ if (auto index = this->try_insert(value)) {
+ return index;
+ }
+ else {
+ /* now that more memory has been reserved, it shouldn't fail */
+ BLI_assert_unreachable();
+ }
+ }
+ }
+
protected:
/* all protected static methods */
/* all protected non-static methods */
@@ -167,23 +244,4 @@ class Arena {
/* all private non-static methods */
};
-class Index {
- using usize = uint64_t;
-
- usize index;
- usize generation;
-
- public:
- Index(usize index, usize generation)
- {
- this->index = index;
- this->generation = generation;
- }
-
- std::tuple<usize, usize> get_raw() const
- {
- return std::make_tuple(this->index, this->generation);
- }
-};
-
} /* namespace blender::generational_arena */
More information about the Bf-blender-cvs
mailing list