diff options
author | Curtis Dunham <Curtis.Dunham@arm.com> | 2015-09-02 15:19:44 -0500 |
---|---|---|
committer | Curtis Dunham <Curtis.Dunham@arm.com> | 2015-09-02 15:19:44 -0500 |
commit | 62e0344aefd56cb1878cdbc27dbed11d6cc73ba4 (patch) | |
tree | 14a22cd0f0ce813ee5f7a11f67fb9a057d38726c | |
parent | 1ad5b772291220d44b355d8d939d625db7dffc1a (diff) | |
download | gem5-62e0344aefd56cb1878cdbc27dbed11d6cc73ba4.tar.xz |
sim: support checkpointing std::set<std::string>'s
This is in support of tag-based checkpoint versioning; the version tags
are stored in string sets. This commit adds such support.
-rw-r--r-- | src/sim/serialize.cc | 53 | ||||
-rw-r--r-- | src/sim/serialize.hh | 9 |
2 files changed, 62 insertions, 0 deletions
diff --git a/src/sim/serialize.cc b/src/sim/serialize.cc index 0ecf45b6d..0904b1375 100644 --- a/src/sim/serialize.cc +++ b/src/sim/serialize.cc @@ -212,6 +212,24 @@ arrayParamOut(CheckpointOut &os, const string &name, const list<T> ¶m) template <class T> void +arrayParamOut(CheckpointOut &os, const string &name, const set<T> ¶m) +{ + 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 ¶m) { const string §ion(Serializable::currentSection()); @@ -368,6 +386,36 @@ arrayParamIn(CheckpointIn &cp, const string &name, list<T> ¶m) } } +template <class T> +void +arrayParamIn(CheckpointIn &cp, const string &name, set<T> ¶m) +{ + const string §ion(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 * ¶m) @@ -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> &); ///////////////////////////// diff --git a/src/sim/serialize.hh b/src/sim/serialize.hh index e3b761f10..4a2cc04e9 100644 --- a/src/sim/serialize.hh +++ b/src/sim/serialize.hh @@ -55,6 +55,7 @@ #include <list> #include <map> #include <stack> +#include <set> #include <vector> #include "base/bitunion.hh" @@ -124,6 +125,10 @@ void arrayParamOut(CheckpointOut &cp, const std::string &name, const std::list<T> ¶m); template <class T> +void arrayParamOut(CheckpointOut &cp, const std::string &name, + const std::set<T> ¶m); + +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> ¶m); +template <class T> +void arrayParamIn(CheckpointIn &cp, const std::string &name, + std::set<T> ¶m); + void objParamIn(CheckpointIn &cp, const std::string &name, SimObject * ¶m); |