You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by am...@apache.org on 2008/10/01 18:31:57 UTC

svn commit: r700828 - in /xerces/c/trunk: projects/Win32/VC6/xerces-all/XercesLib/ projects/Win32/VC7.1/xerces-all/XercesLib/ projects/Win32/VC8/xerces-all/XercesLib/ projects/Win32/VC9/xerces-all/XercesLib/ src/ src/xercesc/internal/ src/xercesc/util/

Author: amassari
Date: Wed Oct  1 09:31:56 2008
New Revision: 700828

URL: http://svn.apache.org/viewvc?rev=700828&view=rev
Log:
Performance improvements

Added:
    xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.c   (with props)
    xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.hpp   (with props)
Modified:
    xerces/c/trunk/projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp
    xerces/c/trunk/projects/Win32/VC7.1/xerces-all/XercesLib/XercesLib.vcproj
    xerces/c/trunk/projects/Win32/VC8/xerces-all/XercesLib/XercesLib.vcproj
    xerces/c/trunk/projects/Win32/VC9/xerces-all/XercesLib/XercesLib.vcproj
    xerces/c/trunk/src/Makefile.am
    xerces/c/trunk/src/xercesc/internal/DGXMLScanner.cpp
    xerces/c/trunk/src/xercesc/internal/DGXMLScanner.hpp
    xerces/c/trunk/src/xercesc/internal/IGXMLScanner.cpp
    xerces/c/trunk/src/xercesc/internal/IGXMLScanner.hpp
    xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp
    xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp
    xerces/c/trunk/src/xercesc/internal/SGXMLScanner.hpp
    xerces/c/trunk/src/xercesc/internal/XSAXMLScanner.cpp

Modified: xerces/c/trunk/projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp (original)
+++ xerces/c/trunk/projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp Wed Oct  1 09:31:56 2008
@@ -545,6 +545,10 @@
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\..\..\..\src\xercesc\util\Hash2KeysSetOf.hpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\..\..\..\src\xercesc\util\Hashers.hpp
 # End Source File
 # Begin Source File

Modified: xerces/c/trunk/projects/Win32/VC7.1/xerces-all/XercesLib/XercesLib.vcproj
URL: http://svn.apache.org/viewvc/xerces/c/trunk/projects/Win32/VC7.1/xerces-all/XercesLib/XercesLib.vcproj?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/projects/Win32/VC7.1/xerces-all/XercesLib/XercesLib.vcproj (original)
+++ xerces/c/trunk/projects/Win32/VC7.1/xerces-all/XercesLib/XercesLib.vcproj Wed Oct  1 09:31:56 2008
@@ -463,6 +463,10 @@
 				RelativePath="..\..\..\..\..\src\xercesc\util\FlagJanitor.hpp">
 			</File>
 			<File
+				RelativePath="..\..\..\..\..\src\xercesc\util\Hash2KeysSetOf.hpp"
+				>
+			</File>
+			<File
 				RelativePath="..\..\..\..\..\src\xercesc\util\Hashers.hpp">
 			</File>
 			<File

Modified: xerces/c/trunk/projects/Win32/VC8/xerces-all/XercesLib/XercesLib.vcproj
URL: http://svn.apache.org/viewvc/xerces/c/trunk/projects/Win32/VC8/xerces-all/XercesLib/XercesLib.vcproj?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/projects/Win32/VC8/xerces-all/XercesLib/XercesLib.vcproj (original)
+++ xerces/c/trunk/projects/Win32/VC8/xerces-all/XercesLib/XercesLib.vcproj Wed Oct  1 09:31:56 2008
@@ -1182,6 +1182,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\..\..\..\src\xercesc\util\Hash2KeysSetOf.hpp"
+				>
+			</File>
+			<File
 				RelativePath="..\..\..\..\..\src\xercesc\util\Hashers.hpp"
 				>
 			</File>

Modified: xerces/c/trunk/projects/Win32/VC9/xerces-all/XercesLib/XercesLib.vcproj
URL: http://svn.apache.org/viewvc/xerces/c/trunk/projects/Win32/VC9/xerces-all/XercesLib/XercesLib.vcproj?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/projects/Win32/VC9/xerces-all/XercesLib/XercesLib.vcproj (original)
+++ xerces/c/trunk/projects/Win32/VC9/xerces-all/XercesLib/XercesLib.vcproj Wed Oct  1 09:31:56 2008
@@ -1181,6 +1181,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\..\..\..\src\xercesc\util\Hash2KeysSetOf.hpp"
+				>
+			</File>
+			<File
 				RelativePath="..\..\..\..\..\src\xercesc\util\Hashers.hpp"
 				>
 			</File>

Modified: xerces/c/trunk/src/Makefile.am
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/Makefile.am?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/src/Makefile.am (original)
+++ xerces/c/trunk/src/Makefile.am Wed Oct  1 09:31:56 2008
@@ -578,6 +578,8 @@
 	xercesc/util/FlagJanitor.hpp \
 	xercesc/util/FlagJanitor.c \
 	xercesc/util/Hashers.hpp \
+	xercesc/util/Hash2KeysSetOf.hpp \
+	xercesc/util/Hash2KeysSetOf.c \
 	xercesc/util/HexBin.hpp \
 	xercesc/util/IllegalArgumentException.hpp \
 	xercesc/util/InvalidCastException.hpp \

