sim: support checkpointing std::set<std::string>'s
authorCurtis Dunham <Curtis.Dunham@arm.com>
Wed, 2 Sep 2015 20:19:44 +0000 (15:19 -0500)
committerCurtis Dunham <Curtis.Dunham@arm.com>
Wed, 2 Sep 2015 20:19:44 +0000 (15:19 -0500)
This is in support of tag-based checkpoint versioning; the version tags
are stored in string sets. This commit adds such support.

src/sim/serialize.cc
src/sim/serialize.hh

index 0ecf45b6d322fc4b3e8a4a4eb3564f20ed2db4ba..0904b1375c1dd3a576fe9e19bec307b64c6026b5 100644 (file)
@@ -210,6 +210,24 @@ arrayParamOut(CheckpointOut &os, const string &name, const list<T> &param)
     os << "\n";
 }
 
+template <class T>
+void
+arrayParamOut(CheckpointOut &os, const string &name, const set<T> &param)
+{
+    typename set<T>::const_iterator it = param.begin();
+
+    os << name << "=";
+    if (param.size() > 0)
+        showParam(os, *it);
+    it++;
+    while (it != param.end()) {
+        os << " ";
+        showParam(os, *it);
+        it++;
+    }
+    os << "\n";
+}
+
 template <class T>
 void
 paramIn(CheckpointIn &cp, const string &name, T &param)
@@ -368,6 +386,36 @@ arrayParamIn(CheckpointIn &cp, const string &name, list<T> &param)
     }
 }
 
+template <class T>
+void
+arrayParamIn(CheckpointIn &cp, const string &name, set<T> &param)
+{
+    const string &section(Serializable::currentSection());
+    string str;
+    if (!cp.find(section, name, str)) {
+        fatal("Can't unserialize '%s:%s'\n", section, name);
+    }
+    param.clear();
+
+    vector<string> tokens;
+    tokenize(tokens, str, ' ');
+
+    for (vector<string>::size_type i = 0; i < tokens.size(); i++) {
+        T scalar_value;
+        if (!parseParam(tokens[i], scalar_value)) {
+            string err("could not parse \"");
+
+            err += str;
+            err += "\"";
+
+            fatal(err);
+        }
+
+        // assign parsed value to vector
+        param.insert(scalar_value);
+    }
+}
+
 
 void
 objParamIn(CheckpointIn &cp, const string &name, SimObject * &param)
@@ -423,6 +471,11 @@ INSTANTIATE_PARAM_TEMPLATES(double)
 INSTANTIATE_PARAM_TEMPLATES(string)
 INSTANTIATE_PARAM_TEMPLATES(Pixel)
 
+// set is only used with strings and furthermore doesn't agree with Pixel
+template void
+arrayParamOut(CheckpointOut &, const string &, const set<string> &);
+template void
+arrayParamIn(CheckpointIn &, const string &, set<string> &);
 
 /////////////////////////////
 
index e3b761f10750c5dd91e888bf530b81d28a20ff5f..4a2cc04e9a4bbbc8ca2fbc02cbfc1edc427889f4 100644 (file)
@@ -55,6 +55,7 @@
 #include <list>
 #include <map>
 #include <stack>
+#include <set>
 #include <vector>
 
 #include "base/bitunion.hh"
@@ -123,6 +124,10 @@ template <class T>
 void arrayParamOut(CheckpointOut &cp, const std::string &name,
                    const std::list<T> &param);
 
+template <class T>
+void arrayParamOut(CheckpointOut &cp, const std::string &name,
+                   const std::set<T> &param);
+
 template <class T>
 void arrayParamIn(CheckpointIn &cp, const std::string &name,
                   T *param, unsigned size);
@@ -135,6 +140,10 @@ template <class T>
 void arrayParamIn(CheckpointIn &cp, const std::string &name,
                   std::list<T> &param);
 
+template <class T>
+void arrayParamIn(CheckpointIn &cp, const std::string &name,
+                  std::set<T> &param);
+
 void
 objParamIn(CheckpointIn &cp, const std::string &name, SimObject * &param);