aboutsummaryrefslogtreecommitdiff
path: root/src/libutil
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-04-20 16:52:53 +0200
committerEelco Dolstra <edolstra@gmail.com>2017-04-20 16:52:53 +0200
commit4410e9d995bcd53a7a4cff0bbee3917375adcba3 (patch)
tree9798177ab77f4918c15f7f9b4061915e71bb79a6 /src/libutil
parentf05d5f89ff4ec52ed2f6d576b2b2323b5292f815 (diff)
Setting: Remove "Tag" template argument
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/config.cc53
-rw-r--r--src/libutil/config.hh48
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); }
};
}