Modified: xerces/c/trunk/src/xercesc/internal/DGXMLScanner.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/DGXMLScanner.cpp?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/DGXMLScanner.cpp (original)
+++ xerces/c/trunk/src/xercesc/internal/DGXMLScanner.cpp Wed Oct  1 09:31:56 2008
@@ -1365,10 +1365,7 @@
                 {
                     // reset namePtr so it refers to newly-allocated memory
                     namePtr = (XMLCh *)curAtt->getQName();
-                    if (!fUndeclaredAttrRegistry->containsKey(namePtr)) {
-                        fUndeclaredAttrRegistry->put((void *)namePtr, 0);
-                    }
-                    else
+                    if (!fUndeclaredAttrRegistry->putIfNotPresent(namePtr, 0))
                     {
                         emitError(
                             XMLErrs::AttrAlreadyUsedInSTag
@@ -2256,10 +2253,7 @@
     (
         131, false, fMemoryManager
     );
-    fUndeclaredAttrRegistry = new (fMemoryManager) RefHashTableOf<unsigned int>
-    (
-        7, false, fMemoryManager
-    );
+    fUndeclaredAttrRegistry = new (fMemoryManager) Hash2KeysSetOf<StringHasher>(7, fMemoryManager);
 
     if (fValidator)
     {

Modified: xerces/c/trunk/src/xercesc/internal/DGXMLScanner.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/DGXMLScanner.hpp?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/DGXMLScanner.hpp (original)
+++ xerces/c/trunk/src/xercesc/internal/DGXMLScanner.hpp Wed Oct  1 09:31:56 2008
@@ -25,6 +25,7 @@
 #include <xercesc/internal/XMLScanner.hpp>
 #include <xercesc/util/ValueVectorOf.hpp>
 #include <xercesc/util/NameIdPool.hpp>
+#include <xercesc/util/Hash2KeysSetOf.hpp>
 #include <xercesc/validators/common/Grammar.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -176,7 +177,7 @@
     //      mapping from XMLAttDef instances to the count of the last
     //      start tag where they were utilized.
     // fUndeclaredAttrRegistry
-    //      mapping of attr QNames to the count of the last start tag in which they occurred
+    //      mapping of attr QNames to detect duplicates
     //
     // -----------------------------------------------------------------------
     ValueVectorOf<XMLAttr*>*    fAttrNSList;
@@ -185,7 +186,7 @@
     NameIdPool<DTDElementDecl>* fDTDElemNonDeclPool;
     unsigned int                fElemCount;
     RefHashTableOf<unsigned int, PtrHasher>* fAttDefRegistry;
-    RefHashTableOf<unsigned int>* fUndeclaredAttrRegistry;
+    Hash2KeysSetOf<StringHasher>*            fUndeclaredAttrRegistry;
 };
 
 inline const XMLCh* DGXMLScanner::getName() const

Modified: xerces/c/trunk/src/xercesc/internal/IGXMLScanner.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/IGXMLScanner.cpp?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/IGXMLScanner.cpp (original)
+++ xerces/c/trunk/src/xercesc/internal/IGXMLScanner.cpp Wed Oct  1 09:31:56 2008
@@ -80,7 +80,6 @@
     , fElemCount(0)
     , fAttDefRegistry(0)
     , fUndeclaredAttrRegistry(0)
-    , fUndeclaredAttrRegistryNS(0)
     , fPSVIAttrList(0)
     , fModel(0)
     , fPSVIElement(0)
@@ -132,7 +131,6 @@
     , fElemCount(0)
     , fAttDefRegistry(0)
     , fUndeclaredAttrRegistry(0)
-    , fUndeclaredAttrRegistryNS(0)
     , fPSVIAttrList(0)
     , fModel(0)
     , fPSVIElement(0)
@@ -542,14 +540,7 @@
     (
         131, false, fMemoryManager
     );
-    fUndeclaredAttrRegistry = new (fMemoryManager) RefHashTableOf<unsigned int>
-    (
-        7, false, fMemoryManager
-    );
-    fUndeclaredAttrRegistryNS = new (fMemoryManager) RefHash2KeysTableOf<unsigned int>
-    (
-        7, false, fMemoryManager
-    );
+    fUndeclaredAttrRegistry = new (fMemoryManager) Hash2KeysSetOf<StringHasher>(7, fMemoryManager);
     fPSVIAttrList = new (fMemoryManager) PSVIAttributeList(fMemoryManager);
 
     // use fDTDValidator as the default validator
@@ -571,7 +562,6 @@
     delete fSchemaElemNonDeclPool;
     delete fAttDefRegistry;
     delete fUndeclaredAttrRegistry;
-    delete fUndeclaredAttrRegistryNS;
     delete fPSVIAttrList;
     delete fPSVIElement;
     delete fErrorStack;
@@ -1814,9 +1804,7 @@
                         , elemDecl->getFullName()
                     );
                 }
-                if(!fUndeclaredAttrRegistry->containsKey(namePtr))
-                    fUndeclaredAttrRegistry->put((void *)namePtr, 0);
-                else
+                if(!fUndeclaredAttrRegistry->putIfNotPresent(namePtr, 0))
                 {
                     emitError
                     (
@@ -2602,7 +2590,6 @@
         // clean up after ourselves:
         // clear the map used to detect duplicate attributes
         fUndeclaredAttrRegistry->removeAll();
-        fUndeclaredAttrRegistryNS->removeAll();
     }
 
     // activate identity constraints

Modified: xerces/c/trunk/src/xercesc/internal/IGXMLScanner.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/IGXMLScanner.hpp?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/IGXMLScanner.hpp (original)
+++ xerces/c/trunk/src/xercesc/internal/IGXMLScanner.hpp Wed Oct  1 09:31:56 2008
@@ -26,6 +26,7 @@
 #include <xercesc/util/KVStringPair.hpp>
 #include <xercesc/util/NameIdPool.hpp>
 #include <xercesc/util/RefHash3KeysIdPool.hpp>
+#include <xercesc/util/Hash2KeysSetOf.hpp>
 #include <xercesc/validators/common/Grammar.hpp>
 #include <xercesc/validators/schema/SchemaElementDecl.hpp>
 
@@ -271,10 +272,7 @@
     //      mapping from XMLAttDef instances to the count of the last
     //      start tag where they were utilized.
     // fUndeclaredAttrRegistry
-    //      mapping of attr QNames to the count of the last start tag in which they occurred
-    // fUndeclaredAttrRegistryNS
-    //      mapping of namespaceId/localName pairs to the count of the last
-    //      start tag in which they occurred.
+    //      set of attr QNames to detect duplicates
     //  fPSVIAttrList
     //      PSVI attribute list implementation that needs to be
     //      filled when a PSVIHandler is registered
@@ -298,8 +296,7 @@
     RefHash3KeysIdPool<SchemaElementDecl>*  fSchemaElemNonDeclPool;
     unsigned int                            fElemCount;
     RefHashTableOf<unsigned int, PtrHasher>*fAttDefRegistry;
-    RefHashTableOf<unsigned int>*           fUndeclaredAttrRegistry;
-    RefHash2KeysTableOf<unsigned int>*      fUndeclaredAttrRegistryNS;
+    Hash2KeysSetOf<StringHasher>*           fUndeclaredAttrRegistry;
     PSVIAttributeList *                     fPSVIAttrList;
     XSModel*                                fModel;
     PSVIElement*                            fPSVIElement;

Modified: xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp (original)
+++ xerces/c/trunk/src/xercesc/internal/IGXMLScanner2.cpp Wed Oct  1 09:31:56 2008
@@ -197,7 +197,7 @@
 
         if (isNSAttr && fGrammarType == Grammar::SchemaGrammarType)
         {
-            if(fUndeclaredAttrRegistryNS->containsKey(suffPtr, uriId))
+            if(!fUndeclaredAttrRegistry->putIfNotPresent(suffPtr, uriId))
             {
                 emitError
                 (
@@ -262,8 +262,6 @@
                 }
 
                 if (!otherXSI) {
-                    fUndeclaredAttrRegistryNS->put((void *)suffPtr, uriId, 0);
-
                     normalizeAttRawValue
                     (
                         namePtr
@@ -305,20 +303,20 @@
 
                     if(getPSVIHandler())
                     {
-	                    psviAttr = fPSVIAttrList->getPSVIAttributeToFill(suffPtr, fURIStringPool->getValueForId(uriId));
-	                    XSSimpleTypeDefinition *validatingType = (attrValidator)
+                        psviAttr = fPSVIAttrList->getPSVIAttributeToFill(suffPtr, fURIStringPool->getValueForId(uriId));
+                        XSSimpleTypeDefinition *validatingType = (attrValidator)
                             ? (XSSimpleTypeDefinition *)fModel->getXSObject(attrValidator)
                             : 0;
                         // no attribute declarations for these...
-	                    psviAttr->reset(
-	                        fRootElemName
-	                        , PSVIItem::VALIDITY_NOTKNOWN
-	                        , PSVIItem::VALIDATION_NONE
-	                        , validatingType
-	                        , 0
-	                        , 0
+                        psviAttr->reset(
+                            fRootElemName
+                            , PSVIItem::VALIDITY_NOTKNOWN
+                            , PSVIItem::VALIDATION_NONE
+                            , validatingType
+                            , 0
+                            , 0
                             , false
-	                        , 0
+                            , 0
                             , attrValidator
                             );
                     }
@@ -453,9 +451,7 @@
             {
                 if(fGrammarType == Grammar::DTDGrammarType)
                 {
-                    if(!fUndeclaredAttrRegistry->containsKey(namePtr))
-                        fUndeclaredAttrRegistry->put((void *)namePtr, 0);
-                    else
+                    if(!fUndeclaredAttrRegistry->putIfNotPresent(namePtr, 0))
                     {
                         emitError
                         (
@@ -467,9 +463,7 @@
                 }
                 else // schema grammar
                 {
-                    if(!fUndeclaredAttrRegistryNS->containsKey(suffPtr, uriId))
-                        fUndeclaredAttrRegistryNS->put((void *)suffPtr, uriId, 0);
-                    else
+                    if(!fUndeclaredAttrRegistry->putIfNotPresent(suffPtr, uriId))
                     {
                         emitError
                         (
@@ -641,69 +635,69 @@
 
             // now fill in the PSVIAttributes entry for this attribute:
             if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType)
-	        {
-	            psviAttr = fPSVIAttrList->getPSVIAttributeToFill(suffPtr, fURIStringPool->getValueForId(uriId));
-	            SchemaAttDef *actualAttDef = 0;
-	            if(attDef)
-	                actualAttDef = (SchemaAttDef *)attDef;
-	            else if (attDefForWildCard)
-	                actualAttDef = (SchemaAttDef *)attDefForWildCard;
+            {
+                psviAttr = fPSVIAttrList->getPSVIAttributeToFill(suffPtr, fURIStringPool->getValueForId(uriId));
+                SchemaAttDef *actualAttDef = 0;
+                if(attDef)
+                    actualAttDef = (SchemaAttDef *)attDef;
+                else if (attDefForWildCard)
+                    actualAttDef = (SchemaAttDef *)attDefForWildCard;
                 if(actualAttDef)
                 {
-	                XSAttributeDeclaration *attrDecl = (XSAttributeDeclaration *)fModel->getXSObject(actualAttDef);
+                    XSAttributeDeclaration *attrDecl = (XSAttributeDeclaration *)fModel->getXSObject(actualAttDef);
                     DatatypeValidator * attrDataType = actualAttDef->getDatatypeValidator();
-	                XSSimpleTypeDefinition *validatingType = (XSSimpleTypeDefinition *)fModel->getXSObject(attrDataType);
-	                if(attrValid != PSVIItem::VALIDITY_VALID)
-	                {
-	                    psviAttr->reset
+                    XSSimpleTypeDefinition *validatingType = (XSSimpleTypeDefinition *)fModel->getXSObject(attrDataType);
+                    if(attrValid != PSVIItem::VALIDITY_VALID)
+                    {
+                        psviAttr->reset
                         (
-	                        fRootElemName
-	                        , attrValid
-	                        , attrAssessed
-	                        , validatingType
-	                        , 0
-	                        , actualAttDef->getValue()
-	                        , false
-	                        , attrDecl
+                            fRootElemName
+                            , attrValid
+                            , attrAssessed
+                            , validatingType
+                            , 0
+                            , actualAttDef->getValue()
+                            , false
+                            , attrDecl
                             , 0
-	                    );
-	                }
-	                else
-	                {
-	                    XSSimpleTypeDefinition *memberType = 0;
-	                    if(validatingType->getVariety() == XSSimpleTypeDefinition::VARIETY_UNION)
-	                        memberType = (XSSimpleTypeDefinition *)fModel->getXSObject(attrValidator);
-	                    psviAttr->reset
+                        );
+                    }
+                    else
+                    {
+                        XSSimpleTypeDefinition *memberType = 0;
+                        if(validatingType->getVariety() == XSSimpleTypeDefinition::VARIETY_UNION)
+                            memberType = (XSSimpleTypeDefinition *)fModel->getXSObject(attrValidator);
+                        psviAttr->reset
                         (
-	                        fRootElemName
-	                        , attrValid
-	                        , attrAssessed
-	                        , validatingType
-	                        , memberType
-	                        , actualAttDef->getValue()
-	                        , false
-	                        , attrDecl
+                            fRootElemName
+                            , attrValid
+                            , attrAssessed
+                            , validatingType
+                            , memberType
+                            , actualAttDef->getValue()
+                            , false
+                            , attrDecl
                             , (memberType)?attrValidator:attrDataType
-	                    );
-	                }
+                        );
+                    }
                 }
                 else
                 {
-	                psviAttr->reset
+                    psviAttr->reset
                     (
-	                    fRootElemName
-	                    , attrValid
-	                    , attrAssessed
+                        fRootElemName
+                        , attrValid
+                        , attrAssessed
+                        , 0
                         , 0
-	                    , 0
-	                    , 0
-	                    , false
-	                    , 0
                         , 0
-	                );
+                        , false
+                        , 0
+                        , 0
+                    );
                 }
-	        }
-	    }
+            }
+        }
 
         //  Add this attribute to the attribute list that we use to pass them
         //  to the handler. We reuse its existing elements but expand it as
@@ -1390,7 +1384,6 @@
         resetUIntPool();
     }
     fUndeclaredAttrRegistry->removeAll();
-    fUndeclaredAttrRegistryNS->removeAll();
     fDTDElemNonDeclPool->removeAll();
 }
 

Modified: xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp (original)
+++ xerces/c/trunk/src/xercesc/internal/SGXMLScanner.cpp Wed Oct  1 09:31:56 2008
@@ -84,7 +84,7 @@
     , fElemNonDeclPool(0)
     , fElemCount(0)
     , fAttDefRegistry(0)
-    , fUndeclaredAttrRegistryNS(0)
+    , fUndeclaredAttrRegistry(0)
     , fPSVIAttrList(0)
     , fModel(0)
     , fPSVIElement(0)
@@ -133,7 +133,7 @@
     , fElemNonDeclPool(0)
     , fElemCount(0)
     , fAttDefRegistry(0)
-    , fUndeclaredAttrRegistryNS(0)
+    , fUndeclaredAttrRegistry(0)
     , fPSVIAttrList(0)
     , fModel(0)
     , fPSVIElement(0)
@@ -1588,7 +1588,7 @@
     {
         // clean up after ourselves:
         // clear the map used to detect duplicate attributes
-        fUndeclaredAttrRegistryNS->removeAll();
+        fUndeclaredAttrRegistry->removeAll();
     }
 
     // activate identity constraints
@@ -2029,10 +2029,7 @@
     (
         131, false, fMemoryManager
     );
-    fUndeclaredAttrRegistryNS = new (fMemoryManager) RefHash2KeysTableOf<unsigned int>
-    (
-        7, false, fMemoryManager
-    );
+    fUndeclaredAttrRegistry = new (fMemoryManager) Hash2KeysSetOf<StringHasher>(7, fMemoryManager);
     fPSVIAttrList = new (fMemoryManager) PSVIAttributeList(fMemoryManager);
 
     if (fValidator)
@@ -2058,7 +2055,7 @@
     delete fICHandler;
     delete fElemNonDeclPool;
     delete fAttDefRegistry;
-    delete fUndeclaredAttrRegistryNS;
+    delete fUndeclaredAttrRegistry;
     delete fPSVIAttrList;
     if (fPSVIElement)
         delete fPSVIElement;
@@ -2234,7 +2231,7 @@
 
         if (isNSAttr)
         {
-            if(fUndeclaredAttrRegistryNS->containsKey(suffPtr, uriId))
+            if(!fUndeclaredAttrRegistry->putIfNotPresent(suffPtr, uriId))
             {
                 emitError
                 (
@@ -2299,8 +2296,6 @@
                 }
 
                 if (!otherXSI) {
-                    fUndeclaredAttrRegistryNS->put((void *)suffPtr, uriId, 0);
-
                     normalizeAttRawValue
                     (
                         namePtr
@@ -2472,9 +2467,7 @@
             }
             else
             {
-                if(!fUndeclaredAttrRegistryNS->containsKey(suffPtr, uriId))
-                    fUndeclaredAttrRegistryNS->put((void *)suffPtr, uriId, 0);
-                else
+                if(!fUndeclaredAttrRegistry->putIfNotPresent(suffPtr, uriId))
                 {
                     emitError
                     (
@@ -3304,7 +3297,7 @@
         // though their buckets will still be tied up
         resetUIntPool();
     }
-    fUndeclaredAttrRegistryNS->removeAll();
+    fUndeclaredAttrRegistry->removeAll();
 }
 
 

Modified: xerces/c/trunk/src/xercesc/internal/SGXMLScanner.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/SGXMLScanner.hpp?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/SGXMLScanner.hpp (original)
+++ xerces/c/trunk/src/xercesc/internal/SGXMLScanner.hpp Wed Oct  1 09:31:56 2008
@@ -26,6 +26,7 @@
 #include <xercesc/util/KVStringPair.hpp>
 #include <xercesc/util/ValueHashTableOf.hpp>
 #include <xercesc/util/RefHash3KeysIdPool.hpp>
+#include <xercesc/util/Hash2KeysSetOf.hpp>
 #include <xercesc/validators/common/Grammar.hpp>
 #include <xercesc/validators/schema/SchemaElementDecl.hpp>
 
@@ -179,9 +180,8 @@
     // fAttDefRegistry
     //      mapping from XMLAttDef instances to the count of the last
     //      start tag where they were utilized.
-    // fUndeclaredAttrRegistryNS
-    //      mapping of namespaceId/localName pairs to the count of the last
-    //      start tag in which they occurred.
+    // fUndeclaredAttrRegistry
+    //      set of namespaceId/localName pairs to detect duplicates
     //  fPSVIAttrList
     //      PSVI attribute list implementation that needs to be
     //      filled when a PSVIHandler is registered
@@ -203,7 +203,7 @@
     RefHash3KeysIdPool<SchemaElementDecl>*  fElemNonDeclPool;
     unsigned int                            fElemCount;
     RefHashTableOf<unsigned int, PtrHasher>*fAttDefRegistry;
-    RefHash2KeysTableOf<unsigned int>*      fUndeclaredAttrRegistryNS;
+    Hash2KeysSetOf<StringHasher>*           fUndeclaredAttrRegistry;
     PSVIAttributeList *                     fPSVIAttrList;
     XSModel*                                fModel;
     PSVIElement*                            fPSVIElement;

Modified: xerces/c/trunk/src/xercesc/internal/XSAXMLScanner.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/internal/XSAXMLScanner.cpp?rev=700828&r1=700827&r2=700828&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/internal/XSAXMLScanner.cpp (original)
+++ xerces/c/trunk/src/xercesc/internal/XSAXMLScanner.cpp Wed Oct  1 09:31:56 2008
@@ -433,7 +433,7 @@
     {
         // clean up after ourselves:
         // clear the map used to detect duplicate attributes
-        fUndeclaredAttrRegistryNS->removeAll();
+        fUndeclaredAttrRegistry->removeAll();
     }
 
     // Since the element may have default values, call start tag now regardless if it is empty or not
@@ -603,7 +603,7 @@
         // though their buckets will still be tied up
         resetUIntPool();
     }
-    fUndeclaredAttrRegistryNS->removeAll();
+    fUndeclaredAttrRegistry->removeAll();
 }
 
 

Added: xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.c
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.c?rev=700828&view=auto
==============================================================================
--- xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.c (added)
+++ xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.c Wed Oct  1 09:31:56 2008
@@ -0,0 +1,591 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * $Id$
+ */
+
+
+// ---------------------------------------------------------------------------
+//  Include
+// ---------------------------------------------------------------------------
+#if defined(XERCES_TMPLSINC)
+#include <xercesc/util/Hash2KeysSetOf.hpp>
+#endif
+
+#include <xercesc/util/Janitor.hpp>
+#include <xercesc/util/NullPointerException.hpp>
+#include <assert.h>
+#include <new>
+
+XERCES_CPP_NAMESPACE_BEGIN
+
+// ---------------------------------------------------------------------------
+//  Hash2KeysSetOf: Constructors and Destructor
+// ---------------------------------------------------------------------------
+
+template <class THasher>
+Hash2KeysSetOf<THasher>::Hash2KeysSetOf(
+  const XMLSize_t modulus,
+  MemoryManager* const manager)
+
+    : fMemoryManager(manager)
+    , fBucketList(0)
+    , fHashModulus(modulus)
+    , fCount(0)
+    , fAvailable(0)
+{
+    initialize(modulus);
+}
+
+template <class THasher>
+Hash2KeysSetOf<THasher>::Hash2KeysSetOf(
+  const XMLSize_t modulus,
+  const THasher& hasher,
+  MemoryManager* const manager)
+
+    : fMemoryManager(manager)
+    , fBucketList(0)
+    , fHashModulus(modulus)
+    , fCount(0)
+    , fHasher (hasher)
+    , fAvailable(0)
+{
+    initialize(modulus);
+}
+
+template <class THasher>
+void Hash2KeysSetOf<THasher>::initialize(const XMLSize_t modulus)
+{
+    if (modulus == 0)
+        ThrowXMLwithMemMgr(IllegalArgumentException, XMLExcepts::HshTbl_ZeroModulus, fMemoryManager);
+
+    // Allocate the bucket list and zero them
+    fBucketList = (Hash2KeysSetBucketElem**) fMemoryManager->allocate
+    (
+        fHashModulus * sizeof(Hash2KeysSetBucketElem*)
+    ); //new Hash2KeysSetBucketElem*[fHashModulus];
+    memset(fBucketList, 0, sizeof(fBucketList[0]) * fHashModulus);
+}
+
+template <class THasher>
+Hash2KeysSetOf<THasher>::~Hash2KeysSetOf()
+{
+    Hash2KeysSetBucketElem* nextElem;
+    if(!isEmpty())
+    {
+        // Clean up the buckets first
+        for (XMLSize_t buckInd = 0; buckInd < fHashModulus; buckInd++)
+        {
+            // Get the bucket list head for this entry
+            Hash2KeysSetBucketElem* curElem = fBucketList[buckInd];
+            while (curElem)
+            {
+                // Save the next element before we hose this one
+                nextElem = curElem->fNext;
+                fMemoryManager->deallocate(curElem);
+                curElem = nextElem;
+            }
+
+            // Clean out this entry
+            fBucketList[buckInd] = 0;
+        }
+    }
+    // Then delete the list of available blocks
+    Hash2KeysSetBucketElem* curElem = fAvailable;
+    while (curElem)
+    {
+        // Save the next element before we hose this one
+        nextElem = curElem->fNext;
+        fMemoryManager->deallocate(curElem);
+        curElem = nextElem;
+    }
+    fAvailable = 0;
+
+    // Then delete the bucket list & hasher
+    fMemoryManager->deallocate(fBucketList); //delete [] fBucketList;
+    fBucketList = 0;
+}
+
+
+// ---------------------------------------------------------------------------
+//  Hash2KeysSetOf: Element management
+// ---------------------------------------------------------------------------
+template <class THasher>
+bool Hash2KeysSetOf<THasher>::isEmpty() const
+{
+    return (fCount==0);
+}
+
+template <class THasher>
+bool Hash2KeysSetOf<THasher>::containsKey(const void* const key1, const int key2) const
+{
+    XMLSize_t hashVal;
+    const Hash2KeysSetBucketElem* findIt = findBucketElem(key1, key2, hashVal);
+    return (findIt != 0);
+}
+
+template <class THasher>
+void Hash2KeysSetOf<THasher>::removeKey(const void* const key1, const int key2)
+{
+    // Hash the key
+    XMLSize_t hashVal = fHasher.getHashVal(key1, fHashModulus);
+    assert(hashVal < fHashModulus);
+
+    //
+    //  Search the given bucket for this key. Keep up with the previous
+    //  element so we can patch around it.
+    //
+    Hash2KeysSetBucketElem* curElem = fBucketList[hashVal];
+    Hash2KeysSetBucketElem* lastElem = 0;
+
+    while (curElem)
+    {
+        if((key2==curElem->fKey2) && (fHasher.equals(key1, curElem->fKey1)))
+        {
+            if (!lastElem)
+            {
+                // It was the first in the bucket
+                fBucketList[hashVal] = curElem->fNext;
+            }
+            else
+            {
+                // Patch around the current element
+                lastElem->fNext = curElem->fNext;
+            }
+
+            // Move the current element to the list of available blocks
+            curElem->fNext=fAvailable;
+            fAvailable=curElem;
+
+            fCount--;
+            return;
+        }
+
+        // Move both pointers upwards
+        lastElem = curElem;
+        curElem = curElem->fNext;
+    }
+
+    // We never found that key
+    ThrowXMLwithMemMgr(NoSuchElementException, XMLExcepts::HshTbl_NoSuchKeyExists, fMemoryManager);
+}
+
+template <class THasher>
+void Hash2KeysSetOf<THasher>::
+removeKey(const void* const key1)
+{
+    // Hash the key
+    XMLSize_t hashVal = fHasher.getHashVal(key1, fHashModulus);
+    assert(hashVal < fHashModulus);
+
+    //
+    //  Search the given bucket for this key. Keep up with the previous
+    //  element so we can patch around it.
+    //
+    Hash2KeysSetBucketElem* curElem = fBucketList[hashVal];
+    Hash2KeysSetBucketElem* lastElem = 0;
+
+    while (curElem)
+    {
+        if(fHasher.equals(key1, curElem->fKey1))
+        {
+            if (!lastElem)
+            {
+                // It was the first in the bucket
+                fBucketList[hashVal] = curElem->fNext;
+            }
+            else
+            {
+                // Patch around the current element
+                lastElem->fNext = curElem->fNext;
+            }
+
+            Hash2KeysSetBucketElem* toBeDeleted=curElem;
+            curElem = curElem->fNext;
+
+            // Move the current element to the list of available blocks
+            toBeDeleted->fNext=fAvailable;
+            fAvailable=toBeDeleted;
+
+            fCount--;
+        }
+        else
+        {
+            // Move both pointers upwards
+            lastElem = curElem;
+            curElem = curElem->fNext;
+        }
+    }
+}
+
+template <class THasher>
+void Hash2KeysSetOf<THasher>::removeAll()
+{
+    if(isEmpty())
+        return;
+
+    for (XMLSize_t buckInd = 0; buckInd < fHashModulus; buckInd++)
+    {
+        if(fBucketList[buckInd]!=0)
+        {
+            // Advance to the end of the chain, and connect it to the list of
+            // available blocks
+            Hash2KeysSetBucketElem* curElem = fBucketList[buckInd];
+            while (curElem->fNext)
+                curElem = curElem->fNext;
+            curElem->fNext=fAvailable;
+            fAvailable=fBucketList[buckInd];
+            fBucketList[buckInd] = 0;
+        }
+    }
+    fCount=0;
+}
+
+// ---------------------------------------------------------------------------
+//  Hash2KeysSetOf: Getters
+// ---------------------------------------------------------------------------
+template <class THasher>
+MemoryManager* Hash2KeysSetOf<THasher>::getMemoryManager() const
+{
+    return fMemoryManager;
+}
+
+template <class THasher>
+XMLSize_t Hash2KeysSetOf<THasher>::getHashModulus() const
+{
+    return fHashModulus;
+}
+
+// ---------------------------------------------------------------------------
+//  Hash2KeysSetOf: Putters
+// ---------------------------------------------------------------------------
+template <class THasher>
+void Hash2KeysSetOf<THasher>::put(const void* key1, int key2)
+{
+    // Apply 4 load factor to find threshold.
+    XMLSize_t threshold = fHashModulus * 4;
+
+    // If we've grown too big, expand the table and rehash.
+    if (fCount >= threshold)
+        rehash();
+
+    // First see if the key exists already
+    XMLSize_t hashVal;
+    Hash2KeysSetBucketElem* newBucket = findBucketElem(key1, key2, hashVal);
+
+    //
+    //  If so,then update its value. If not, then we need to add it to
+    //  the right bucket
+    //
+    if (newBucket)
+    {
+        newBucket->fKey1 = key1;
+        newBucket->fKey2 = key2;
+    }
+     else
+    {
+        if(fAvailable==0)
+            newBucket = (Hash2KeysSetBucketElem*)fMemoryManager->allocate(sizeof(Hash2KeysSetBucketElem));
+        else
+        {
+            newBucket = fAvailable;
+            fAvailable = fAvailable->fNext;
+        }
+        newBucket->fKey1 = key1;
+        newBucket->fKey2 = key2;
+        newBucket->fNext = fBucketList[hashVal];
+        fBucketList[hashVal] = newBucket;
+        fCount++;
+    }
+}
+
+template <class THasher>
+bool Hash2KeysSetOf<THasher>::putIfNotPresent(const void* key1, int key2)
+{
+    // First see if the key exists already
+    XMLSize_t hashVal;
+    Hash2KeysSetBucketElem* newBucket = findBucketElem(key1, key2, hashVal);
+
+    //
+    //  If so,then update its value. If not, then we need to add it to
+    //  the right bucket
+    //
+    if (newBucket)
+        return false;
+
+    // Apply 4 load factor to find threshold.
+    XMLSize_t threshold = fHashModulus * 4;
+
+    // If we've grown too big, expand the table and rehash.
+    if (fCount >= threshold)
+        rehash();
+
+    if(fAvailable==0)
+        newBucket = (Hash2KeysSetBucketElem*)fMemoryManager->allocate(sizeof(Hash2KeysSetBucketElem));
+    else
+    {
+        newBucket = fAvailable;
+        fAvailable = fAvailable->fNext;
+    }
+    newBucket->fKey1 = key1;
+    newBucket->fKey2 = key2;
+    newBucket->fNext = fBucketList[hashVal];
+    fBucketList[hashVal] = newBucket;
+    fCount++;
+    return true;
+}
+
+
+// ---------------------------------------------------------------------------
+//  Hash2KeysSetOf: Private methods
+// ---------------------------------------------------------------------------
+template <class THasher>
+inline Hash2KeysSetBucketElem* Hash2KeysSetOf<THasher>::
+findBucketElem(const void* const key1, const int key2, XMLSize_t& hashVal)
+{
+    // Hash the key
+    hashVal = fHasher.getHashVal(key1, fHashModulus);
+    assert(hashVal < fHashModulus);
+
+    // Search that bucket for the key
+    Hash2KeysSetBucketElem* curElem = fBucketList[hashVal];
+    while (curElem)
+    {
+        if((key2==curElem->fKey2) && (fHasher.equals(key1, curElem->fKey1)))
+            return curElem;
+
+        curElem = curElem->fNext;
+    }
+    return 0;
+}
+
+template <class THasher>
+inline const Hash2KeysSetBucketElem* Hash2KeysSetOf<THasher>::
+findBucketElem(const void* const key1, const int key2, XMLSize_t& hashVal) const
+{
+    // Hash the key
+    hashVal = fHasher.getHashVal(key1, fHashModulus);
+    assert(hashVal < fHashModulus);
+
+    // Search that bucket for the key
+    const Hash2KeysSetBucketElem* curElem = fBucketList[hashVal];
+    while (curElem)
+    {
+        if((key2==curElem->fKey2) && (fHasher.equals(key1, curElem->fKey1)))
+            return curElem;
+
+        curElem = curElem->fNext;
+    }
+    return 0;
+}
+
+
+template <class THasher>
+void Hash2KeysSetOf<THasher>::
+rehash()
+{
+    const XMLSize_t newMod = (fHashModulus * 8)+1;
+
+    Hash2KeysSetBucketElem** newBucketList =
+        (Hash2KeysSetBucketElem**) fMemoryManager->allocate
+    (
+        newMod * sizeof(Hash2KeysSetBucketElem*)
+    );//new Hash2KeysSetBucketElem*[fHashModulus];
+
+    // Make sure the new bucket list is destroyed if an
+    // exception is thrown.
+    ArrayJanitor<Hash2KeysSetBucketElem*>  guard(newBucketList, fMemoryManager);
+
+    memset(newBucketList, 0, newMod * sizeof(newBucketList[0]));
+
+    // Rehash all existing entries.
+    for (XMLSize_t index = 0; index < fHashModulus; index++)
+    {
+        // Get the bucket list head for this entry
+        Hash2KeysSetBucketElem* curElem = fBucketList[index];
+        while (curElem)
+        {
+            // Save the next element before we detach this one
+            Hash2KeysSetBucketElem* nextElem = curElem->fNext;
+
+            const XMLSize_t hashVal = fHasher.getHashVal(curElem->fKey1, newMod);
+            assert(hashVal < newMod);
+
+            Hash2KeysSetBucketElem* newHeadElem = newBucketList[hashVal];
+
+            // Insert at the start of this bucket's list.
+            curElem->fNext = newHeadElem;
+            newBucketList[hashVal] = curElem;
+
+            curElem = nextElem;
+        }
+    }
+
+    Hash2KeysSetBucketElem** const oldBucketList = fBucketList;
+
+    // Everything is OK at this point, so update the
+    // member variables.
+    fBucketList = guard.release();
+    fHashModulus = newMod;
+
+    // Delete the old bucket list.
+    fMemoryManager->deallocate(oldBucketList);//delete[] oldBucketList;
+
+}
+
+
+
+// ---------------------------------------------------------------------------
+//  Hash2KeysSetOfEnumerator: Constructors and Destructor
+// ---------------------------------------------------------------------------
+template <class THasher>
+Hash2KeysSetOfEnumerator<THasher>::
+Hash2KeysSetOfEnumerator(Hash2KeysSetOf<THasher>* const toEnum
+                              , const bool adopt
+                              , MemoryManager* const manager)
+    : fAdopted(adopt), fCurElem(0), fCurHash((XMLSize_t)-1), fToEnum(toEnum)
+    , fMemoryManager(manager)
+    , fLockPrimaryKey(0)
+{
+    if (!toEnum)
+        ThrowXMLwithMemMgr(NullPointerException, XMLExcepts::CPtr_PointerIsZero, fMemoryManager);
+
+    //
+    //  Find the next available bucket element in the hash table. If it
+    //  comes back zero, that just means the table is empty.
+    //
+    //  Note that the -1 in the current hash tells it to start
+    //  from the beginning.
+    //
+    findNext();
+}
+
+template <class THasher>
+Hash2KeysSetOfEnumerator<THasher>::~Hash2KeysSetOfEnumerator()
+{
+    if (fAdopted)
+        delete fToEnum;
+}
+
+
+// ---------------------------------------------------------------------------
+//  Hash2KeysSetOfEnumerator: Enum interface
+// ---------------------------------------------------------------------------
+template <class THasher>
+bool Hash2KeysSetOfEnumerator<THasher>::hasMoreElements() const
+{
+    //
+    //  If our current has is at the max and there are no more elements
+    //  in the current bucket, then no more elements.
+    //
+    if (!fCurElem && (fCurHash == fToEnum->fHashModulus))
+        return false;
+    return true;
+}
+
+template <class THasher>
+void Hash2KeysSetOfEnumerator<THasher>::nextElementKey(const void*& retKey1, int& retKey2)
+{
+    // Make sure we have an element to return
+    if (!hasMoreElements())
+        ThrowXMLwithMemMgr(NoSuchElementException, XMLExcepts::Enum_NoMoreElements, fMemoryManager);
+
+    //
+    //  Save the current element, then move up to the next one for the
+    //  next time around.
+    //
+    Hash2KeysSetBucketElem* saveElem = fCurElem;
+    findNext();
+
+    retKey1 = saveElem->fKey1;
+    retKey2 = saveElem->fKey2;
+
+    return;
+}
+
+template <class THasher>
+void Hash2KeysSetOfEnumerator<THasher>::Reset()
+{
+    if(fLockPrimaryKey)
+        fCurHash=fToEnum->fHasher.getHashVal(fLockPrimaryKey, fToEnum->fHashModulus);
+    else
+        fCurHash = (XMLSize_t)-1;
+
+    fCurElem = 0;
+    findNext();
+}
+
+
+template <class THasher>
+void Hash2KeysSetOfEnumerator<THasher>::setPrimaryKey(const void* key)
+{
+    fLockPrimaryKey=key;
+    Reset();
+}
+
+// ---------------------------------------------------------------------------
+//  Hash2KeysSetOfEnumerator: Private helper methods
+// ---------------------------------------------------------------------------
+template <class THasher>
+void Hash2KeysSetOfEnumerator<THasher>::findNext()
+{
+    //  Code to execute if we have to return only values with the primary key
+    if(fLockPrimaryKey)
+    {
+        if(!fCurElem)
+            fCurElem = fToEnum->fBucketList[fCurHash];
+        else
+            fCurElem = fCurElem->fNext;
+        while (fCurElem && (!fToEnum->fHasher.equals(fLockPrimaryKey, fCurElem->fKey1)))
+            fCurElem = fCurElem->fNext;
+        // if we didn't found it, make so hasMoreElements() returns false
+        if(!fCurElem)
+            fCurHash = fToEnum->fHashModulus;
+        return;
+    }
+    //
+    //  If there is a current element, move to its next element. If this
+    //  hits the end of the bucket, the next block will handle the rest.
+    //
+    if (fCurElem)
+        fCurElem = fCurElem->fNext;
+
+    //
+    //  If the current element is null, then we have to move up to the
+    //  next hash value. If that is the hash modulus, then we cannot
+    //  go further.
+    //
+    if (!fCurElem)
+    {
+        fCurHash++;
+        if (fCurHash == fToEnum->fHashModulus)
+            return;
+
+        // Else find the next non-empty bucket
+        while (fToEnum->fBucketList[fCurHash]==0)
+        {
+            // Bump to the next hash value. If we max out return
+            fCurHash++;
+            if (fCurHash == fToEnum->fHashModulus)
+                return;
+        }
+        fCurElem = fToEnum->fBucketList[fCurHash];
+    }
+}
+
+XERCES_CPP_NAMESPACE_END

Propchange: xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.c
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.c
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.hpp?rev=700828&view=auto
==============================================================================
--- xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.hpp (added)
+++ xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.hpp Wed Oct  1 09:31:56 2008
@@ -0,0 +1,223 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * $Id$
+ */
+
+#if !defined(XERCESC_INCLUDE_GUARD_HASH2KEYSSETOF_HPP)
+#define XERCESC_INCLUDE_GUARD_HASH2KEYSSETOF_HPP
+
+
+#include <xercesc/util/Hashers.hpp>
+#include <xercesc/util/IllegalArgumentException.hpp>
+#include <xercesc/util/NoSuchElementException.hpp>
+#include <xercesc/util/RuntimeException.hpp>
+#include <xercesc/util/PlatformUtils.hpp>
+
+XERCES_CPP_NAMESPACE_BEGIN
+
+// This hash table is similar to Hash2KeysSetOf with an additional integer as key2
+
+//  Forward declare the enumerator so it can be our friend.
+//
+template <class THasher>
+class Hash2KeysSetOfEnumerator;
+
+//
+//  This should really be a nested class, but some of the compilers we
+//  have to support cannot deal with that!
+//
+struct Hash2KeysSetBucketElem
+{
+    Hash2KeysSetBucketElem*              fNext;
+    const void*                          fKey1;
+    int                                  fKey2;
+};
+
+
+template <class THasher>
+class Hash2KeysSetOf : public XMemory
+{
+public:
+    // -----------------------------------------------------------------------
+    //  Constructors and Destructor
+    // -----------------------------------------------------------------------
+
+    Hash2KeysSetOf(
+      const XMLSize_t modulus,
+      MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
+
+    Hash2KeysSetOf(
+      const XMLSize_t modulus,
+      const THasher& hasher,
+      MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
+
+    ~Hash2KeysSetOf();
+
+
+    // -----------------------------------------------------------------------
+    //  Element management
+    // -----------------------------------------------------------------------
+    bool isEmpty() const;
+    bool containsKey(const void* const key1, const int key2) const;
+    void removeKey(const void* const key1, const int key2);
+    void removeKey(const void* const key1);
+    void removeAll();
+
+    // -----------------------------------------------------------------------
+    //  Getters
+    // -----------------------------------------------------------------------
+    MemoryManager* getMemoryManager() const;
+    XMLSize_t      getHashModulus()   const;
+
+    // -----------------------------------------------------------------------
+    //  Putters
+    // -----------------------------------------------------------------------
+	void put(const void* key1, int key2);
+	bool putIfNotPresent(const void* key1, int key2);
+
+private :
+    // -----------------------------------------------------------------------
+    //  Declare our friends
+    // -----------------------------------------------------------------------
+    friend class Hash2KeysSetOfEnumerator<THasher>;
+
+
+private:
+    // -----------------------------------------------------------------------
+    //  Unimplemented constructors and operators
+    // -----------------------------------------------------------------------
+    Hash2KeysSetOf(const Hash2KeysSetOf<THasher>&);
+    Hash2KeysSetOf<THasher>& operator=(const Hash2KeysSetOf<THasher>&);
+
+    // -----------------------------------------------------------------------
+    //  Private methods
+    // -----------------------------------------------------------------------
+    Hash2KeysSetBucketElem* findBucketElem(const void* const key1, const int key2, XMLSize_t& hashVal);
+    const Hash2KeysSetBucketElem* findBucketElem(const void* const key1, const int key2, XMLSize_t& hashVal) const;
+    void initialize(const XMLSize_t modulus);
+    void rehash();
+
+
+    // -----------------------------------------------------------------------
+    //  Data members
+    //
+    //  fBucketList
+    //      This is the array that contains the heads of all of the list
+    //      buckets, one for each possible hash value.
+    //
+    //  fHashModulus
+    //      The modulus used for this hash table, to hash the keys. This is
+    //      also the number of elements in the bucket list.
+    //
+    //  fCount
+    //      The number of elements currently in the map
+    //
+    //  fHash
+    //      The hasher for the key1 data type.
+    // -----------------------------------------------------------------------
+    MemoryManager*                      fMemoryManager;
+    Hash2KeysSetBucketElem**            fBucketList;
+    XMLSize_t                           fHashModulus;
+    XMLSize_t                           fCount;
+    THasher				                fHasher;
+    Hash2KeysSetBucketElem*             fAvailable;
+};
+
+
+
+//
+//  An enumerator for a value array. It derives from the basic enumerator
+//  class, so that value vectors can be generically enumerated.
+//
+template <class THasher>
+class Hash2KeysSetOfEnumerator : public XMemory
+{
+public :
+    // -----------------------------------------------------------------------
+    //  Constructors and Destructor
+    // -----------------------------------------------------------------------
+    Hash2KeysSetOfEnumerator(Hash2KeysSetOf<THasher>* const toEnum
+                           , const bool adopt = false
+                           , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
+    virtual ~Hash2KeysSetOfEnumerator();
+
+
+    // -----------------------------------------------------------------------
+    //  Enum interface
+    // -----------------------------------------------------------------------
+    bool hasMoreElements() const;
+    void Reset();
+
+    // -----------------------------------------------------------------------
+    //  New interface
+    // -----------------------------------------------------------------------
+    void nextElementKey(const void*&, int&);
+    void setPrimaryKey(const void* key);
+
+private :
+    // -----------------------------------------------------------------------
+    //  Unimplemented constructors and operators
+    // -----------------------------------------------------------------------
+    Hash2KeysSetOfEnumerator(const Hash2KeysSetOfEnumerator<THasher>&);
+    Hash2KeysSetOfEnumerator<THasher>& operator=(const Hash2KeysSetOfEnumerator<THasher>&);
+
+    // -----------------------------------------------------------------------
+    //  Private methods
+    // -----------------------------------------------------------------------
+    void findNext();
+
+
+    // -----------------------------------------------------------------------
+    //  Data Members
+    //
+    //  fAdopted
+    //      Indicates whether we have adopted the passed vector. If so then
+    //      we delete the vector when we are destroyed.
+    //
+    //  fCurElem
+    //      This is the current bucket bucket element that we are on.
+    //
+    //  fCurHash
+    //      The is the current hash buck that we are working on. Once we hit
+    //      the end of the bucket that fCurElem is in, then we have to start
+    //      working this one up to the next non-empty bucket.
+    //
+    //  fToEnum
+    //      The value array being enumerated.
+    //
+    //  fLockPrimaryKey
+    //      Indicates that we are requested to iterate over the secondary keys
+    //      associated with the given primary key
+    //
+    // -----------------------------------------------------------------------
+    bool                                    fAdopted;
+    Hash2KeysSetBucketElem*                 fCurElem;
+    XMLSize_t                               fCurHash;
+    Hash2KeysSetOf<THasher>*                fToEnum;
+    MemoryManager* const                    fMemoryManager;
+    const void*                             fLockPrimaryKey;
+};
+
+XERCES_CPP_NAMESPACE_END
+
+#if !defined(XERCES_TMPLSINC)
+#include <xercesc/util/Hash2KeysSetOf.c>
+#endif
+
+#endif

Propchange: xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.hpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xerces/c/trunk/src/xercesc/util/Hash2KeysSetOf.hpp
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org