Switch to multimap, no idea wtf I was thinking.
authorScott Cantor <cantor.2@osu.edu>
Fri, 29 Sep 2006 21:58:50 +0000 (21:58 +0000)
committerScott Cantor <cantor.2@osu.edu>
Fri, 29 Sep 2006 21:58:50 +0000 (21:58 +0000)
xmltooling/validation/ValidatorSuite.cpp
xmltooling/validation/ValidatorSuite.h

index 447bee0..742e4bd 100644 (file)
@@ -29,28 +29,16 @@ using namespace std;
 \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
@@ -59,15 +47,19 @@ void ValidatorSuite::validate(const XMLObject* xmlObject) const
     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
index 3ded490..cea0693 100644 (file)
 #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
@@ -39,7 +39,7 @@ namespace xmltooling {
      * 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
@@ -82,11 +82,7 @@ namespace xmltooling {
          * @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
@@ -103,7 +99,7 @@ namespace xmltooling {
 \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