peiyongz 2004/01/15 15:42:32 Modified: c/src/xercesc/internal XSerializeEngine.cpp XSerializeEngine.hpp Log: proper allignment for built-in datatype read/write Revision Changes Path 1.13 +48 -31 xml-xerces/c/src/xercesc/internal/XSerializeEngine.cpp Index: XSerializeEngine.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSerializeEngine.cpp,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- XSerializeEngine.cpp 13 Jan 2004 16:34:20 -0000 1.12 +++ XSerializeEngine.cpp 15 Jan 2004 23:42:32 -0000 1.13 @@ -57,6 +57,9 @@ /* * $Id$ * $Log$ + * Revision 1.13 2004/01/15 23:42:32 peiyongz + * proper allignment for built-in datatype read/write + * * Revision 1.12 2004/01/13 16:34:20 cargilld * Misc memory management changes. * @@ -642,8 +645,9 @@ XSerializeEngine& XSerializeEngine::operator<<(short sh) { - checkAndFlushBuffer(sizeof(short)); + checkAndFlushBuffer(allignAdjust()+sizeof(short)); + allignBufCur(); *(short*)fBufCur = sh; fBufCur += sizeof(short); return *this; @@ -651,18 +655,29 @@ XSerializeEngine& XSerializeEngine::operator<<(int i) { - return XSerializeEngine::operator<<((long)i); + checkAndFlushBuffer(allignAdjust()+sizeof(int)); + + allignBufCur(); + *(int*)fBufCur = i; + fBufCur += sizeof(int); + return *this; } XSerializeEngine& XSerializeEngine::operator<<(unsigned int ui) { - return XSerializeEngine::operator<<((unsigned long)ui); + checkAndFlushBuffer(allignAdjust()+sizeof(unsigned int)); + + allignBufCur(); + *(unsigned int*)fBufCur = ui; + fBufCur += sizeof(unsigned int); + return *this; } XSerializeEngine& XSerializeEngine::operator<<(long l) { - checkAndFlushBuffer(sizeof(long)); + checkAndFlushBuffer(allignAdjust()+sizeof(long)); + allignBufCur(); *(long*)fBufCur = l; fBufCur += sizeof(long); return *this; @@ -670,8 +685,9 @@ XSerializeEngine& XSerializeEngine::operator<<(unsigned long ul) { - checkAndFlushBuffer(sizeof(unsigned long)); + checkAndFlushBuffer(allignAdjust()+sizeof(unsigned long)); + allignBufCur(); *(unsigned long*)fBufCur = ul; fBufCur += sizeof(unsigned long); return *this; @@ -679,8 +695,9 @@ XSerializeEngine& XSerializeEngine::operator<<(float f) { - checkAndFlushBuffer(sizeof(float)); + checkAndFlushBuffer(allignAdjust()+sizeof(float)); + allignBufCur(); *(float*)fBufCur = *(float*)&f; fBufCur += sizeof(float); return *this; @@ -688,8 +705,9 @@ XSerializeEngine& XSerializeEngine::operator<<(double d) { - checkAndFlushBuffer(sizeof(double)); + checkAndFlushBuffer(allignAdjust()+sizeof(double)); + allignBufCur(); *(double*)fBufCur = *(double*)&d; fBufCur += sizeof(double); return *this; @@ -698,22 +716,6 @@ // --------------------------------------------------------------------------- // Extraction // --------------------------------------------------------------------------- -/*** -XSerializeEngine& operator>>(XSerializeEngine& serEng - , XSerializable*& serObj) -{ - serObj = serEng.read(0); - return serEng; -} - -XSerializeEngine& operator>>(XSerializeEngine& serEng - , const XSerializable*& serObj) -{ - serObj = serEng.read(0); - return serEng; -} -***/ - XSerializeEngine& XSerializeEngine::operator>>(XMLCh& xch) { checkAndFillBuffer(sizeof(XMLCh)); @@ -748,8 +750,9 @@ XSerializeEngine& XSerializeEngine::operator>>(short& sh) { - checkAndFillBuffer(sizeof(short)); + checkAndFillBuffer(allignAdjust()+sizeof(short)); + allignBufCur(); sh = *(short*)fBufCur; fBufCur += sizeof(short); return *this; @@ -757,18 +760,29 @@ XSerializeEngine& XSerializeEngine::operator>>(int& i) { - return XSerializeEngine::operator>>((long&)i); + checkAndFillBuffer(allignAdjust()+sizeof(int)); + + allignBufCur(); + i = *(int*)fBufCur; + fBufCur += sizeof(int); + return *this; } XSerializeEngine& XSerializeEngine::operator>>(unsigned int& ui) { - return XSerializeEngine::operator>>((unsigned long&)ui); + checkAndFillBuffer(allignAdjust()+sizeof(unsigned int)); + + allignBufCur(); + ui = *(unsigned int*)fBufCur; + fBufCur += sizeof(unsigned int); + return *this; } XSerializeEngine& XSerializeEngine::operator>>(long& l) { - checkAndFillBuffer(sizeof(long)); + checkAndFillBuffer(allignAdjust()+sizeof(long)); + allignBufCur(); l = *(long*)fBufCur; fBufCur += sizeof(long); return *this; @@ -776,8 +790,9 @@ XSerializeEngine& XSerializeEngine::operator>>(unsigned long& ul) { - checkAndFillBuffer(sizeof(unsigned long)); + checkAndFillBuffer(allignAdjust()+sizeof(unsigned long)); + allignBufCur(); ul = *(unsigned long*)fBufCur; fBufCur += sizeof(unsigned long); return *this; @@ -785,8 +800,9 @@ XSerializeEngine& XSerializeEngine::operator>>(float& f) { - checkAndFillBuffer(sizeof(float)); + checkAndFillBuffer(allignAdjust()+sizeof(float)); + allignBufCur(); *(float*)&f = *(float*)fBufCur; fBufCur += sizeof(float); return *this; @@ -794,8 +810,9 @@ XSerializeEngine& XSerializeEngine::operator>>(double& d) { - checkAndFillBuffer(sizeof(double)); + checkAndFillBuffer(allignAdjust()+sizeof(double)); + allignBufCur(); *(double*)&d = *(double*)fBufCur; fBufCur += sizeof(double); return *this; 1.11 +38 -1 xml-xerces/c/src/xercesc/internal/XSerializeEngine.hpp Index: XSerializeEngine.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSerializeEngine.hpp,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- XSerializeEngine.hpp 17 Dec 2003 00:18:34 -0000 1.10 +++ XSerializeEngine.hpp 15 Jan 2004 23:42:32 -0000 1.11 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.11 2004/01/15 23:42:32 peiyongz + * proper allignment for built-in datatype read/write + * * Revision 1.10 2003/12/17 00:18:34 cargilld * Update to memory management so that the static memory manager (one used to call Initialize) is only for static data. * @@ -543,6 +546,10 @@ inline void Assert(bool toEval , const XMLExcepts::Codes toThrow) const; + inline size_t allignAdjust() const; + + inline void allignBufCur(); + // Make XTemplateSerializer friend of XSerializeEngine so that // we can call lookupStorePool and lookupLoadPool in the case of // annotations. @@ -670,6 +677,36 @@ ThrowXMLwithMemMgr(XSerializationException, toThrow, fMemoryManager); } +} + +// For the following built-in datatype, we assume +// the same allignment requirement +// +// short unsigned short +// int unsigned long +// long unsigned long +// float +// double +// +// Based on the current position (fBufCur), calculated the needed size +// to read/write +// +inline size_t XSerializeEngine::allignAdjust() const +{ + #ifdef XML_PLATFORM_NEW_BLOCK_ALIGNMENT + size_t alignment = XML_PLATFORM_NEW_BLOCK_ALIGNMENT; + #else + size_t alignment = (sizeof(void*) >= sizeof(double)) ? sizeof(void*) : sizeof(double); + #endif + + size_t remainder = (long) fBufCur % alignment; + return (remainder == 0) ? 0 : (alignment - remainder); +} + +// Adjust the fBufCur +inline void XSerializeEngine::allignBufCur() +{ + fBufCur+=allignAdjust(); } /***
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]