[prev in list] [next in list] [prev in thread] [next in thread]
List: xerces-cvs
Subject: cvs commit: xml-xerces/c/src/xercesc/internal XTemplateSerializer.cpp
From: peiyongz () apache ! org
Date: 2004-10-26 14:48:46
Message-ID: 20041026144846.94985.qmail () minotaur ! apache ! org
[Download RAW message or body]
peiyongz 2004/10/26 07:48:46
Modified: c/src/xercesc/internal XTemplateSerializer.cpp
Log:
Maintain consistent order among multiple store/load session to allow comparison
Revision Changes Path
1.11 +461 -58 xml-xerces/c/src/xercesc/internal/XTemplateSerializer.cpp
Index: XTemplateSerializer.cpp
===================================================================
RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XTemplateSerializer.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- XTemplateSerializer.cpp 8 Sep 2004 13:56:14 -0000 1.10
+++ XTemplateSerializer.cpp 26 Oct 2004 14:48:46 -0000 1.11
@@ -17,6 +17,9 @@
/*
* $Id$
* $Log$
+ * Revision 1.11 2004/10/26 14:48:46 peiyongz
+ * Maintain consistent order among multiple store/load session to allow comparison
+ *
* Revision 1.10 2004/09/08 13:56:14 peiyongz
* Apache License Version 2.0
*
@@ -52,13 +55,234 @@
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
-#include <xercesc/internal/XSerializeEngine.hpp>
#include <xercesc/internal/XTemplateSerializer.hpp>
#include <xercesc/validators/common/Grammar.hpp>
#include <xercesc/util/HashPtr.hpp>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
XERCES_CPP_NAMESPACE_BEGIN
+/***
+ * internal class meant to be comsumed by XTemplateSerializer only
+ * the size can not grow
+ ***/
+#ifdef _DEBUG
+
+class KeySet : public XMemory
+{
+public:
+ // -----------------------------------------------------------------------
+ // Contructors and Destructor
+ // -----------------------------------------------------------------------
+ KeySet
+ (
+ const XMLCh* const strKey
+ , const int intKey1 = 0
+ , const int intKey2 = 0
+ , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+ );
+
+ ~KeySet();
+
+ // -----------------------------------------------------------------------
+ // Public operators
+ // -----------------------------------------------------------------------
+ inline void getKeys(const XMLCh*&, int&, int&) const;
+ void print() const;
+
+ // -----------------------------------------------------------------------
+ // Unimplemented constructors and operators
+ // -----------------------------------------------------------------------
+ KeySet(const KeySet&);
+ KeySet& operator=(const KeySet&);
+
+ // -----------------------------------------------------------------------
+ // Data members
+ // reference only
+ // -----------------------------------------------------------------------
+ const XMLCh* const fStrKey;
+ const int fIntKey1;
+ const int fIntKey2;
+ MemoryManager* fMemoryManager;
+
+};
+
+KeySet::KeySet(const XMLCh* const strKey
+ , const int intKey1
+ , const int intKey2
+ , MemoryManager* const manager)
+:fStrKey(strKey)
+,fIntKey1(intKey1)
+,fIntKey2(intKey2)
+,fMemoryManager(manager)
+{
+}
+
+KeySet::~KeySet()
+{
+}
+
+inline
+void KeySet::getKeys(const XMLCh*& strKey, int& intKey1, int& intKey2) const
+{
+ strKey = fStrKey;
+ intKey1 = fIntKey1;
+ intKey2 = fIntKey2;
+}
+
+void KeySet::print() const
+{
+ char* tmpStr = XMLString::transcode(fStrKey);
+ printf("tmpStr=<%s>, intKey1=<%d>, intKey2=<%d>\n", tmpStr, fIntKey1, \
fIntKey2); + XMLString::release(&tmpStr);
+}
+
+static int compareKeySet(const void* keyl, const void* keyr)
+{
+ const KeySet* pairl=*(const KeySet**)keyl;
+ const KeySet* pairr=*(const KeySet**)keyr;
+
+ const XMLCh* strKeyl = 0;
+ int intKeyl_1 = 0;
+ int intKeyl_2 = 0;
+ pairl->getKeys(strKeyl, intKeyl_1, intKeyl_2);
+
+ const XMLCh* strKeyr = 0;
+ int intKeyr_1 = 0;
+ int intKeyr_2 = 0;
+ pairr->getKeys(strKeyr, intKeyr_1, intKeyr_2);
+
+ int compareValue = XMLString::compareString(strKeyl, strKeyr);
+
+ if (compareValue !=0)
+ return compareValue;
+
+ compareValue = intKeyl_1 - intKeyr_1;
+ if (compareValue !=0)
+ return compareValue;
+
+ return (intKeyl_2 - intKeyr_2);
+
+}
+
+class SortArray : public XMemory
+{
+private :
+ // -----------------------------------------------------------------------
+ // Contructors and Destructor
+ // -----------------------------------------------------------------------
+ SortArray
+ (
+ const unsigned int size
+ , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+ );
+
+ ~SortArray();
+
+ // -----------------------------------------------------------------------
+ // Public operators
+ // -----------------------------------------------------------------------
+ inline const KeySet* elementAt(const unsigned int index) const;
+ void addElement(const KeySet* const keySet);
+ void sort();
+ void dump() const;
+
+ // -----------------------------------------------------------------------
+ // Unimplemented constructors and operators
+ // -----------------------------------------------------------------------
+ SortArray(const SortArray&);
+ SortArray& operator=(const SortArray&);
+
+ // -----------------------------------------------------------------------
+ // Data members
+ // -----------------------------------------------------------------------
+ unsigned int fCur; //point to the current available slot
+ unsigned int fSize;
+ const KeySet** fElemList; //owning objects
+ MemoryManager* fMemoryManager;
+
+ friend class XTemplateSerializer;
+
+};
+
+SortArray::SortArray(const unsigned int size
+ , MemoryManager* const manager )
+:fCur(0)
+,fSize(size)
+,fMemoryManager(manager)
+{
+ fElemList = (const KeySet**) fMemoryManager->allocate(size * sizeof \
(KeySet*)); +}
+
+SortArray::~SortArray()
+{
+ for (unsigned int i=0; i< fSize; i++)
+ delete fElemList[i];
+
+ fMemoryManager->deallocate(fElemList);
+}
+
+inline
+const KeySet* SortArray::elementAt(const unsigned int index) const
+{
+ assert(index < fCur);
+ return fElemList[index];
+}
+
+void SortArray::addElement(const KeySet* const keySet)
+{
+ assert(fCur < fSize);
+ fElemList[fCur++]=keySet;
+}
+
+void SortArray::sort()
+{
+ assert(fCur == fSize);
+ //dump();
+ qsort(fElemList, fSize, sizeof (KeySet*), compareKeySet);
+ //dump();
+}
+
+void SortArray::dump() const
+{
+ printf("\n fSize=<%d>, fCur=<%d>\n", fSize, fCur);
+ for (unsigned int i = 0; i < fCur; i++)
+ fElemList[i]->print();
+}
+
+#define GET_NEXT_KEYSET() \
+ const KeySet* keySet = sortArray.elementAt(i); \
+ const XMLCh* strKey = 0; \
+ int intKey1 = 0; \
+ int intKey2 = 0; \
+ keySet->getKeys(strKey, intKey1, intKey2);
+
+#define SORT_KEYSET_ONEKEY() \
+ SortArray sortArray(itemNumber); \
+ while (e.hasMoreElements()) \
+ { \
+ KeySet* keySet = new KeySet((XMLCh*) e.nextElementKey()); \
+ sortArray.addElement(keySet); \
+ } \
+ sortArray.sort();
+
+#define SORT_KEYSET_TWOKEYS() \
+ SortArray sortArray(itemNumber); \
+ while (e.hasMoreElements()) \
+ { \
+ XMLCh* strKey; \
+ int intKey; \
+ e.nextElementKey((void*&)strKey, intKey); \
+ KeySet* keySet = new KeySet(strKey, intKey); \
+ sortArray.addElement(keySet); \
+ } \
+ sortArray.sort();
+
+#endif
+
/**********************************************************
*
* ValueVectorOf
@@ -117,7 +341,6 @@
(*objToLoad)->addElement(data);
}
}
-
}
void XTemplateSerializer::storeObject(ValueVectorOf<unsigned int>* const \
objToStore @@ -256,6 +479,7 @@
if (serEng.needToStoreObject(objToStore))
{
+
int vectorLength = objToStore->size();
serEng<<vectorLength;
@@ -264,6 +488,7 @@
SchemaAttDef* data = objToStore->elementAt(i);
serEng<<data;
}
+
}
}
@@ -276,6 +501,7 @@
if (serEng.needToLoadObject((void**)objToLoad))
{
+
if (!*objToLoad)
{
if (initSize < 0)
@@ -299,6 +525,7 @@
serEng>>data;
(*objToLoad)->addElement(data);
}
+
}
}
@@ -309,6 +536,7 @@
if (serEng.needToStoreObject(objToStore))
{
+
int vectorLength = objToStore->size();
serEng<<vectorLength;
@@ -317,6 +545,7 @@
SchemaElementDecl* data = objToStore->elementAt(i);
serEng<<data;
}
+
}
}
@@ -764,11 +993,25 @@
serEng<<itemNumber;
e.Reset();
+#ifdef _DEBUG
+ //to sort the key
+ SORT_KEYSET_ONEKEY()
+
+ //to store the data
+ for (int i=0; i < itemNumber; i++)
+ {
+ GET_NEXT_KEYSET()
+
+ KVStringPair* data = objToStore->get(strKey);
+ serEng<<data;
+ }
+#else
while (e.hasMoreElements())
{
KVStringPair* data = objToStore->get(e.nextElementKey());
serEng<<data;
}
+#endif
}
}
@@ -828,11 +1071,25 @@
serEng<<itemNumber;
e.Reset();
+#ifdef _DEBUG
+ //to sort the key
+ SORT_KEYSET_ONEKEY()
+
+ //to store the data
+ for (int i=0; i < itemNumber; i++)
+ {
+ GET_NEXT_KEYSET()
+
+ XMLAttDef* data = objToStore->get(strKey);
+ serEng<<data;
+ }
+#else
while (e.hasMoreElements())
{
XMLAttDef* data = objToStore->get(e.nextElementKey());
serEng<<data;
}
+#endif
}
}
@@ -899,11 +1156,25 @@
serEng<<itemNumber;
e.Reset();
+#ifdef _DEBUG
+ //to sort the key
+ SORT_KEYSET_ONEKEY()
+
+ //to store the data
+ for (int i=0; i < itemNumber; i++)
+ {
+ GET_NEXT_KEYSET()
+
+ DTDAttDef* data = objToStore->get(strKey);
+ serEng<<data;
+ }
+#else
while (e.hasMoreElements())
{
DTDAttDef* data = objToStore->get(e.nextElementKey());
serEng<<data;
}
+#endif
}
}
@@ -965,11 +1236,25 @@
serEng<<itemNumber;
e.Reset();
+#ifdef _DEBUG
+ //to sort the key
+ SORT_KEYSET_ONEKEY()
+
+ //to store the data
+ for (int i=0; i < itemNumber; i++)
+ {
+ GET_NEXT_KEYSET()
+
+ ComplexTypeInfo* data = objToStore->get(strKey);
+ serEng<<data;
+ }
+#else
while (e.hasMoreElements())
{
ComplexTypeInfo* data = objToStore->get(e.nextElementKey());
serEng<<data;
}
+#endif
}
}
@@ -1031,6 +1316,22 @@
serEng<<itemNumber;
e.Reset();
+#ifdef _DEBUG
+ //to sort the key
+ SORT_KEYSET_ONEKEY()
+
+ //to store the data
+ for (int i=0; i < itemNumber; i++)
+ {
+ GET_NEXT_KEYSET()
+
+ unsigned int id = serEng.getStringPool()->getId(strKey);
+ serEng<<id;
+
+ XercesGroupInfo* data = objToStore->get(strKey);
+ serEng<<data;
+ }
+#else
while (e.hasMoreElements())
{
XMLCh* key = (XMLCh*) e.nextElementKey();
@@ -1049,11 +1350,12 @@
// }
//
- serEng<<id;
+ serEng<<id;
XercesGroupInfo* data = objToStore->get(key);
serEng<<data;
}
+#endif
}
}
@@ -1120,11 +1422,25 @@
serEng<<itemNumber;
e.Reset();
+#ifdef _DEBUG
+ //to sort the key
+ SORT_KEYSET_ONEKEY()
+
+ //to store the data
+ for (int i=0; i < itemNumber; i++)
+ {
+ GET_NEXT_KEYSET()
+
+ XercesAttGroupInfo* data = objToStore->get(strKey);
+ serEng<<data;
+ }
+#else
while (e.hasMoreElements())
{
XercesAttGroupInfo* data = objToStore->get(e.nextElementKey()); \
serEng<<data;
}
+#endif
}
}
@@ -1187,6 +1503,21 @@
serEng<<itemNumber;
e.Reset();
+#ifdef _DEBUG
+ //to sort the key
+ SORT_KEYSET_ONEKEY()
+
+ //to store the data
+ for (int i=0; i < itemNumber; i++)
+ {
+ GET_NEXT_KEYSET()
+
+ serEng.writeString(strKey);
+
+ XMLRefInfo* data = objToStore->get(strKey);
+ serEng<<data;
+ }
+#else
while (e.hasMoreElements())
{
XMLCh* key = (XMLCh*) e.nextElementKey();
@@ -1195,6 +1526,7 @@
XMLRefInfo* data = objToStore->get(key);
serEng<<data;
}
+#endif
}
}
@@ -1259,6 +1591,19 @@
serEng<<itemNumber;
e.Reset();
+#ifdef _DEBUG
+ //to sort the key
+ SORT_KEYSET_ONEKEY()
+
+ //to store the data
+ for (int i=0; i < itemNumber; i++)
+ {
+ GET_NEXT_KEYSET()
+
+ DatatypeValidator* data = objToStore->get(strKey);
+ DatatypeValidator::storeDV(serEng, data);
+ }
+#else
while (e.hasMoreElements())
{
/***
@@ -1272,6 +1617,7 @@
DatatypeValidator* data = objToStore->get(e.nextElementKey());
DatatypeValidator::storeDV(serEng, data);
}
+#endif
}
}
@@ -1359,11 +1705,26 @@
serEng<<itemNumber;
e.Reset();
+#ifdef _DEBUG
+ //to sort the key
+ SORT_KEYSET_ONEKEY()
+
+ //to store the data
+ for (int i=0; i < itemNumber; i++)
+ {
+ GET_NEXT_KEYSET()
+
+ Grammar* data = objToStore->get(strKey);
+ Grammar::storeGrammar(serEng, data);
+ }
+#else
while (e.hasMoreElements())
{
Grammar* data = objToStore->get(e.nextElementKey());
Grammar::storeGrammar(serEng, data);
}
+#endif
+
}
}
@@ -1416,6 +1777,53 @@
serEng<<objToStore->getHashModulus();
RefHashTableOfEnumerator<XSAnnotation> e(objToStore, false, \
objToStore->getMemoryManager()); +
+#ifdef _DEBUG
+ //get the total item number
+ int itemNumber = 0;
+ while (e.hasMoreElements())
+ {
+ void* key = e.nextElementKey();
+ XSerializeEngine::XSerializedObjectId_t keyId = \
serEng.lookupStorePool(key); +
+ if (keyId)
+ itemNumber++;
+ }
+
+ serEng<<itemNumber;
+ e.Reset();
+
+ //to sort the key
+ //though keyId is not supposed to be involved in compare
+ //we merely use the kepPair to encap both the string key and keyid
+ SortArray sortArray(itemNumber);
+ while (e.hasMoreElements())
+ {
+ void* key = e.nextElementKey();
+ XSerializeEngine::XSerializedObjectId_t keyId = \
serEng.lookupStorePool(key); +
+ if (keyId)
+ {
+ KeySet* keySet = new KeySet((XMLCh*)key, keyId);
+ sortArray.addElement(keySet);
+ }
+
+ }
+
+ sortArray.sort();
+
+ //to store the data
+ for (int i=0; i < itemNumber; i++)
+ {
+ GET_NEXT_KEYSET()
+
+ XSerializeEngine::XSerializedObjectId_t keyId = \
(XSerializeEngine::XSerializedObjectId_t)intKey1; + XSAnnotation* data = \
objToStore->get(strKey); +
+ serEng<<keyId;
+ serEng<<data;
+ }
+#else
ValueVectorOf<XSerializeEngine::XSerializedObjectId_t> ids(16, \
serEng.getMemoryManager()); ValueVectorOf<void*> keys(16, \
serEng.getMemoryManager());
@@ -1441,6 +1849,7 @@
serEng<<keyId;
serEng<<data;
}
+#endif
}
}
@@ -1474,6 +1883,7 @@
for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
{
XSerializeEngine::XSerializedObjectId_t keyId = 0;
+
serEng>>keyId;
void* key = serEng.lookupLoadPool(keyId);
@@ -1515,6 +1925,21 @@
serEng<<itemNumber;
e.Reset();
+#ifdef _DEBUG
+ //to sort the key
+ SORT_KEYSET_TWOKEYS()
+
+ //to store the data
+ for (int i=0; i < itemNumber; i++)
+ {
+ GET_NEXT_KEYSET()
+
+ SchemaAttDef* data = objToStore->get(strKey, intKey1);
+ serEng<<data;
+
+ }
+#else
+
while (e.hasMoreElements())
{
XMLCh* key1;
@@ -1525,7 +1950,7 @@
serEng<<data;
}
-
+#endif
}
}
@@ -1595,6 +2020,24 @@
serEng<<itemNumber;
e.Reset();
+#ifdef _DEBUG
+
+ //to sort the key
+ SORT_KEYSET_TWOKEYS()
+
+ //to store the data
+ for (int i=0; i < itemNumber; i++)
+ {
+ GET_NEXT_KEYSET()
+
+ serEng.writeString(strKey);
+ serEng<<intKey1;
+
+ ElemVector* data = objToStore->get(strKey, intKey1);
+ storeObject(data, serEng);
+ }
+#else
+
while (e.hasMoreElements())
{
XMLCh* key1;
@@ -1608,7 +2051,7 @@
storeObject(data, serEng);
}
-
+#endif
}
}
@@ -1700,6 +2143,7 @@
*
* SchemaElementDecl
*
+ * maintain the same order through id
***********************************************************/
void XTemplateSerializer::storeObject(RefHash3KeysIdPool<SchemaElementDecl>* const \
objToStore
, XSerializeEngine& \
serEng) @@ -1710,30 +2154,15 @@
serEng<<objToStore->getHashModulus();
- int itemNumber = 0;
RefHash3KeysIdPoolEnumerator<SchemaElementDecl> e(objToStore, false, \
objToStore->getMemoryManager()); +
+ serEng<<e.size();
- XMLCh* key1;
- int key2;
- int key3;
-
- while (e.hasMoreKeys())
- {
- e.nextElementKey((void*&)key1, key2, key3);
- itemNumber++;
- }
-
- serEng<<itemNumber;
- e.resetKey();
-
- while (e.hasMoreKeys())
- {
- e.nextElementKey((void*&)key1, key2, key3);
-
- SchemaElementDecl* data = objToStore->getByKey(key1, key2, key3);
- serEng<<data;
+ while (e.hasMoreElements())
+ {
+ SchemaElementDecl& data = e.nextElement();
+ serEng<<&data;
}
-
}
}
@@ -1770,7 +2199,7 @@
{
SchemaElementDecl* elemDecl;
serEng>>elemDecl;
-
+
(*objToLoad)->put(elemDecl->getBaseName()
, elemDecl->getURI()
, elemDecl->getEnclosingScope()
@@ -1791,6 +2220,7 @@
* DTDEntityDecl
* XMLNotationDecl
*
+ * maintain the same order through id
***********************************************************/
void XTemplateSerializer::storeObject(NameIdPool<DTDElementDecl>* const objToStore
, XSerializeEngine& serEng)
@@ -1798,24 +2228,15 @@
if (serEng.needToStoreObject(objToStore))
{
- int itemNumber = 0;
NameIdPoolEnumerator<DTDElementDecl> e(objToStore, \
objToStore->getMemoryManager());
- while (e.hasMoreElements())
- {
- e.nextElement();
- itemNumber++;
- }
-
- serEng<<itemNumber;
- e.Reset();
+ serEng<<e.size();
while (e.hasMoreElements())
{
DTDElementDecl& data = e.nextElement();
data.serialize(serEng);
}
-
}
}
@@ -1864,24 +2285,15 @@
if (serEng.needToStoreObject(objToStore))
{
- int itemNumber = 0;
NameIdPoolEnumerator<DTDEntityDecl> e(objToStore, \
objToStore->getMemoryManager());
- while (e.hasMoreElements())
- {
- e.nextElement();
- itemNumber++;
- }
-
- serEng<<itemNumber;
- e.Reset();
+ serEng<<e.size();
while (e.hasMoreElements())
{
DTDEntityDecl& data = e.nextElement();
data.serialize(serEng);
}
-
}
}
@@ -1930,24 +2342,15 @@
if (serEng.needToStoreObject(objToStore))
{
- int itemNumber = 0;
NameIdPoolEnumerator<XMLNotationDecl> e(objToStore, \
objToStore->getMemoryManager());
- while (e.hasMoreElements())
- {
- e.nextElement();
- itemNumber++;
- }
-
- serEng<<itemNumber;
- e.Reset();
+ serEng<<e.size();
while (e.hasMoreElements())
{
XMLNotationDecl& data = e.nextElement();
data.serialize(serEng);
}
-
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic