diff options
Diffstat (limited to 'sim/param.cc')
-rw-r--r-- | sim/param.cc | 57 |
1 files changed, 21 insertions, 36 deletions
diff --git a/sim/param.cc b/sim/param.cc index 8284983a8..1ae11fdd2 100644 --- a/sim/param.cc +++ b/sim/param.cc @@ -88,53 +88,41 @@ BaseParam::die(const string &err) const // Integer types all use to_number for parsing and '<<' for // displaying // -#define INT_PARAM(type) \ -bool \ -parseParam(const string &s, type &value) \ -{ \ - return to_number(s, value); \ -} \ - \ -void \ -showParam(ostream &os, type value) \ -{ \ - os << value; \ -} - -INT_PARAM(unsigned long long) -INT_PARAM(signed long long) -INT_PARAM(unsigned long) -INT_PARAM(signed long) -INT_PARAM(unsigned int) -INT_PARAM(signed int) -INT_PARAM(unsigned short) -INT_PARAM(signed short) -INT_PARAM(unsigned char) -INT_PARAM(signed char) - -#undef INT_PARAM +template <class T> +bool +parseParam(const string &s, T &value) +{ + return to_number(s, value); +} + +template <class T> +void +showParam(ostream &os, const T &value) +{ + os << value; +} // // Floating-point types // +template <> bool parseParam(const string &s, float &value) { return (sscanf(s.c_str(), "%f", &value) == 1); } +template <> bool parseParam(const string &s, double &value) { return (sscanf(s.c_str(), "%lf", &value) == 1); } -void showParam(ostream &os, float value) { os << value; } -void showParam(ostream &os, double value) { os << value; } - // // bool // +template <> bool parseParam(const string &s, bool &value) { @@ -154,8 +142,9 @@ parseParam(const string &s, bool &value) } +template <> void -showParam(ostream &os, bool value) +showParam(ostream &os, const bool &value) { os << (value ? "true" : "false"); } @@ -164,6 +153,7 @@ showParam(ostream &os, bool value) // // string // +template <> bool parseParam(const string &s, string &value) { @@ -171,13 +161,6 @@ parseParam(const string &s, string &value) return true; } - -void -showParam(ostream &os, const string &value) -{ - os << value; -} - // // End of parseParam/showParam definitions. Now we move on to // incorporate them into the Param/VectorParam parse() and showValue() @@ -274,6 +257,8 @@ template VectorParam<type>; // instantiate all four methods (parse/show, scalar/vector) for basic // types that can use the above templates #define INSTANTIATE_PARAM_TEMPLATES(type, typestr) \ +template bool parseParam<type>(const string &s, type &value); \ +template void showParam<type>(ostream &os, const type &value); \ template void Param<type>::parse(const string &); \ template void VectorParam<type>::parse(const string &); \ template void Param<type>::showValue(ostream &) const; \ |