56 lines
813 B
C
56 lines
813 B
C
|
#pragma once
|
||
|
|
||
|
#include <vector>
|
||
|
#include <unordered_map>
|
||
|
|
||
|
namespace Feather
|
||
|
{
|
||
|
|
||
|
template <typename T>
|
||
|
class IDMapper
|
||
|
{
|
||
|
std::vector<T> m_IDtoValue;
|
||
|
std::unordered_map<T, int> 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(T& value) const
|
||
|
{
|
||
|
return m_ValueToID.at(value);
|
||
|
}
|
||
|
|
||
|
inline const T& ByID(int id) const
|
||
|
{
|
||
|
return m_IDtoValue.at(id);
|
||
|
}
|
||
|
|
||
|
inline int Size() const
|
||
|
{
|
||
|
return m_IDtoValue.size();
|
||
|
}
|
||
|
|
||
|
|
||
|
};
|
||
|
}
|