56 lines
822 B
C++
56 lines
822 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(const T& value) const
|
|
{
|
|
return m_ValueToID.at(value);
|
|
}
|
|
|
|
inline const T& ByID(int id) const
|
|
{
|
|
return m_IDtoValue.at(id);
|
|
}
|
|
|
|
inline size_t Size() const
|
|
{
|
|
return m_IDtoValue.size();
|
|
}
|
|
|
|
|
|
};
|
|
} |