From 0a882c4b85423a170455f05a52d18f7fa7c9220b Mon Sep 17 00:00:00 2001 From: Quentin LADEVIE Date: Sun, 22 Jan 2023 17:59:24 +0100 Subject: Api test bindless and command buffers --- include/api-test/freelist.hpp | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) (limited to 'include/api-test/freelist.hpp') diff --git a/include/api-test/freelist.hpp b/include/api-test/freelist.hpp index e5af6f5..9553a15 100644 --- a/include/api-test/freelist.hpp +++ b/include/api-test/freelist.hpp @@ -1,32 +1,57 @@ #include #include -template + +static constexpr uint32_t default_element_count = 1024U; + +template class freelist { public: freelist() - : holes(initial_size), + : free(initial_size), items(initial_size) { - std::iota(holes.begin(), holes.end(), 0); + std::iota(free.rbegin(), free.rend(), 0); } uint32_t add(const T& item) { - const auto id = holes.back(); - holes.pop_back(); + const auto id = free.back(); + free.pop_back(); - items[id] = std::move(item); + items[id] = item; return id; } void remove(uint32_t item_id) { - holes.push_back(item_id); + free.push_back(item_id); } - const T& operator[](uint32_t index) { + T& operator[](uint32_t index) { return items[index]; } + uint32_t find(const T& seeked_item) { + for (auto index { 0U }; index < items.size(); index++) { + const auto& item = items[index]; + if (memcmp(&item, &seeked_item, sizeof(T)) == 0) { + return index; + } + } + + return invalid_handle; + } + + auto begin() { + return items.begin(); + } + + auto end() { + return items.end(); + } + + static constexpr uint32_t invalid_handle = -1; + +private: std::vector items; - std::vector holes; + std::vector free; }; -- cgit v1.3