You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by pe...@apache.org on 2004/01/16 00:42:32 UTC
cvs commit: xml-xerces/c/src/xercesc/internal XSerializeEngine.cpp XSerializeEngine.hpp
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: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org