FeatherMC/src/data/IDMapper.h

62 lines
943 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 bool HasValue(const T& value) const
{
return m_ValueToID.contains(value);
}
inline size_t Size() const
{
return m_IDtoValue.size();
}
};
}