mirror of
https://github.com/NixOS/nix
synced 2025-06-28 22:01:15 +02:00
Setting: Remove "Tag" template argument
This commit is contained in:
parent
f05d5f89ff
commit
4410e9d995
5 changed files with 90 additions and 74 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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); }
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue