17#pragma warning(disable: 4293)
19namespace ECS {
namespace util {
36 typename handle_value_type,
42 static_assert(
sizeof(handle_value_type) * CHAR_BIT >= (version_bits + index_bits),
"Invalid handle layout. More bits used than base value type can hold!");
106 template<
class T,
class handle_type,
size_t grow = 1024>
113 using TableEntry = std::pair<typename Handle::value_type, T*>;
120 size_t oldSize = this->m_Table.size();
122 assert(oldSize < Handle::MAX_INDICES &&
"Max table capacity reached!");
124 size_t newSize = std::min(oldSize + grow, Handle::MAX_INDICES);
126 this->m_Table.resize(newSize);
128 for (
typename Handle::value_type i = oldSize; i < newSize; ++i)
129 this->m_Table[i] =
TableEntry(Handle::MIN_VERISON,
nullptr);
144 typename Handle::value_type i = 0;
145 for (; i < this->m_Table.size(); ++i)
147 if (this->m_Table[i].second ==
nullptr)
149 this->m_Table[i].second = rawObject;
151 this->m_Table[i].first = ((this->m_Table[i].first + 1) > Handle::MAX_VERSION) ? Handle::MIN_VERISON : this->m_Table[i].first + 1;
153 return Handle(i, this->m_Table[i].first);
160 this->m_Table[i].first = 1;
161 this->m_Table[i].second = rawObject;
163 return Handle(i, this->m_Table[i].first);
168 assert((handle.index < this->m_Table.size() && handle.version == this->m_Table[handle.index].first) &&
"Invalid handle!");
169 this->m_Table[handle.index].second =
nullptr;
190 return this->m_Table[handle.index].first != handle.version;
210 assert(index < this->
m_Table.size() &&
"Invalid handle!");
211 return Handle(index, this->m_Table[index].first);
231 assert((handle.index < this->m_Table.size() && handle.version == this->m_Table[handle.index].first) &&
"Invalid handle!");
232 return (this->m_Table[handle.index].first == handle.version ? this->m_Table[handle.index].second :
nullptr);
void ReleaseHandle(Handle handle)
std::pair< typename Handle::value_type, T * > TableEntry
bool IsExpired(Handle handle) const
T * operator[](Handle handle)
Handle operator[](typename Handle::value_type index) const
std::vector< TableEntry > m_Table
Handle AcquireHandle(T *rawObject)
Internal::Handle< u32, 12, 20 > Handle32
Handle(value_type index, value_type version)
handle_value_type value_type
static constexpr value_type MIN_VERISON
static constexpr size_t NUM_INDEX_BITS
static constexpr value_type MAX_VERSION
static constexpr size_t NUM_VERSION_BITS
static constexpr value_type INVALID_HANDLE
bool operator==(const Handle &other) const
static constexpr value_type MAX_INDICES
bool operator!=(const Handle &other) const