#pragma once #include #include namespace Feather { template class IDMapper { std::vector m_IDtoValue; std::unordered_map m_ValueToID; int m_NextID = 0; public: IDMapper(int size = 512) { m_IDtoValue.reserve(size); m_ValueToID.reserve(size); } inline void AddMapping(int id, T& value) { m_IDtoValue.insert(m_IDtoValue.begin() + id, value); m_ValueToID.insert({ value, id }); if (m_NextID <= id) { m_NextID = id + 1; } } inline void Add(T& value) { AddMapping(m_NextID, value); } inline int GetID(const T& value) const { return m_ValueToID.at(value); } inline const T& ByID(int id) const { return m_IDtoValue.at(id); } inline bool HasValue(const T& value) const { return m_ValueToID.contains(value); } inline size_t Size() const { return m_IDtoValue.size(); } }; }