Serialization: Provide array serialization methods that work on std::vector
authorAli Saidi <saidi@eecs.umich.edu>
Thu, 2 Aug 2007 18:43:27 +0000 (14:43 -0400)
committerAli Saidi <saidi@eecs.umich.edu>
Thu, 2 Aug 2007 18:43:27 +0000 (14:43 -0400)
--HG--
extra : convert_revision : aecdf1a7e50edbb12921991cc81df1b431ce8b38

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

index a01e053b93a8acb3f8d8ca6ffb249633d28d39b8..a7f81d5fbd1cf063c52700e949004d1a271390d9 100644 (file)
@@ -40,6 +40,7 @@
 #include <string>
 #include <vector>
 
+#include "base/annotate.hh"
 #include "base/inifile.hh"
 #include "base/misc.hh"
 #include "base/output.hh"
@@ -178,6 +179,22 @@ paramOut(ostream &os, const std::string &name, const T &param)
     os << "\n";
 }
 
+template <class T>
+void
+arrayParamOut(ostream &os, const std::string &name,
+              const std::vector<T> &param)
+{
+    int size = param.size();
+    os << name << "=";
+    if (size > 0)
+        showParam(os, param[0]);
+    for (int i = 1; i < size; ++i) {
+        os << " ";
+        showParam(os, param[i]);
+    }
+    os << "\n";
+}
+
 
 template <class T>
 void
@@ -251,6 +268,49 @@ arrayParamIn(Checkpoint *cp, const std::string &section,
     }
 }
 
+template <class T>
+void
+arrayParamIn(Checkpoint *cp, const std::string &section,
+             const std::string &name, std::vector<T> &param)
+{
+    std::string str;
+    if (!cp->find(section, name, str)) {
+        fatal("Can't unserialize '%s:%s'\n", section, name);
+    }
+
+    // code below stolen from VectorParam<T>::parse().
+    // it would be nice to unify these somehow...
+
+    vector<string> tokens;
+
+    tokenize(tokens, str, ' ');
+
+    // Need this if we were doing a vector
+    // value.resize(tokens.size());
+
+    param.resize(tokens.size());
+
+    for (int i = 0; i < tokens.size(); i++) {
+        // need to parse into local variable to handle vector<bool>,
+        // for which operator[] returns a special reference class
+        // that's not the same as 'bool&', (since it's a packed
+        // vector)
+        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[i] = scalar_value;
+    }
+}
+
+
 
 void
 objParamIn(Checkpoint *cp, const std::string &section,
@@ -273,7 +333,13 @@ arrayParamOut(ostream &os, const std::string &name,                        \
               type const *param, int size);                            \
 template void                                                          \
 arrayParamIn(Checkpoint *cp, const std::string &section,               \
-             const std::string &name, type *param, int size);
+             const std::string &name, type *param, int size);           \
+template void                                                          \
+arrayParamOut(ostream &os, const std::string &name,                    \
+              const std::vector<type> &param);                         \
+template void                                                          \
+arrayParamIn(Checkpoint *cp, const std::string &section,               \
+             const std::string &name, std::vector<type> &param);
 
 INSTANTIATE_PARAM_TEMPLATES(signed char)
 INSTANTIATE_PARAM_TEMPLATES(unsigned char)
@@ -343,6 +409,7 @@ Serializable::serializeAll(const std::string &cpt_dir)
     outstream << "// checkpoint generated: " << ctime(&t);
 
     globals.serialize(outstream);
+    Annotate::annotations.serialize(outstream);
     SimObject::serializeAll(outstream);
 }
 
@@ -358,7 +425,7 @@ Serializable::unserializeAll(const std::string &cpt_dir)
              dir);
     Checkpoint *cp = new Checkpoint(dir, section);
     unserializeGlobals(cp);
-
+    Annotate::annotations.unserialize(cp);
     SimObject::unserializeAll(cp);
 }
 
index 43cd4ecf4cb3bdea060417d8f6e7edec2c2a6a6a..e72eedb3013aa667a641ff678f87bfacab11f7b5 100644 (file)
@@ -39,6 +39,7 @@
 
 
 #include <list>
+#include <vector>
 #include <iostream>
 #include <map>
 
@@ -60,10 +61,18 @@ template <class T>
 void arrayParamOut(std::ostream &os, const std::string &name,
                    const T *param, int size);
 
+template <class T>
+void arrayParamOut(std::ostream &os, const std::string &name,
+                   const std::vector<T> &param);
+
 template <class T>
 void arrayParamIn(Checkpoint *cp, const std::string &section,
                   const std::string &name, T *param, int size);
 
+template <class T>
+void arrayParamIn(Checkpoint *cp, const std::string &section,
+                  const std::string &name, std::vector<T> &param);
+
 void
 objParamIn(Checkpoint *cp, const std::string &section,
            const std::string &name, SimObject * &param);