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.hpp43
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;
};