diff options
Diffstat (limited to 'include/api-test/freelist.hpp')
| -rw-r--r-- | include/api-test/freelist.hpp | 43 |
1 files changed, 34 insertions, 9 deletions
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 <numeric> #include <vector> -template<typename T, const size_t initial_size = 1024U> + +static constexpr uint32_t default_element_count = 1024U; + +template<typename T, const size_t initial_size = default_element_count> 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<T> items; - std::vector<uint32_t> holes; + std::vector<uint32_t> free; }; |
