?? xbytebuffer.cpp
字號:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "XByteBuffer.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
namespace zdhsoft
{
/*
////////////////////////////////////////////////////////////////////////////////
[Name]XByteBuffer
[Title]XByteBuffer的構造函數
////////////////////////////////////////////////////////////////////////////////
[Param]
<int default=XBYTE_BUFFER_MIN_BLOCK>iPrepareLength 初始要準備的空間
[Exception]
EOutOfMemory 如果申請內存,則拋出該異常
[Description]
構造函數,需要指定準備分配的空間的大小,默認為XBYTE_BUFFER_MIN_BLOCK
[Version]1.0
[Author]Rex Winter
[Date]2005-6-18
////////////////////////////////////////////////////////////////////////////////
*/
XByteBuffer::XByteBuffer(int iPrepareLength)
:m_DataSize(0),
m_Length(0),
m_Data(NULL)
{
iPrepareLength = PrepareLength(iPrepareLength);
m_Data = new XByte[iPrepareLength];
if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
m_DataSize = iPrepareLength;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]XByteBuffer
[Title]XByteBuffer的構造函數
////////////////////////////////////////////////////////////////////////////////
[Param]
<void *>aData 要被復制的數據
<int> aDataSize 要被復制的數據的字節數
<int default=XBYTE_BUFFER_MIN_BLOCK>iPrepareLength 初始要準備的空間
[Exception]
EOutOfMemory 如果申請內存,則拋出該異常
[Description]
構造函數,需要指定準備分配的空間的大小,默認為XBYTE_BUFFER_MIN_BLOCK
[Version]1.0
[Author]Rex Winter
[Date]2005-6-18
////////////////////////////////////////////////////////////////////////////////
*/
XByteBuffer::XByteBuffer(void * aData,int aDataSize,int iPrepareLength)
:m_DataSize(0),
m_Length(0),
m_Data(NULL)
{
iPrepareLength = PrepareLength( (iPrepareLength>aDataSize)?iPrepareLength:aDataSize );
m_Data = new XByte[iPrepareLength];
if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
m_DataSize = iPrepareLength;
if( aDataSize > 0 )
{
memcpy(m_Data,aData, aDataSize);
m_Length = aDataSize;
}
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]XByteBuffer
[Title]XByteBuffer的拷貝構造函數
////////////////////////////////////////////////////////////////////////////////
[Param]
<const XByteBuffer &>aBuffer 被復制的對象
[Exception]
EOutOfMemory 如果申請內存,則拋出該異常
[Description]
拷貝構造函數,分配的空間是實際需要的最小空間。
[Version]1.0
[Author]Rex Winter
[Date]2005-6-18
////////////////////////////////////////////////////////////////////////////////
*/
XByteBuffer::XByteBuffer(const XByteBuffer & aBuffer)
:m_DataSize(0),
m_Length(aBuffer.m_Length),
m_Data(NULL)
{
int iPrepareLength = PrepareLength(m_Length);
m_Data = new XByte[iPrepareLength];
if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
m_DataSize = iPrepareLength;
memcpy(m_Data,aBuffer.m_Data,m_Length);
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]XByteBuffer
[Title]XByteBuffer的析構函數
////////////////////////////////////////////////////////////////////////////////
[Param]
[Exception]
[Description]
析構函數
[Version]1.0
[Author]Rex Winter
[Date]2005-6-18
////////////////////////////////////////////////////////////////////////////////
*/
XByteBuffer::~XByteBuffer()
{
if( m_Data != NULL ) delete[] m_Data;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator[]
[Title]下標操作符
////////////////////////////////////////////////////////////////////////////////
[Param]
<int> Index 下標值
[Return]
<XByte &>返回XByte類型的引用
[Exception]
XExceptionArrayOutOfRange 如果下標越界,則拋出該異常
[Description]
下標操作符
[Version]1.0
[Author]Rex Winter
[Date]2005-6-21
////////////////////////////////////////////////////////////////////////////////
*/
XByte & XByteBuffer::operator[](int Index)
{
if( Index<0 || Index >= m_Length ) throw XExceptionArrayOutOfRange(Index, m_Length);
return m_Data[Index];
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator[]
[Title]下標操作符
////////////////////////////////////////////////////////////////////////////////
[Param]
<int> Index 下標值
[Return]
<const XByte &>返回XByte類型的引用
[Exception]
XExceptionArrayOutOfRange 如果下標越界,則拋出該異常
[Description]
下標操作符
[Version]1.0
[Author]Rex Winter
[Date]2005-6-21
////////////////////////////////////////////////////////////////////////////////
*/
const XByte & XByteBuffer::operator[] (int Index) const
{
if( Index<0 || Index >= m_Length ) throw XExceptionArrayOutOfRange(Index, m_Length);
return m_Data[Index];
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]expandCapacity
[Title]擴充緩沖區容量
////////////////////////////////////////////////////////////////////////////////
[Param]
<int> minimumCapacity 最小所需的容量
<bool default = true> 是否要copy原數據,true表示Copy原數據,false表示不再copy
[Return]
void
[Exception]
EOutOfMemory 如果申請緩沖區失敗,那么則拋出該異常
[Description]
擴充緩沖區容量,如果擴充前的數據是有用的,那么這些數據在擴充容量后Copy到新緩沖區中
[Version]1.0
[Author]Rex Winter
[Date]2005-6-21
////////////////////////////////////////////////////////////////////////////////
*/
void XByteBuffer::expandCapacity(int minimumCapacity,bool bCopyData)
{
int newCapacity = m_DataSize * 2;
if (newCapacity < 0) newCapacity = 0x7fffff;//最大32位正整數
else if (minimumCapacity > newCapacity) newCapacity = minimumCapacity;
int iPrepareLength = PrepareLength(newCapacity);
XByte * tmp = new XByte[iPrepareLength];
if( tmp == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
if( bCopyData )
{
if( m_Length > 0 ) memcpy(tmp, m_Data, m_Length);
}
else
{
m_Length = 0;
}
delete[] m_Data;
m_DataSize = iPrepareLength;
m_Data = tmp;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]operaotr=
[Title]緩沖區對象的賦值運算符
////////////////////////////////////////////////////////////////////////////////
[Param]
<const XByteBuffer &> aBuffer 賦值的目標緩沖區
[Return]
XByteBuffer & 當前對象的引用
[Exception]
EOutOfMemory 如果申請緩沖區失敗,那么則拋出該異常
[Description]
重載賦值操作,避免編譯器產生一個缺省的
[Version]1.0
[Author]Rex Winter
[Date]2005-6-21
////////////////////////////////////////////////////////////////////////////////
*/
XByteBuffer & XByteBuffer::operator=(const XByteBuffer & aBuffer)
{
if(this == &aBuffer) return * this;
if( aBuffer.m_Length > m_DataSize )
{
expandCapacity( aBuffer.m_Length ,false); //因為原有的數據全不要了,所以重新分配內存的時候,不需要再copy
}
memcpy(m_Data,aBuffer.m_Data,aBuffer.m_Length);
m_Length = aBuffer.m_Length;
return *this;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Clear
[Title]清空緩沖區的數據
////////////////////////////////////////////////////////////////////////////////
[Param]
<bool default = false> bFree 釋放現有緩沖區標志,如果為true表示釋放當前的緩沖區,否則不釋放
[Return]
void
[Exception]
EOutOfMemory 如果申請緩沖區失敗,那么則拋出該異常
[Description]
清空緩沖區的數據,如果bFree為true表示釋放當前緩沖區,并重新申請一塊緩沖區
[Version]1.0
[Author]Rex Winter
[Date]2005-6-21
////////////////////////////////////////////////////////////////////////////////
*/
void XByteBuffer::Clear(bool bFree)
{
if(bFree)
{
if( m_DataSize != XBYTE_BUFFER_MIN_BLOCK )
{
delete[] m_Data;
m_Data = new XByte[XBYTE_BUFFER_MIN_BLOCK];
if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
m_DataSize = XBYTE_BUFFER_MIN_BLOCK;
}
}
m_Length = 0;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Append...Array
[Title]向緩沖區中追加一個數組的元素
////////////////////////////////////////////////////////////////////////////////
[Param]
<const XArray<...>& > aArray 被追加的數組
或者是
<const XDynamicArray<...>& > aArray被追回的數組
[Return]
<XByteBuffer &>返回當前緩沖區的引用
[Exception]
EOutOfMemory 如果申請緩沖區失敗,那么則拋出該異常
[Description]
向緩沖區中追加一個數組的元素,這些方法包括
AppendByteArray,AppendCharArray ...等一組這樣的方法
[Version]1.0
[Author]Rex Winter
[Date]2005-6-21
////////////////////////////////////////////////////////////////////////////////
*/
XByteBuffer & XByteBuffer::AppendByteArray(const XArray<XByte> &aByteArray)
{
int ArrayLength = aByteArray.GetLength();
if( ArrayLength > 0 )
{
ensureCapacity( m_Length + ArrayLength );
XByte * dest = m_Data + m_Length;
const XByte * src = aByteArray.Data();
for(int i=0; i<ArrayLength; i++) *dest++ = *src++;
//這段匯編等同于上同的for,為了移植性,就不采用匯編了
// asm
// {
// mov ecx, ArrayLength
// mov ebx, src
// mov edx, dest
//
// @NEXT_COPY:
// cmp ecx,0
// jz near @COPY_OK
// mov al,byte ptr [ebx]
// mov byte ptr [edx],al
// inc ebx
// inc edx
// dec ecx
// jmp near @NEXT_COPY
//
// @COPY_OK:
// }
m_Length += ArrayLength;
}
return *this;
}
XByteBuffer & XByteBuffer::AppendCharArray(const XArray<XChar> &aCharArray)
{
int ArrayLength = aCharArray.GetLength();
if( ArrayLength > 0 )
{
ensureCapacity( m_Length + ArrayLength );
XByte * dest = m_Data + m_Length;
const XByte * src = (const XByte *)aCharArray.Data();
for(int i=0; i<ArrayLength; i++) *dest++ = *src++;
m_Length += ArrayLength;
}
return *this;
}
XByteBuffer & XByteBuffer::AppendBoolArray(const XArray<XBoolean> &aBoolArray)
{
int ArrayLength = aBoolArray.GetLength();
if( ArrayLength > 0 )
{
ensureCapacity( m_Length + ArrayLength );
XByte * dest = m_Data + m_Length;
const XBoolean * src = aBoolArray.Data();
for(int i=0; i<ArrayLength; i++)
{
if( *src ) *dest++ = 1;
else *dest++ = 0;
src++;
}
m_Length += ArrayLength;
}
return *this;
}
XByteBuffer & XByteBuffer::AppendBuffer(const XByteBuffer & aBuffer)
{
int ArrayLength = aBuffer.GetLength();
if( ArrayLength > 0 )
{
ensureCapacity( m_Length + ArrayLength );
XByte * dest = m_Data + m_Length;
const XByte * src = aBuffer.m_Data;
for(int i=0; i<ArrayLength; i++) *dest++ = *src++;
m_Length += ArrayLength;
}
return *this;
}
XByteBuffer & XByteBuffer::AppendShortArray(const XArray<XShort> &aShortArray)
{
int ArrayLength = aShortArray.GetLength();
if( ArrayLength > 0 )
{
ensureCapacity( m_Length + ArrayLength * 2 );
XByte * dest = m_Data + m_Length;
const XByte * src = (const XByte *)aShortArray.Data();
for(int i=0; i<ArrayLength; i++)
{
*dest++= *(src+1);
*dest++ = *src++;
src++;
}
m_Length += ArrayLength * 2;
}
return *this;
}
XByteBuffer & XByteBuffer::AppendWordArray(const XArray<XWord> &aWordArray)
{
int ArrayLength = aWordArray.GetLength();
if( ArrayLength > 0 )
{
ensureCapacity( m_Length + ArrayLength * 2 );
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -