\r
ValidatorSuite xmltooling::SchemaValidators("SchemaValidators");\r
\r
-namespace {\r
- class XMLTOOL_DLLLOCAL _clearvector {\r
- public:\r
- void operator()(const pair< QName, vector<Validator*> >& p) const {\r
- for_each(p.second.begin(),p.second.end(),xmltooling::cleanup<Validator>());\r
- }\r
- };\r
-}\r
-\r
void ValidatorSuite::deregisterValidators(const QName& key)\r
{\r
- map< QName, vector<Validator*> >::iterator i=m_map.find(key);\r
- if (i!=m_map.end()) {\r
- _clearvector f;\r
- f(*i);\r
- m_map.erase(i);\r
- }\r
+ pair<multimap<QName,Validator*>::iterator,multimap<QName,Validator*>::iterator> range=m_map.equal_range(key);\r
+ for_each(range.first, range.second, xmltooling::cleanup_pair<QName,Validator>());\r
+ m_map.erase(range.first, range.second);\r
}\r
\r
void ValidatorSuite::destroyValidators()\r
{\r
- for_each(m_map.begin(),m_map.end(),_clearvector());\r
+ for_each(m_map.begin(),m_map.end(),xmltooling::cleanup_pair<QName,Validator>());\r
m_map.clear();\r
}\r
\r
if (!xmlObject)\r
return;\r
\r
- map< QName, vector<Validator*> >::const_iterator i;\r
+ pair<multimap<QName,Validator*>::const_iterator,multimap<QName,Validator*>::const_iterator> range;\r
if (xmlObject->getSchemaType()) {\r
- i=m_map.find(*(xmlObject->getSchemaType()));\r
- if (i!=m_map.end())\r
- for_each(i->second.begin(),i->second.end(),bind2nd(mem_fun<void,Validator,const XMLObject*>(&Validator::validate),xmlObject));\r
+ range=m_map.equal_range(*(xmlObject->getSchemaType()));\r
+ while (range.first!=range.second) {\r
+ range.first->second->validate(xmlObject);\r
+ ++range.first;\r
+ }\r
+ }\r
+ range=m_map.equal_range(xmlObject->getElementQName());\r
+ while (range.first!=range.second) {\r
+ range.first->second->validate(xmlObject);\r
+ ++range.first;\r
}\r
- i=m_map.find(xmlObject->getElementQName());\r
- if (i!=m_map.end())\r
- for_each(i->second.begin(),i->second.end(),bind2nd(mem_fun<void,Validator,const XMLObject*>(&Validator::validate),xmlObject));\r
\r
const list<XMLObject*>& kids=xmlObject->getOrderedChildren();\r
for (list<XMLObject*>::const_iterator j=kids.begin(); j!=kids.end(); j++)\r
#ifndef __xmltooling_valsuite_h__\r
#define __xmltooling_valsuite_h__\r
\r
-#include <map>\r
-#include <vector>\r
#include <xmltooling/QName.h>\r
#include <xmltooling/validation/Validator.h>\r
\r
+#include <map>\r
+\r
#if defined (_MSC_VER)\r
#pragma warning( push )\r
#pragma warning( disable : 4250 4251 )\r
* A collection of validators that can be applied to an XMLObject and its children. These collections can represent\r
* usage specific checks, such as those outlined in schemas or profiles of specific XML specifications.\r
* \r
- * Registered Validators must be stateless and cloneable. Validators are fetched based on schema type and\r
+ * Registered Validators must be stateless. Validators are fetched based on schema type and\r
* element name, in that order.\r
*/\r
class XMLTOOL_API ValidatorSuite\r
* @param validator the validator\r
*/\r
void registerValidator(const QName& key, Validator* validator) {\r
- std::map< QName, std::vector<Validator*> >::iterator i=m_map.find(key);\r
- if (i==m_map.end())\r
- m_map.insert(std::make_pair(key,std::vector<Validator*>(1,validator)));\r
- else\r
- i->second.push_back(validator);\r
+ m_map.insert(std::make_pair(key,validator));\r
}\r
\r
/**\r
\r
private:\r
std::string m_id;\r
- std::map< QName, std::vector<Validator*> > m_map;\r
+ std::multimap<QName,Validator*> m_map;\r
};\r
\r
/**\r