aboutsummaryrefslogtreecommitdiffstats
path: root/include/api-test/freelist.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/api-test/freelist.hpp')
-rw-r--r--include/api-test/freelist.hpp56
1 files changed, 35 insertions, 21 deletions
diff --git a/include/api-test/freelist.hpp b/include/api-test/freelist.hpp
index 3d0324d..cbcd56d 100644
--- a/include/api-test/freelist.hpp
+++ b/include/api-test/freelist.hpp
@@ -15,17 +15,20 @@ class freelist {
}
handle<T> add(const T& item) {
- auto id = elements[0U].next_free;
+ // auto id = elements[0U].next_free;
+ auto id = next_free_id;
- if (id == invalid_id) {
+ if (id == freelist<T>::invalid_id) {
grow(elements.size());
- id = elements[0U].next_free;
+ // id = elements[0U].next_free;
+ id = next_free_id;
}
auto& element = elements[id];
- elements[0U].next_free = element.next_free;
+ next_free_id = element.next_free;
+ // elements[0U].next_free = element.next_free;
element.item = std::move(item);
return { id, ++element.generation };
@@ -33,8 +36,10 @@ class freelist {
void remove(handle<T> handle) {
assert(handle.generation == elements[handle.id].generation);
- elements[handle.id].next_free = elements[0U].next_free;
- elements[0U].next_free = handle.id;
+ // elements[handle.id].next_free = elements[0U].next_free;
+ // elements[0U].next_free = handle.id;
+ elements[handle.id].next_free = next_free_id;
+ next_free_id = handle.id;
}
T& operator[](handle<T> handle) {
@@ -47,12 +52,13 @@ class freelist {
return elements[handle.id].item;
}
- static constexpr uint32_t invalid_id = -1;
+ static constexpr uint32_t invalid_id = UINT32_MAX;
private:
void grow(size_t grow_size) {
auto size = elements.size();
- uint32_t next_free = size;
+ uint32_t next_free = static_cast<uint32_t>(size);
+ next_free_id = next_free;
elements.reserve(size + grow_size);
@@ -64,18 +70,19 @@ private:
);
}
- elements.back().next_free = -1U;
+ elements.back().next_free = freelist<T>::invalid_id;
}
struct element {
union {
T item;
- uint32_t next_free = -1;
+ uint32_t next_free = freelist<T>::invalid_id;
};
uint32_t generation = 0U;
};
std::vector<element> elements;
+ uint32_t next_free_id;
};
template<const size_t initial_size = default_element_count>
@@ -87,51 +94,58 @@ class idlist {
}
handle<void> add() {
- auto id = elements[0U].next_free;
+ // auto id = elements[0U].next_free;
+ auto id = next_free_id;
- if (id == invalid_id) {
+ if (id == idlist<T>::invalid_id) {
grow(elements.size());
- id = elements[0U].next_free;
+ // id = elements[0U].next_free;
+ id = next_free_id;
}
auto& element = elements[id];
+ next_free_id = element.next_free;
elements[0U].next_free = element.next_free;
- element.next_free = -1;
+ element.next_free = idlist<T>::invalid_id;
return { id, ++element.generation };
}
void remove(handle<void> handle) {
assert(handle.generation == elements[handle.id].generation);
- elements[handle.id].next_free = elements[0U].next_free;
- elements[0U].next_free = handle.id;
+ // elements[handle.id].next_free = elements[0U].next_free;
+ // elements[0U].next_free = handle.id;
+ elements[handle.id].next_free = next_free_id;
+ next_free_id = handle.id;
}
- static constexpr uint32_t invalid_id = -1;
+ static constexpr uint32_t invalid_id = UINT32_MAX;
private:
void grow(size_t grow_size) {
auto size = elements.size();
- uint32_t next_free = size;
+ uint32_t next_free = static_cast<uint32_t>(size);
+ next_free_id = next_free;
elements.reserve(size + grow_size);
for (auto id { 0U }; id < initial_size; id++) {
elements.push_back(
{
- .next_free = static_cast<uint32_t>(++next_free % initial_size),
+ .next_free = static_cast<uint32_t>(++next_free% initial_size),
}
);
}
- elements.back().next_free = -1U;
+ elements.back().next_free = idlist<T>::invalid_id;
}
struct element {
- uint32_t next_free = -1;
+ uint32_t next_free = idlist<T>::invalid_id;
uint32_t generation = 0U;
};
std::vector<element> elements;
+ uint32_t next_free_id;
};