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