From b4d24e8f2cb4838acc0b827f007e7faa609039ba Mon Sep 17 00:00:00 2001 From: ladevieq Date: Wed, 24 Dec 2025 15:35:21 +0100 Subject: Use build.bat for building Everything is included in main.cpp Do not rely on vcpkg anymore --- include/api-test/freelist.hpp | 56 +++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 21 deletions(-) (limited to 'include/api-test/freelist.hpp') 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 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::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 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 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(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::invalid_id; } struct element { union { T item; - uint32_t next_free = -1; + uint32_t next_free = freelist::invalid_id; }; uint32_t generation = 0U; }; std::vector elements; + uint32_t next_free_id; }; template @@ -87,51 +94,58 @@ class idlist { } handle 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::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::invalid_id; return { id, ++element.generation }; } void remove(handle 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(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(++next_free % initial_size), + .next_free = static_cast(++next_free% initial_size), } ); } - elements.back().next_free = -1U; + elements.back().next_free = idlist::invalid_id; } struct element { - uint32_t next_free = -1; + uint32_t next_free = idlist::invalid_id; uint32_t generation = 0U; }; std::vector elements; + uint32_t next_free_id; }; -- cgit v1.3