diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2025-12-24 15:35:21 +0100 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2025-12-24 15:35:21 +0100 |
| commit | b4d24e8f2cb4838acc0b827f007e7faa609039ba (patch) | |
| tree | ba6504b67923789d84b2473eb4e14f7002e34ab7 /include/api-test/freelist.hpp | |
| parent | c29105b461135f3909cca0308fb05715cee45763 (diff) | |
Use build.bat for building
Everything is included in main.cpp
Do not rely on vcpkg anymore
Diffstat (limited to 'include/api-test/freelist.hpp')
| -rw-r--r-- | include/api-test/freelist.hpp | 56 |
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; }; |
