20#ifndef OPM_ORDERED_MAP_HPP
21#define OPM_ORDERED_MAP_HPP
23#include <unordered_map>
31template <
typename K,
typename T>
35 using index_type =
typename std::unordered_map<K,std::size_t>;
57 std::size_t
count(
const K& key)
const {
58 return this->m_map.count(key);
64 if (this->
count(key) == 0)
65 this->
insert( std::make_pair(key, T()));
71 std::size_t
erase(
const K& key) {
72 if (this->
count(key) == 0)
75 std::size_t
index = this->m_map.at(key);
76 this->m_map.erase(key);
77 this->m_vector.erase(this->m_vector.begin() +
index);
79 for (
const auto& index_pair : this->m_map) {
80 auto target_index = index_pair.second;
81 if (target_index >
index)
84 this->m_map[index_pair.first] = target_index;
90 void insert(std::pair<K,T> key_value_pair) {
91 if (this->
count(key_value_pair.first) > 0) {
92 auto iter = m_map.find( key_value_pair.first );
93 size_t index = iter->second;
94 m_vector[
index] = key_value_pair;
96 size_t index = m_vector.size();
97 this->m_map.emplace(key_value_pair.first,
index);
98 this->m_vector.push_back( std::move( key_value_pair ) );
104 auto iter = m_map.find( key );
105 if (iter == m_map.end())
106 throw std::invalid_argument(
"Key not found:");
108 size_t index = iter->second;
115 if (
index >= m_vector.size())
116 throw std::invalid_argument(
"Invalid index");
117 return m_vector[
index].second;
120 const T&
get(
const K& key)
const {
121 const auto& iter = this->m_map.find( key );
122 if (iter == m_map.end())
123 throw std::invalid_argument(
"Key not found: ??");
125 size_t index = iter->second;
132 if (
index >= m_vector.size())
133 throw std::invalid_argument(
"Invalid index");
134 return m_vector[
index].second;
138 return this->
iget(index);
141 const T&
at(
const K& key)
const {
142 return this->
get(key);
146 return this->
iget(index);
149 T&
at(
const K& key) {
150 return this->
get(key);
154 return m_vector.size();
159 return m_vector.begin();
164 return m_vector.end();
168 return m_vector.begin();
172 return m_vector.end();
176 const auto map_iter = this->m_map.find(key);
177 if (map_iter == this->m_map.end())
178 return this->m_vector.end();
180 return std::next(this->m_vector.begin(), map_iter->second);
184 const auto map_iter = this->m_map.find(key);
185 if (map_iter == this->m_map.end())
186 return this->m_vector.end();
188 return std::next(this->m_vector.begin(), map_iter->second);
196 template<
class Serializer>
200 serializer.vector(m_vector);
int index
Definition: cJSON.h:168
Definition: OrderedMap.hpp:32
T & at(const K &key)
Definition: OrderedMap.hpp:149
const index_type & getIndex() const
Definition: OrderedMap.hpp:53
T & iget(size_t index)
Definition: OrderedMap.hpp:114
bool operator==(const OrderedMap< K, T > &data) const
Definition: OrderedMap.hpp:191
void insert(std::pair< K, T > key_value_pair)
Definition: OrderedMap.hpp:90
size_t size() const
Definition: OrderedMap.hpp:153
typename std::unordered_map< K, std::size_t > index_type
Definition: OrderedMap.hpp:35
const T & get(const K &key) const
Definition: OrderedMap.hpp:120
const T & at(size_t index) const
Definition: OrderedMap.hpp:137
T & operator[](const K &key)
Definition: OrderedMap.hpp:63
T & at(size_t index)
Definition: OrderedMap.hpp:145
const_iter_type begin() const
Definition: OrderedMap.hpp:158
typename storage_type::const_iterator const_iter_type
Definition: OrderedMap.hpp:37
std::size_t count(const K &key) const
Definition: OrderedMap.hpp:57
const storage_type & getStorage() const
Definition: OrderedMap.hpp:55
typename std::vector< std::pair< K, T > > storage_type
Definition: OrderedMap.hpp:34
const T & iget(size_t index) const
Definition: OrderedMap.hpp:131
const_iter_type find(const K &key) const
Definition: OrderedMap.hpp:183
T & get(const K &key)
Definition: OrderedMap.hpp:103
OrderedMap(const index_type &index, const storage_type &storage)
Definition: OrderedMap.hpp:47
iter_type find(const K &key)
Definition: OrderedMap.hpp:175
const T & at(const K &key) const
Definition: OrderedMap.hpp:141
typename storage_type::iterator iter_type
Definition: OrderedMap.hpp:36
iter_type end()
Definition: OrderedMap.hpp:171
std::size_t erase(const K &key)
Definition: OrderedMap.hpp:71
iter_type begin()
Definition: OrderedMap.hpp:167
const_iter_type end() const
Definition: OrderedMap.hpp:163
void serializeOp(Serializer &serializer)
Definition: OrderedMap.hpp:197
Definition: Serializer.hpp:38