aboutsummaryrefslogtreecommitdiff
path: root/extension/src/openvic2/Types.hpp
diff options
context:
space:
mode:
author Hop311 <hop3114@gmail.com>2023-05-01 00:59:54 +0200
committer Hop311 <hop3114@gmail.com>2023-05-01 00:59:54 +0200
commit2fec521cc6bbe7b2cda0eef3b830acbfc8b68333 (patch)
treee18e9cb252030e9b40ff91463ed117dd00a65789 /extension/src/openvic2/Types.hpp
parentbce925ad8efa7bbf508e79cab2110416a71cb8ee (diff)
Hashmaps instead of linear + better province hover
Diffstat (limited to 'extension/src/openvic2/Types.hpp')
-rw-r--r--extension/src/openvic2/Types.hpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/extension/src/openvic2/Types.hpp b/extension/src/openvic2/Types.hpp
index 1359fbe..e4a0e2d 100644
--- a/extension/src/openvic2/Types.hpp
+++ b/extension/src/openvic2/Types.hpp
@@ -1,9 +1,9 @@
#pragma once
-#include <string>
#include <vector>
#include <cstdint>
#include <algorithm>
+#include <map>
#include "Logger.hpp"
@@ -74,9 +74,12 @@ namespace OpenVic2 {
*/
template<class T, typename std::enable_if<std::is_base_of<HasIdentifier, T>::value>::type* = nullptr>
class IdentifierRegistry {
+ using identifier_index_map_t = std::map<std::string, size_t>;
+
const std::string name;
std::vector<T> items;
bool locked = false;
+ identifier_index_map_t identifier_index_map;
public:
IdentifierRegistry(std::string const& new_name) : name(new_name) {}
return_t add_item(T&& item) {
@@ -89,6 +92,7 @@ namespace OpenVic2 {
Logger::error("Cannot add item to the ", name, " registry - an item with the identifier \"", item.get_identifier(), "\" already exists!");
return FAILURE;
}
+ identifier_index_map[item.get_identifier()] = items.size();
items.push_back(std::move(item));
return SUCCESS;
}
@@ -104,6 +108,7 @@ namespace OpenVic2 {
return locked;
}
void reset() {
+ identifier_index_map.clear();
items.clear();
locked = false;
}
@@ -111,15 +116,13 @@ namespace OpenVic2 {
return items.size();
}
T* get_item_by_identifier(std::string const& identifier) {
- if (!identifier.empty())
- for (T& item : items)
- if (item.get_identifier() == identifier) return &item;
+ const identifier_index_map_t::const_iterator it = identifier_index_map.find(identifier);
+ if (it != identifier_index_map.end()) return &items[it->second];
return nullptr;
}
T const* get_item_by_identifier(std::string const& identifier) const {
- if (!identifier.empty())
- for (T const& item : items)
- if (item.get_identifier() == identifier) return &item;
+ const identifier_index_map_t::const_iterator it = identifier_index_map.find(identifier);
+ if (it != identifier_index_map.end()) return &items[it->second];
return nullptr;
}
T* get_item_by_index(size_t index) {