From 4fa5538e2bed36903b403e1aaee2462d22b456dc Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 21 Jan 2015 22:13:44 +0100 Subject: config/Param: split block-specific attributes to new struct ConfigBlock The old struct config_param remains only for top-level string options. --- src/config/Block.hxx | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'src/config/Block.hxx') diff --git a/src/config/Block.hxx b/src/config/Block.hxx index c2194eff9..23b064695 100644 --- a/src/config/Block.hxx +++ b/src/config/Block.hxx @@ -21,9 +21,14 @@ #define MPD_CONFIG_BLOCK_HXX #include "check.h" +#include "Param.hxx" #include "Compiler.h" #include +#include + +class Error; +class AllocatedPath; struct BlockParam { std::string name; @@ -50,4 +55,71 @@ struct BlockParam { bool GetBoolValue() const; }; +struct ConfigBlock { + /** + * The next #ConfigBlock with the same name. The destructor + * deletes the whole chain. + */ + ConfigBlock *next; + + int line; + + std::vector block_params; + + /** + * This flag is false when nobody has queried the value of + * this option yet. + */ + bool used; + + explicit ConfigBlock(int _line=-1) + :next(nullptr), line(_line), used(false) {} + + ConfigBlock(const ConfigBlock &) = delete; + + ~ConfigBlock(); + + ConfigBlock &operator=(const ConfigBlock &) = delete; + + /** + * Determine if this is a "null" instance, i.e. an empty + * object that was synthesized and not loaded from a + * configuration file. + */ + bool IsNull() const { + return line < 0; + } + + gcc_nonnull_all + void AddBlockParam(const char *_name, const char *_value, + int _line=-1) { + block_params.emplace_back(_name, _value, _line); + } + + gcc_nonnull_all gcc_pure + const BlockParam *GetBlockParam(const char *_name) const; + + gcc_pure + const char *GetBlockValue(const char *name, + const char *default_value=nullptr) const; + + /** + * Same as config_get_path(), but looks up the setting in the + * specified block. + */ + AllocatedPath GetBlockPath(const char *name, const char *default_value, + Error &error) const; + + AllocatedPath GetBlockPath(const char *name, Error &error) const; + + gcc_pure + int GetBlockValue(const char *name, int default_value) const; + + gcc_pure + unsigned GetBlockValue(const char *name, unsigned default_value) const; + + gcc_pure + bool GetBlockValue(const char *name, bool default_value) const; +}; + #endif -- cgit v1.2.3