aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation/dataloader/NodeTools.hpp
diff options
context:
space:
mode:
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>