From 554aa0134e6e81f080b901549dc1b6bc941fdfcc Mon Sep 17 00:00:00 2001 From: Christoph Lehmann <christoph.lehmann@ufz.de> Date: Tue, 2 Feb 2016 14:54:24 +0100 Subject: [PATCH] [BL] introduced type flagging tag/attribute --- BaseLib/ConfigTreeNew-impl.h | 6 +++--- BaseLib/ConfigTreeNew.cpp | 32 +++++++++++++++++--------------- BaseLib/ConfigTreeNew.h | 19 ++++++++++++------- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/BaseLib/ConfigTreeNew-impl.h b/BaseLib/ConfigTreeNew-impl.h index 6bce421e564..17702fd57c7 100644 --- a/BaseLib/ConfigTreeNew-impl.h +++ b/BaseLib/ConfigTreeNew-impl.h @@ -71,7 +71,7 @@ ConfigTreeNew:: getConfParamList(std::string const& param) const { checkUnique(param); - markVisited<T>(param, false, true); + markVisited<T>(param, Attr::TAG, true); auto p = _tree->equal_range(param); return Range<ValueIterator<T> >( @@ -155,7 +155,7 @@ ConfigTreeNew:: getConfAttributeOptional(std::string const& attr) const { checkUniqueAttr(attr); - auto& ct = markVisited<T>(attr, true, true); + auto& ct = markVisited<T>(attr, Attr::ATTR, true); if (auto attrs = _tree->get_child_optional("<xmlattr>")) { if (auto a = attrs->get_child_optional(attr)) { @@ -176,7 +176,7 @@ getConfAttributeOptional(std::string const& attr) const template<typename T> ConfigTreeNew::CountType& ConfigTreeNew:: -markVisited(std::string const& key, bool const is_attr, +markVisited(std::string const& key, Attr const is_attr, bool const peek_only) const { auto const type = std::type_index(typeid(T)); diff --git a/BaseLib/ConfigTreeNew.cpp b/BaseLib/ConfigTreeNew.cpp index a15409eb8bf..efe6f7a31d8 100644 --- a/BaseLib/ConfigTreeNew.cpp +++ b/BaseLib/ConfigTreeNew.cpp @@ -104,7 +104,7 @@ ConfigTreeNew:: getConfParamList(const std::string ¶m) const { checkUnique(param); - markVisited(param, false, true); + markVisited(param, Attr::TAG, true); auto p = _tree->equal_range(param); @@ -131,10 +131,10 @@ getConfSubtreeOptional(std::string const& root) const checkUnique(root); if (auto subtree = _tree->get_child_optional(root)) { - markVisited(root, false, false); + markVisited(root, Attr::TAG, false); return ConfigTreeNew(*subtree, *this, root); } else { - markVisited(root, false, true); + markVisited(root, Attr::TAG, true); return boost::none; } } @@ -144,7 +144,7 @@ ConfigTreeNew:: getConfSubtreeList(std::string const& root) const { checkUnique(root); - markVisited(root, false, true); + markVisited(root, Attr::TAG, true); auto p = _tree->equal_range(root); @@ -158,7 +158,7 @@ void ConfigTreeNew::ignoreConfParam(const std::string ¶m) const checkUnique(param); // if not found, peek only bool peek_only = _tree->find(param) == _tree->not_found(); - markVisited(param, false, peek_only); + markVisited(param, Attr::TAG, peek_only); } void ConfigTreeNew::ignoreConfAttribute(const std::string &attr) const @@ -169,13 +169,13 @@ void ConfigTreeNew::ignoreConfAttribute(const std::string &attr) const // Btw. (not a hint) _tree->find() does not seem to work here. bool peek_only = !_tree->get_child_optional("<xmlattr>." + attr); - markVisited(attr, true, peek_only); + markVisited(attr, Attr::ATTR, peek_only); } void ConfigTreeNew::ignoreConfParamAll(const std::string ¶m) const { checkUnique(param); - auto& ct = markVisited(param, false, true); + auto& ct = markVisited(param, Attr::TAG, true); auto p = _tree->equal_range(param); for (auto it = p.first; it != p.second; ++it) { @@ -254,7 +254,7 @@ void ConfigTreeNew::checkUnique(const std::string &key) const { checkKeyname(key); - if (_visited_params.find({false, key}) != _visited_params.end()) { + if (_visited_params.find({Attr::TAG, key}) != _visited_params.end()) { error("Key <" + key + "> has already been processed."); } } @@ -279,21 +279,21 @@ void ConfigTreeNew::checkUniqueAttr(const std::string &attr) const checkKeyname(attr); } - if (_visited_params.find({true, attr}) != _visited_params.end()) { + if (_visited_params.find({Attr::ATTR, attr}) != _visited_params.end()) { error("Attribute \"" + attr + "\" has already been processed."); } } ConfigTreeNew::CountType& ConfigTreeNew:: -markVisited(std::string const& key, bool const is_attr, bool const peek_only) const +markVisited(std::string const& key, Attr const is_attr, bool const peek_only) const { return markVisited<ConfigTreeNew>(key, is_attr, peek_only); } void ConfigTreeNew:: -markVisitedDecrement(bool const is_attr, std::string const& key) const +markVisitedDecrement(Attr const is_attr, std::string const& key) const { auto const type = std::type_index(typeid(nullptr)); @@ -335,13 +335,13 @@ ConfigTreeNew::checkAndInvalidate() // iterate over children for (auto const& p : *_tree) { if (p.first != "<xmlattr>") // attributes are handled below - markVisitedDecrement(false, p.first); + markVisitedDecrement(Attr::TAG, p.first); } // iterate over attributes if (auto attrs = _tree->get_child_optional("<xmlattr>")) { for (auto const& p : *attrs) { - markVisitedDecrement(true, p.first); + markVisitedDecrement(Attr::ATTR, p.first); } } @@ -350,7 +350,8 @@ ConfigTreeNew::checkAndInvalidate() auto const& tag = p.first.second; auto const& count = p.second.count; - if (p.first.first) { // XML attribute + switch (p.first.first) { + case Attr::ATTR: if (count > 0) { warning("XML attribute \"" + tag + "\" has been read " + std::to_string(count) + " time(s) more than it was present in the configuration tree."); @@ -358,7 +359,8 @@ ConfigTreeNew::checkAndInvalidate() warning("XML attribute \"" + tag + "\" has been read " + std::to_string(-count) + " time(s) less than it was present in the configuration tree."); } - } else { // tag + break; + case Attr::TAG: if (count > 0) { warning("Key <" + tag + "> has been read " + std::to_string(count) + " time(s) more than it was present in the configuration tree."); diff --git a/BaseLib/ConfigTreeNew.h b/BaseLib/ConfigTreeNew.h index b81ca7feb6a..3b27e3847ce 100644 --- a/BaseLib/ConfigTreeNew.h +++ b/BaseLib/ConfigTreeNew.h @@ -116,7 +116,7 @@ public: // tell the _parent instance that a subtree now has been parsed. if (_has_incremented) { _has_incremented = false; - _parent.markVisited(_tagname, false, false); + _parent.markVisited(_tagname, Attr::TAG, false); } return ConfigTreeNew(_it->second, _parent, _tagname); } @@ -200,7 +200,7 @@ public: // tell the _parent instance that a setting now has been parsed. if (_has_incremented) { _has_incremented = false; - _parent.markVisited<ValueType>(_tagname, false, false); + _parent.markVisited<ValueType>(_tagname, Attr::TAG, false); } return ConfigTreeNew(_it->second, _parent, _tagname).getValue<ValueType>(); } @@ -503,6 +503,12 @@ private: std::type_index type; }; + //! Used to indicate if dealing with XML tags or XML attributes + enum class Attr : bool + { + TAG = false, ATTR = true + }; + //! Used for wrapping a subtree explicit ConfigTreeNew(PTree const& tree, ConfigTreeNew const& parent, std::string const& root); @@ -548,7 +554,7 @@ private: * \c param peek_only if true, do not change the read-count of the given key. */ template<typename T> - CountType& markVisited(std::string const& key, bool const is_attr, + CountType& markVisited(std::string const& key, Attr const is_attr, bool peek_only) const; /*! Keeps track of the key \c key and its value type ConfigTree. @@ -557,12 +563,12 @@ private: * * \c param peek_only if true, do not change the read-count of the given key. */ - CountType& markVisited(std::string const& key, bool const is_attr, + CountType& markVisited(std::string const& key, Attr const is_attr, bool const peek_only) const; //! Used in the destructor to compute the difference between number of reads of a parameter //! and the number of times it exists in the ConfigTree - void markVisitedDecrement(bool const is_attr, std::string const& key) const; + void markVisitedDecrement(Attr const is_attr, std::string const& key) const; //! Checks if this tree has any children. bool hasChildren() const; @@ -587,8 +593,7 @@ private: std::string _filename; //! A pair (is attribute, tag/attribute name). - //! The first entry is true for an XML attribute and false for a tag. - using KeyType = std::pair<bool, std::string>; + using KeyType = std::pair<Attr, std::string>; //! A map KeyType -> (count, type) keeping track which parameters have been read //! how often and which datatype they have. -- GitLab