From 620c8a5ba5d30e98da2d0e2d5dec4ae25d84be05 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Sat, 16 Jul 2022 17:32:01 +0200 Subject: [PATCH] Change storage strategy of output named variables This finally closes #27 Also add a test to check that used names are unique --- src/output/OutputNamedItemValueSet.hpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/output/OutputNamedItemValueSet.hpp b/src/output/OutputNamedItemValueSet.hpp index 69d6424d5..463e67a55 100644 --- a/src/output/OutputNamedItemValueSet.hpp +++ b/src/output/OutputNamedItemValueSet.hpp @@ -6,8 +6,9 @@ #include <algebra/TinyMatrix.hpp> #include <algebra/TinyVector.hpp> +#include <utils/Exceptions.hpp> -#include <map> +#include <sstream> #include <string> #include <variant> @@ -96,7 +97,9 @@ class OutputNamedItemDataSet CellArray<const double>>; private: - std::map<std::string, ItemDataVariant> m_name_itemvariant_map; + // We do not use a map, we want variables to be written in the + // provided order + std::vector<std::pair<std::string, ItemDataVariant>> m_name_itemvariant_list; template <typename DataType, ItemType item_type, @@ -107,9 +110,14 @@ class OutputNamedItemDataSet PUGS_FORCEINLINE constexpr void _doInsert(const NamedItemData<DataType, item_type, ConnectivityPtr, ItemDataT>& named_item_data) { - if (m_name_itemvariant_map.find(named_item_data.name()) == m_name_itemvariant_map.end()) { - m_name_itemvariant_map[named_item_data.name()] = named_item_data.itemData(); + for (auto& [name, itemvariant] : m_name_itemvariant_list) { + if (name == named_item_data.name()) { + std::ostringstream error_msg; + error_msg << "duplicate name '" << rang::fgB::yellow << name << rang::fg::reset << "' in name output list"; + throw NormalError(error_msg.str()); + } } + m_name_itemvariant_list.push_back(std::make_pair(named_item_data.name(), named_item_data.itemData())); } template <typename DataType, @@ -132,13 +140,13 @@ class OutputNamedItemDataSet auto begin() const { - return m_name_itemvariant_map.begin(); + return m_name_itemvariant_list.begin(); } auto end() const { - return m_name_itemvariant_map.end(); + return m_name_itemvariant_list.end(); } template <typename DataType, -- GitLab