/
IdValueMap.h
41 lines (35 loc) · 974 Bytes
/
IdValueMap.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#pragma once
#include "Base.h"
#include "Util.h"
template <class TId, class TValue>
class IdValueMap {
public:
TId getOrCreateId(const TValue& value) {
auto ptr = stl::mapGetPtr(_valueToIdMap, value);
if (ptr) {
return *ptr;
} else {
TId id = _idToValueMap.size();
MY_ASSERT(id != -1);
_idToValueMap.push_back(value);
_valueToIdMap[value] = id;
return id;
}
}
TId getId(const TValue& value) const {
auto ptr = stl::mapGetPtr(_valueToIdMap, value);
if (ptr) {
return *ptr;
} else {
return -1;
}
};
const TValue& getValue(TId id) const {
MY_ASSERT(id < _idToValueMap.size());
return _idToValueMap[id];
};
size_t size() const { return _idToValueMap.size(); }
private:
std::unordered_map<TValue, TId> _valueToIdMap;
std::vector<TValue> _idToValueMap;
};