diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2017-04-20 16:52:53 +0200 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2017-04-20 16:52:53 +0200 |
commit | 4410e9d995bcd53a7a4cff0bbee3917375adcba3 (patch) | |
tree | 9798177ab77f4918c15f7f9b4061915e71bb79a6 /src/libutil | |
parent | f05d5f89ff4ec52ed2f6d576b2b2323b5292f815 (diff) |
Setting: Remove "Tag" template argument
Diffstat (limited to 'src/libutil')
-rw-r--r-- | src/libutil/config.cc | 53 | ||||
-rw-r--r-- | src/libutil/config.hh | 48 |
2 files changed, 51 insertions, 50 deletions
diff --git a/src/libutil/config.cc b/src/libutil/config.cc index bf1372997..72b6cf806 100644 --- a/src/libutil/config.cc +++ b/src/libutil/config.cc @@ -111,83 +111,72 @@ AbstractSetting::AbstractSetting( { } -template<> void Setting<std::string>::set(const std::string & str) +template<> void BaseSetting<std::string>::set(const std::string & str) { value = str; } -template<> std::string Setting<std::string>::to_string() +template<> std::string BaseSetting<std::string>::to_string() { return value; } -template<typename T, typename Tag> -void Setting<T, Tag>::set(const std::string & str) +template<typename T> +void BaseSetting<T>::set(const std::string & str) { static_assert(std::is_integral<T>::value, "Integer required."); if (!string2Int(str, value)) throw UsageError("setting '%s' has invalid value '%s'", name, str); } -template<typename T, typename Tag> -std::string Setting<T, Tag>::to_string() +template<typename T> +std::string BaseSetting<T>::to_string() { static_assert(std::is_integral<T>::value, "Integer required."); return std::to_string(value); } -bool AbstractSetting::parseBool(const std::string & str) +template<> void BaseSetting<bool>::set(const std::string & str) { if (str == "true" || str == "yes" || str == "1") - return true; + value = true; else if (str == "false" || str == "no" || str == "0") - return false; + value = false; else throw UsageError("Boolean setting '%s' has invalid value '%s'", name, str); } -template<> void Setting<bool>::set(const std::string & str) +template<> std::string BaseSetting<bool>::to_string() { - value = parseBool(str); + return value ? "true" : "false"; } -std::string AbstractSetting::printBool(bool b) -{ - return b ? "true" : "false"; -} - - -template<> std::string Setting<bool>::to_string() -{ - return printBool(value); -} - -template<> void Setting<Strings>::set(const std::string & str) +template<> void BaseSetting<Strings>::set(const std::string & str) { value = tokenizeString<Strings>(str); } -template<> std::string Setting<Strings>::to_string() +template<> std::string BaseSetting<Strings>::to_string() { return concatStringsSep(" ", value); } -template<> void Setting<StringSet>::set(const std::string & str) +template<> void BaseSetting<StringSet>::set(const std::string & str) { value = tokenizeString<StringSet>(str); } -template<> std::string Setting<StringSet>::to_string() +template<> std::string BaseSetting<StringSet>::to_string() { return concatStringsSep(" ", value); } -template class Setting<int>; -template class Setting<unsigned int>; -template class Setting<long>; -template class Setting<unsigned long>; -template class Setting<long long>; -template class Setting<unsigned long long>; +template class BaseSetting<int>; +template class BaseSetting<unsigned int>; +template class BaseSetting<long>; +template class BaseSetting<unsigned long>; +template class BaseSetting<long long>; +template class BaseSetting<unsigned long long>; void PathSetting::set(const std::string & str) { diff --git a/src/libutil/config.hh b/src/libutil/config.hh index 952bf04b8..130f59e2b 100644 --- a/src/libutil/config.hh +++ b/src/libutil/config.hh @@ -90,17 +90,12 @@ protected: virtual std::string to_string() = 0; - bool parseBool(const std::string & str); - std::string printBool(bool b); - bool isOverriden() { return overriden; } }; -struct DefaultSettingTag { }; - /* A setting of type T. */ -template<typename T, typename Tag = DefaultSettingTag> -class Setting : public AbstractSetting +template<typename T> +class BaseSetting : public AbstractSetting { protected: @@ -108,23 +103,21 @@ protected: public: - Setting(Config * options, - const T & def, + BaseSetting(const T & def, const std::string & name, const std::string & description, const std::set<std::string> & aliases = {}) : AbstractSetting(name, description, aliases) , value(def) - { - options->addSetting(this); - } + { } operator const T &() const { return value; } operator T &() { return value; } const T & get() const { return value; } bool operator ==(const T & v2) const { return value == v2; } bool operator !=(const T & v2) const { return value != v2; } - void operator =(const T & v) { value = v; } + void operator =(const T & v) { assign(v); } + virtual void assign(const T & v) { value = v; } void set(const std::string & str) override; @@ -132,18 +125,35 @@ public: }; template<typename T> -std::ostream & operator <<(std::ostream & str, const Setting<T> & opt) +std::ostream & operator <<(std::ostream & str, const BaseSetting<T> & opt) { str << (const T &) opt; return str; } template<typename T> -bool operator ==(const T & v1, const Setting<T> & v2) { return v1 == (const T &) v2; } +bool operator ==(const T & v1, const BaseSetting<T> & v2) { return v1 == (const T &) v2; } + +template<typename T> +class Setting : public BaseSetting<T> +{ +public: + Setting(Config * options, + const T & def, + const std::string & name, + const std::string & description, + const std::set<std::string> & aliases = {}) + : BaseSetting<T>(def, name, description, aliases) + { + options->addSetting(this); + } + + void operator =(const T & v) { this->assign(v); } +}; /* A special setting for Paths. These are automatically canonicalised (e.g. "/foo//bar/" becomes "/foo/bar"). */ -class PathSetting : public Setting<Path> +class PathSetting : public BaseSetting<Path> { bool allowEmpty; @@ -155,15 +165,17 @@ public: const std::string & name, const std::string & description, const std::set<std::string> & aliases = {}) - : Setting<Path>(options, def, name, description, aliases) + : BaseSetting<Path>(def, name, description, aliases) , allowEmpty(allowEmpty) { - set(value); + options->addSetting(this); } void set(const std::string & str) override; Path operator +(const char * p) const { return value + p; } + + void operator =(const Path & v) { this->assign(v); } }; } |