aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation/dataloader/NodeTools.hpp
diff options
context:
space:
mode:
author Hop311 <Hop3114@gmail.com>2024-07-17 14:01:19 +0200
committer GitHub <noreply@github.com>2024-07-17 14:01:19 +0200
commit2d111ea003e975ea1adbcd7e4d903f760f1daa07 (patch)
treefae6a1086f3ae698c4fb3f18340c5ed5f580c889 /src/openvic-simulation/dataloader/NodeTools.hpp
parente8a3b33f13ebdf3a388b4996308b4db9763dc375 (diff)
parentf83e869def6608f64606aead24ad1cfbb6f5c72a (diff)
Merge pull request #174 from OpenVicProject/indexed-map
Add IndexedMap and use in low key count, high value density cases
Diffstat (limited to 'src/openvic-simulation/dataloader/NodeTools.hpp')
-rw-r--r--src/openvic-simulation/dataloader/NodeTools.hpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/openvic-simulation/dataloader/NodeTools.hpp b/src/openvic-simulation/dataloader/NodeTools.hpp
index b0bb723..e53e896 100644
--- a/src/openvic-simulation/dataloader/NodeTools.hpp
+++ b/src/openvic-simulation/dataloader/NodeTools.hpp
@@ -12,6 +12,7 @@
#include "openvic-simulation/types/Colour.hpp"
#include "openvic-simulation/types/Date.hpp"
#include "openvic-simulation/types/HasIdentifier.hpp"
+#include "openvic-simulation/types/IndexedMap.hpp"
#include "openvic-simulation/types/OrderedContainers.hpp"
#include "openvic-simulation/types/Vector.hpp"
#include "openvic-simulation/utility/Getters.hpp"
@@ -537,6 +538,26 @@ namespace OpenVic {
};
}
+ template<typename Key, typename Value>
+ Callback<Value> auto map_callback(
+ IndexedMap<Key, Value>& map, Key const* key, bool warn = false
+ ) {
+ return [&map, key, warn](Value value) -> bool {
+ if (key == nullptr) {
+ Logger::error("Null key in map_callback");
+ return false;
+ }
+ Value& map_value = map[*key];
+ bool ret = true;
+ if (map_value != Value {}) {
+ Logger::warn_or_error(warn, "Duplicate map entry with key: \"", key, "\"");
+ ret = warn;
+ }
+ map_value = std::move(value);
+ return ret;
+ };
+ }
+
/* Often used for rotations which must be negated due to OpenVic's coordinate system being orientated
* oppositely to Vic2's. */
template<typename T = fixed_point_t>