|
1
|
1 #pragma once
|
|
|
2
|
|
|
3 #include <map>
|
|
|
4 #include <algorithm>
|
|
|
5 #include <vector>
|
|
|
6
|
|
|
7 template<typename key_t, typename value_t> class fixed_map {
|
|
|
8 public:
|
|
|
9 typedef std::map<key_t, value_t> source_t;
|
|
|
10
|
|
|
11 void initialize(source_t&& src) {
|
|
|
12 const size_t size = src.size();
|
|
|
13 m_keys.resize(size); m_values.resize(size);
|
|
|
14 size_t walk = 0;
|
|
|
15 for (auto iter = src.begin(); iter != src.end(); ++iter) {
|
|
|
16 m_keys[walk] = iter->first;
|
|
|
17 m_values[walk] = std::move(iter->second);
|
|
|
18 ++walk;
|
|
|
19 }
|
|
|
20 src.clear();
|
|
|
21 }
|
|
|
22
|
|
|
23 value_t query(key_t key) const {
|
|
|
24 auto iter = std::lower_bound(m_keys.begin(), m_keys.end(), key);
|
|
|
25 if (iter == m_keys.end() || *iter != key) return 0;
|
|
|
26 return m_values[iter - m_keys.begin()];
|
|
|
27 }
|
|
|
28
|
|
|
29 const value_t* query_ptr(key_t key) const {
|
|
|
30 auto iter = std::lower_bound(m_keys.begin(), m_keys.end(), key);
|
|
|
31 if (iter == m_keys.end() || *iter != key) return nullptr;
|
|
|
32 return &m_values[iter - m_keys.begin()];
|
|
|
33 }
|
|
|
34 private:
|
|
|
35 std::vector<key_t> m_keys;
|
|
|
36 std::vector<value_t> m_values;
|
|
|
37 }; |