From e3c289dbe945415367dc1f54f85ad2452f5a97e0 Mon Sep 17 00:00:00 2001 From: Alois Wohlschlager Date: Sat, 17 Aug 2024 20:55:41 +0200 Subject: libutil/config: unify path setting types There have been multiple setting types for paths that are supposed to be canonicalised, depending on whether zero or one, one, or any number of paths is to be specified. Naturally, they behaved in slightly different ways in the code. Simplify things by unifying them and removing special behaviour (mainly the "multiple paths type can coerce to boolean" thing). Change-Id: I7c1ce95e9c8e1829a866fb37d679e167811e9705 --- src/libutil/config.hh | 69 ++++++++++++--------------------------------------- 1 file changed, 16 insertions(+), 53 deletions(-) (limited to 'src/libutil/config.hh') diff --git a/src/libutil/config.hh b/src/libutil/config.hh index d1812f47e..dbca4b406 100644 --- a/src/libutil/config.hh +++ b/src/libutil/config.hh @@ -353,69 +353,32 @@ public: }; /** - * A special setting for Paths. These are automatically canonicalised - * (e.g. "/foo//bar/" becomes "/foo/bar"). - * - * It is mandatory to specify a path; i.e. the empty string is not - * permitted. + * A special setting for Paths. + * These are automatically canonicalised (e.g. "/foo//bar/" becomes "/foo/bar"). + * The empty string is not permitted when a path is required. */ -class PathSetting : public BaseSetting -{ -public: - - PathSetting(Config * options, - const Path & def, - const std::string & name, - const std::string & description, - const std::set & aliases = {}); - - Path parse(const std::string & str) const override; - - Path operator +(const char * p) const { return value + p; } - - void operator =(const Path & v) { this->assign(v); } -}; - -/** - * Like `PathSetting`, but the absence of a path is also allowed. - * - * `std::optional` is used instead of the empty string for clarity. - */ -class OptionalPathSetting : public BaseSetting> -{ -public: - - OptionalPathSetting(Config * options, - const std::optional & def, - const std::string & name, - const std::string & description, - const std::set & aliases = {}); - - std::optional parse(const std::string & str) const override; - - void operator =(const std::optional & v); -}; - -/** - * Like `OptionalPathSetting`, but allows multiple paths. - */ -class PathsSetting : public BaseSetting +template +class PathsSetting : public BaseSetting { public: - PathsSetting(Config * options, - const Paths & def, + const T & def, const std::string & name, const std::string & description, - const std::set & aliases = {}); - - Paths parse(const std::string & str) const override; + const std::set & aliases = {}, + const bool documentDefault = true, + std::optional experimentalFeature = std::nullopt) + : BaseSetting(def, documentDefault, name, description, aliases, std::move(experimentalFeature)) + { + options->addSetting(this); + } - void operator =(const Paths & v); + T parse(const std::string & str) const override; - operator bool() const noexcept; + void operator =(const T & v) { this->assign(v); } }; + struct GlobalConfig : public AbstractConfig { typedef std::vector ConfigRegistrations; -- cgit v1.2.3