From 73331287696ff3dd7e17faf82b50e714bf60a7f2 Mon Sep 17 00:00:00 2001 From: Scott Cantor Date: Fri, 29 Sep 2006 21:58:50 +0000 Subject: [PATCH] Switch to multimap, no idea wtf I was thinking. --- xmltooling/validation/ValidatorSuite.cpp | 38 +++++++++++++------------------- xmltooling/validation/ValidatorSuite.h | 14 +++++------- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/xmltooling/validation/ValidatorSuite.cpp b/xmltooling/validation/ValidatorSuite.cpp index 447bee0..742e4bd 100644 --- a/xmltooling/validation/ValidatorSuite.cpp +++ b/xmltooling/validation/ValidatorSuite.cpp @@ -29,28 +29,16 @@ using namespace std; ValidatorSuite xmltooling::SchemaValidators("SchemaValidators"); -namespace { - class XMLTOOL_DLLLOCAL _clearvector { - public: - void operator()(const pair< QName, vector >& p) const { - for_each(p.second.begin(),p.second.end(),xmltooling::cleanup()); - } - }; -} - void ValidatorSuite::deregisterValidators(const QName& key) { - map< QName, vector >::iterator i=m_map.find(key); - if (i!=m_map.end()) { - _clearvector f; - f(*i); - m_map.erase(i); - } + pair::iterator,multimap::iterator> range=m_map.equal_range(key); + for_each(range.first, range.second, xmltooling::cleanup_pair()); + m_map.erase(range.first, range.second); } void ValidatorSuite::destroyValidators() { - for_each(m_map.begin(),m_map.end(),_clearvector()); + for_each(m_map.begin(),m_map.end(),xmltooling::cleanup_pair()); m_map.clear(); } @@ -59,15 +47,19 @@ void ValidatorSuite::validate(const XMLObject* xmlObject) const if (!xmlObject) return; - map< QName, vector >::const_iterator i; + pair::const_iterator,multimap::const_iterator> range; if (xmlObject->getSchemaType()) { - i=m_map.find(*(xmlObject->getSchemaType())); - if (i!=m_map.end()) - for_each(i->second.begin(),i->second.end(),bind2nd(mem_fun(&Validator::validate),xmlObject)); + range=m_map.equal_range(*(xmlObject->getSchemaType())); + while (range.first!=range.second) { + range.first->second->validate(xmlObject); + ++range.first; + } + } + range=m_map.equal_range(xmlObject->getElementQName()); + while (range.first!=range.second) { + range.first->second->validate(xmlObject); + ++range.first; } - i=m_map.find(xmlObject->getElementQName()); - if (i!=m_map.end()) - for_each(i->second.begin(),i->second.end(),bind2nd(mem_fun(&Validator::validate),xmlObject)); const list& kids=xmlObject->getOrderedChildren(); for (list::const_iterator j=kids.begin(); j!=kids.end(); j++) diff --git a/xmltooling/validation/ValidatorSuite.h b/xmltooling/validation/ValidatorSuite.h index 3ded490..cea0693 100644 --- a/xmltooling/validation/ValidatorSuite.h +++ b/xmltooling/validation/ValidatorSuite.h @@ -23,11 +23,11 @@ #ifndef __xmltooling_valsuite_h__ #define __xmltooling_valsuite_h__ -#include -#include #include #include +#include + #if defined (_MSC_VER) #pragma warning( push ) #pragma warning( disable : 4250 4251 ) @@ -39,7 +39,7 @@ namespace xmltooling { * A collection of validators that can be applied to an XMLObject and its children. These collections can represent * usage specific checks, such as those outlined in schemas or profiles of specific XML specifications. * - * Registered Validators must be stateless and cloneable. Validators are fetched based on schema type and + * Registered Validators must be stateless. Validators are fetched based on schema type and * element name, in that order. */ class XMLTOOL_API ValidatorSuite @@ -82,11 +82,7 @@ namespace xmltooling { * @param validator the validator */ void registerValidator(const QName& key, Validator* validator) { - std::map< QName, std::vector >::iterator i=m_map.find(key); - if (i==m_map.end()) - m_map.insert(std::make_pair(key,std::vector(1,validator))); - else - i->second.push_back(validator); + m_map.insert(std::make_pair(key,validator)); } /** @@ -103,7 +99,7 @@ namespace xmltooling { private: std::string m_id; - std::map< QName, std::vector > m_map; + std::multimap m_map; }; /** -- 2.1.4