neilg 2003/11/10 13:54:51 Modified: c/src/xercesc/validators/DTD DTDAttDefList.cpp DTDAttDefList.hpp DTDElementDecl.cpp c/src/xercesc/validators/schema ComplexTypeInfo.cpp SchemaAttDefList.cpp SchemaAttDefList.hpp Log: implementation for new stateless means of traversing attribute definition lists Revision Changes Path 1.6 +55 -2 xml-xerces/c/src/xercesc/validators/DTD/DTDAttDefList.cpp Index: DTDAttDefList.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/DTD/DTDAttDefList.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- DTDAttDefList.cpp 20 Oct 2003 11:46:28 -0000 1.5 +++ DTDAttDefList.cpp 10 Nov 2003 21:54:51 -0000 1.6 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.6 2003/11/10 21:54:51 neilg + * implementation for new stateless means of traversing attribute definition lists + * * Revision 1.5 2003/10/20 11:46:28 gareth * Pass in memory manager to constructors and use for creation of enumerators. * @@ -93,6 +96,7 @@ // --------------------------------------------------------------------------- #include <xercesc/validators/DTD/DTDAttDefList.hpp> #include <xercesc/internal/XTemplateSerializer.hpp> +#include <xercesc/util/ArrayIndexOutOfBoundsException.hpp> XERCES_CPP_NAMESPACE_BEGIN @@ -103,13 +107,19 @@ : XMLAttDefList(manager) ,fEnum(0) ,fList(listToUse) +,fArray(0) +,fSize(0) +,fCount(0) { fEnum = new (getMemoryManager()) RefHashTableOfEnumerator<DTDAttDef>(listToUse); + fArray = (DTDAttDef **)((getMemoryManager())->allocate( sizeof(DTDAttDef*) << 1)); + fSize = 2; } DTDAttDefList::~DTDAttDefList() { delete fEnum; + (getMemoryManager())->deallocate(fArray); } @@ -173,6 +183,34 @@ fEnum->Reset(); } +/** + * return total number of attributes in this list + */ +unsigned int DTDAttDefList::getAttDefCount() const +{ + return fCount; +} + +/** + * return attribute at the index-th position in the list. + */ +XMLAttDef &DTDAttDefList::getAttDef(unsigned int index) +{ + if(index >= fCount) + ThrowXML(ArrayIndexOutOfBoundsException, XMLExcepts::AttrList_BadIndex); + return *(fArray[index]); +} + +/** + * return attribute at the index-th position in the list. + */ +const XMLAttDef &DTDAttDefList::getAttDef(unsigned int index) const +{ + if(index >= fCount) + ThrowXML(ArrayIndexOutOfBoundsException, XMLExcepts::AttrList_BadIndex); + return *(fArray[index]); +} + /*** * Support for Serialization/De-serialization ***/ @@ -192,6 +230,7 @@ * ***/ XTemplateSerializer::storeObject(fList, serEng); + serEng << fCount; // do not serialize fEnum } @@ -203,11 +242,22 @@ * ***/ XTemplateSerializer::loadObject(&fList, 3, true, serEng); - + // assume empty so we can size fArray just right + serEng >> fSize; if (!fEnum && fList) { fEnum = new (getMemoryManager()) RefHashTableOfEnumerator<DTDAttDef>(fList); } + if(fSize) + { + (getMemoryManager())->deallocate(fArray); + fArray = (DTDAttDef **)((getMemoryManager())->allocate( sizeof(DTDAttDef*) * fSize)); + fCount = 0; + while(fEnum->hasMoreElements()) + { + fArray[fCount++] = &fEnum->nextElement(); + } + } } } @@ -217,6 +267,9 @@ : XMLAttDefList(manager) ,fEnum(0) ,fList(0) +,fArray(0) +,fSize(0) +,fCount(0) { } 1.6 +59 -1 xml-xerces/c/src/xercesc/validators/DTD/DTDAttDefList.hpp Index: DTDAttDefList.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/DTD/DTDAttDefList.hpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- DTDAttDefList.hpp 20 Oct 2003 11:46:28 -0000 1.5 +++ DTDAttDefList.hpp 10 Nov 2003 21:54:51 -0000 1.6 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.6 2003/11/10 21:54:51 neilg + * implementation for new stateless means of traversing attribute definition lists + * * Revision 1.5 2003/10/20 11:46:28 gareth * Pass in memory manager to constructors and use for creation of enumerators. * @@ -129,6 +132,10 @@ // ----------------------------------------------------------------------- // Implementation of the virtual interface // ----------------------------------------------------------------------- + + /** + * @deprecated This method is not thread-safe. + */ virtual bool hasMoreElements() const; virtual bool isEmpty() const; virtual XMLAttDef* findAttDef @@ -151,9 +158,32 @@ const XMLCh* const attURI , const XMLCh* const attName ) const; + + /** + * @deprecated This method is not thread-safe. + */ virtual XMLAttDef& nextElement(); + + /** + * @deprecated This method is not thread-safe. + */ virtual void Reset(); + /** + * return total number of attributes in this list + */ + virtual unsigned int getAttDefCount() const ; + + /** + * return attribute at the index-th position in the list. + */ + virtual XMLAttDef &getAttDef(unsigned int index) ; + + /** + * return attribute at the index-th position in the list. + */ + virtual const XMLAttDef &getAttDef(unsigned int index) const ; + /*** * Support for Serialization/De-serialization ***/ @@ -162,6 +192,9 @@ DTDAttDefList(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); private : + + void addAttDef(DTDAttDef *toAdd); + // ----------------------------------------------------------------------- // Private data members // @@ -172,10 +205,35 @@ // fList // The list of DTDAttDef objects that represent the attributes that // a particular element supports. + // fArray + // vector of pointers to the DTDAttDef objects contained in this list + // fSize + // size of fArray + // fCount + // number of DTDAttDef objects currently stored in this list // ----------------------------------------------------------------------- RefHashTableOfEnumerator<DTDAttDef>* fEnum; RefHashTableOf<DTDAttDef>* fList; + DTDAttDef** fArray; + unsigned int fSize; + unsigned int fCount; + + friend class DTDElementDecl; }; + +inline void DTDAttDefList::addAttDef(DTDAttDef *toAdd) +{ + if(fCount == fSize) + { + // need to grow fArray + fSize <<= 1; + DTDAttDef** newArray = (DTDAttDef **)((getMemoryManager())->allocate( sizeof(DTDAttDef*) * fSize )); + memcpy(newArray, fArray, fCount * sizeof(DTDAttDef *)); + (getMemoryManager())->deallocate(fArray); + fArray = newArray; + } + fArray[fCount++] = toAdd; +} XERCES_CPP_NAMESPACE_END 1.12 +9 -1 xml-xerces/c/src/xercesc/validators/DTD/DTDElementDecl.cpp Index: DTDElementDecl.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/DTD/DTDElementDecl.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- DTDElementDecl.cpp 31 Oct 2003 22:17:43 -0000 1.11 +++ DTDElementDecl.cpp 10 Nov 2003 21:54:51 -0000 1.12 @@ -165,6 +165,10 @@ ); retVal->setElemId(getId()); fAttDefs->put((void*)retVal->getFullName(), retVal); + // update and/or create fAttList + if(!fAttList) + ((DTDElementDecl*)this)->fAttList = new (getMemoryManager()) DTDAttDefList(fAttDefs,getMemoryManager()); + fAttList->addAttDef(retVal); wasAdded = true; } @@ -306,6 +310,10 @@ toAdd->setElemId(getId()); fAttDefs->put((void*)(toAdd->getFullName()), toAdd); + // update and/or create fAttList + if(!fAttList) + ((DTDElementDecl*)this)->fAttList = new (getMemoryManager()) DTDAttDefList(fAttDefs,getMemoryManager()); + fAttList->addAttDef(toAdd); } 1.18 +13 -2 xml-xerces/c/src/xercesc/validators/schema/ComplexTypeInfo.cpp Index: ComplexTypeInfo.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/ComplexTypeInfo.cpp,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- ComplexTypeInfo.cpp 7 Nov 2003 17:08:12 -0000 1.17 +++ ComplexTypeInfo.cpp 10 Nov 2003 21:54:51 -0000 1.18 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.18 2003/11/10 21:54:51 neilg + * implementation for new stateless means of traversing attribute definition lists + * * Revision 1.17 2003/11/07 17:08:12 knoaman * For PSVI support, distinguish wildcard elements with namespace lists. * @@ -284,6 +287,10 @@ fAttDefs->put((void*)(toAdd->getAttName()->getLocalPart()), toAdd->getAttName()->getURI(), toAdd); + // update and/or create fAttList + if(!fAttList) + ((ComplexTypeInfo*)this)->fAttList = new (fMemoryManager) SchemaAttDefList(fAttDefs,fMemoryManager); + fAttList->addAttDef(toAdd); } void ComplexTypeInfo::setContentSpec(ContentSpecNode* const toAdopt) { @@ -378,9 +385,13 @@ retVal->setElemId(getElementId()); fAttDefs->put((void*)retVal->getAttName()->getLocalPart(), uriId, retVal); + // update and/or create fAttList + if(!fAttList) + ((ComplexTypeInfo*)this)->fAttList = new (fMemoryManager) SchemaAttDefList(fAttDefs,fMemoryManager); + fAttList->addAttDef(retVal); wasAdded = true; } - else + else { wasAdded = false; } 1.7 +55 -1 xml-xerces/c/src/xercesc/validators/schema/SchemaAttDefList.cpp Index: SchemaAttDefList.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/SchemaAttDefList.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- SchemaAttDefList.cpp 20 Oct 2003 11:46:28 -0000 1.6 +++ SchemaAttDefList.cpp 10 Nov 2003 21:54:51 -0000 1.7 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.7 2003/11/10 21:54:51 neilg + * implementation for new stateless means of traversing attribute definition lists + * * Revision 1.6 2003/10/20 11:46:28 gareth * Pass in memory manager to constructors and use for creation of enumerators. * @@ -89,6 +92,7 @@ #include <xercesc/validators/schema/SchemaAttDefList.hpp> #include <xercesc/internal/XTemplateSerializer.hpp> +#include <xercesc/util/ArrayIndexOutOfBoundsException.hpp> XERCES_CPP_NAMESPACE_BEGIN @@ -99,13 +103,19 @@ : XMLAttDefList(manager) ,fEnum(0) ,fList(listToUse) +,fArray(0) +,fCount(0) +,fSize(0) { fEnum = new (getMemoryManager()) RefHash2KeysTableOfEnumerator<SchemaAttDef>(listToUse); + fArray = (SchemaAttDef **)((getMemoryManager())->allocate( sizeof(SchemaAttDef*) << 1)); + fSize = 2; } SchemaAttDefList::~SchemaAttDefList() { delete fEnum; + (getMemoryManager())->deallocate(fArray); } @@ -171,6 +181,34 @@ fEnum->Reset(); } +/** + * return total number of attributes in this list + */ +unsigned int SchemaAttDefList::getAttDefCount() const +{ + return fCount; +} + +/** + * return attribute at the index-th position in the list. + */ +XMLAttDef &SchemaAttDefList::getAttDef(unsigned int index) +{ + if(index >= fCount) + ThrowXML(ArrayIndexOutOfBoundsException, XMLExcepts::AttrList_BadIndex); + return *(fArray[index]); +} + +/** + * return attribute at the index-th position in the list. + */ +const XMLAttDef &SchemaAttDefList::getAttDef(unsigned int index) const +{ + if(index >= fCount) + ThrowXML(ArrayIndexOutOfBoundsException, XMLExcepts::AttrList_BadIndex); + return *(fArray[index]); +} + /*** * Support for Serialization/De-serialization ***/ @@ -190,6 +228,7 @@ * ***/ XTemplateSerializer::storeObject(fList, serEng); + serEng << fCount; // do not serialize fEnum } @@ -202,10 +241,22 @@ ***/ XTemplateSerializer::loadObject(&fList, 3, true, serEng); + // assume empty so we can size fArray just right + serEng >> fSize; if (!fEnum && fList) { fEnum = new (getMemoryManager()) RefHash2KeysTableOfEnumerator<SchemaAttDef>(fList); } + if(fSize) + { + (getMemoryManager())->deallocate(fArray); + fArray = (SchemaAttDef **)((getMemoryManager())->allocate( sizeof(SchemaAttDef*) * fSize)); + fCount = 0; + while(fEnum->hasMoreElements()) + { + fArray[fCount++] = &fEnum->nextElement(); + } + } } } @@ -213,6 +264,9 @@ SchemaAttDefList::SchemaAttDefList(MemoryManager* const manager) :fEnum(0) ,fList(0) +,fArray(0) +,fCount(0) +,fSize(0) { } 1.6 +58 -1 xml-xerces/c/src/xercesc/validators/schema/SchemaAttDefList.hpp Index: SchemaAttDefList.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/SchemaAttDefList.hpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- SchemaAttDefList.hpp 20 Oct 2003 11:46:28 -0000 1.5 +++ SchemaAttDefList.hpp 10 Nov 2003 21:54:51 -0000 1.6 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.6 2003/11/10 21:54:51 neilg + * implementation for new stateless means of traversing attribute definition lists + * * Revision 1.5 2003/10/20 11:46:28 gareth * Pass in memory manager to constructors and use for creation of enumerators. * @@ -119,6 +122,10 @@ // ----------------------------------------------------------------------- // Implementation of the virtual interface // ----------------------------------------------------------------------- + + /** + * @deprecated This method is not thread-safe. + */ virtual bool hasMoreElements() const; virtual bool isEmpty() const; virtual XMLAttDef* findAttDef @@ -141,9 +148,32 @@ const XMLCh* const attURI , const XMLCh* const attName ) const; + + /** + * @deprecated This method is not thread-safe. + */ virtual XMLAttDef& nextElement(); + + /** + * @deprecated This method is not thread-safe. + */ virtual void Reset(); + /** + * return total number of attributes in this list + */ + virtual unsigned int getAttDefCount() const ; + + /** + * return attribute at the index-th position in the list. + */ + virtual XMLAttDef &getAttDef(unsigned int index) ; + + /** + * return attribute at the index-th position in the list. + */ + virtual const XMLAttDef &getAttDef(unsigned int index) const ; + /*** * Support for Serialization/De-serialization ***/ @@ -152,6 +182,8 @@ SchemaAttDefList(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); private : + void addAttDef(SchemaAttDef *toAdd); + // ----------------------------------------------------------------------- // Private data members // @@ -162,10 +194,35 @@ // fList // The list of SchemaAttDef objects that represent the attributes that // a particular element supports. + // fArray + // vector of pointers to the DTDAttDef objects contained in this list + // fSize + // size of fArray + // fCount + // number of DTDAttDef objects currently stored in this list // ----------------------------------------------------------------------- RefHash2KeysTableOfEnumerator<SchemaAttDef>* fEnum; RefHash2KeysTableOf<SchemaAttDef>* fList; + SchemaAttDef** fArray; + unsigned int fSize; + unsigned int fCount; + + friend class ComplexTypeInfo; }; + +inline void SchemaAttDefList::addAttDef(SchemaAttDef *toAdd) +{ + if(fCount == fSize) + { + // need to grow fArray + fSize <<= 1; + SchemaAttDef** newArray = (SchemaAttDef **)((getMemoryManager())->allocate( sizeof(SchemaAttDef*) * fSize )); + memcpy(newArray, fArray, fCount * sizeof(SchemaAttDef *)); + (getMemoryManager())->deallocate(fArray); + fArray = newArray; + } + fArray[fCount++] = toAdd; +} XERCES_CPP_NAMESPACE_END
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]