1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-07-06 21:41:48 +02:00

Setting: Remove "Tag" template argument

This commit is contained in:
Eelco Dolstra 2017-04-20 16:52:53 +02:00
parent f05d5f89ff
commit 4410e9d995
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
5 changed files with 90 additions and 74 deletions

View file

@ -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); }
};
}