Files
2026-10-08 13:25:54 +00:00

42 lines
834 B
C++

// Adapted from Unleashed Recompiled (https://github.com/hedge-dev/UnleashedRecomp),
// GPL-3.0-or-later. Modified for SpeedBreaker.
#pragma once
template<typename T>
struct FreeList
{
std::vector<T> items;
std::vector<size_t> freed{};
void Free(T& item)
{
std::destroy_at(&item);
freed.push_back(&item - items.data());
}
void Free(size_t index)
{
std::destroy_at(&items[index]);
freed.push_back(index);
}
size_t Alloc()
{
if (freed.size())
{
auto idx = freed[freed.size() - 1];
freed.pop_back();
std::construct_at(&items[idx]);
return idx;
}
items.emplace_back();
return items.size() - 1;
}
T& operator[](size_t idx)
{
return items[idx];
}
};