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