mirror of
https://github.com/SpeedBreakerProject/speedbreaker.git
synced 2026-10-17 20:01:22 +02:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
42 lines
834 B
C++
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];
|
|
}
|
|
}; |