339 lines
7.9 KiB
C++
339 lines
7.9 KiB
C++
|
|
#ifndef _DATA_PACKET_HPP_
|
|||
|
|
#define _DATA_PACKET_HPP_
|
|||
|
|
/***********************************************************************
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
ʵ<EFBFBD>ַ<EFBFBD>ʽ<EFBFBD><EFBFBD>MemoryStream<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ʱ<EFBFBD><EFBFBD>д<EFBFBD>뵽<EFBFBD>ڴ<EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĿռ䳬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD>ڴ<EFBFBD><EFBFBD>鳤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ档
|
|||
|
|
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱͨ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еģ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ʵ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ANSI<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>UNICODE16<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ṹΪ<EFBFBD><EFBFBD>
|
|||
|
|
[2<EFBFBD>ֽ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>][<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>65536<EFBFBD><EFBFBD><EFBFBD><EFBFBD>][<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD>ַ<EFBFBD>0]
|
|||
|
|
|
|||
|
|
***********************************************************************/
|
|||
|
|
#include "os_def.h"
|
|||
|
|
#include "data_packet_reader.hpp"
|
|||
|
|
|
|||
|
|
class DataPacket : public DataPacketReader
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
/* д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* lpBuffer ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* dwSize <EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD>ֽڳ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
inline void writeBuf(const void* buf, size_t size)
|
|||
|
|
{
|
|||
|
|
size_t mem_size = end_ptr_ - offset_;
|
|||
|
|
|
|||
|
|
if (mem_size < size)
|
|||
|
|
{
|
|||
|
|
setSize(end_ptr_ - mem_ptr_ + size);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
memcpy(offset_, buf, size);
|
|||
|
|
offset_ += size;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>дָ<D0B4>볬<EFBFBD><EBB3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>Ϊ<EFBFBD><CEAA>дָ<D0B4><D6B8><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|||
|
|
if (offset_ > data_end_)
|
|||
|
|
data_end_ = offset_;
|
|||
|
|
}
|
|||
|
|
/* д<><D0B4>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* bool,char,short,int,__int64,float,double,void*<EFBFBD><EFBFBD>Щ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
template <typename T>
|
|||
|
|
inline void writeAtom(const T& data)
|
|||
|
|
{
|
|||
|
|
size_t mem_size = end_ptr_ - offset_;
|
|||
|
|
|
|||
|
|
if (mem_size < sizeof(data))
|
|||
|
|
{
|
|||
|
|
setSize(end_ptr_ - mem_ptr_ + sizeof(data));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
*(T*)offset_ = data;
|
|||
|
|
offset_ += sizeof(data);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>дָ<D0B4>볬<EFBFBD><EBB3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>Ϊ<EFBFBD><CEAA>дָ<D0B4><D6B8><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|||
|
|
if (offset_ > data_end_)
|
|||
|
|
data_end_ = offset_;
|
|||
|
|
}
|
|||
|
|
inline void writeString(const char* str, size_t len = -1)
|
|||
|
|
{
|
|||
|
|
rawWriteStringLen<unsigned short>(str, len);
|
|||
|
|
}
|
|||
|
|
inline void writeStringBuf(const char* str, size_t len = -1)
|
|||
|
|
{
|
|||
|
|
rawWriteStringLen<unsigned int>(str, len);
|
|||
|
|
}
|
|||
|
|
///* д<><D0B4>UNICODE16<31>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD><C8B1><EFBFBD><EFBFBD><EFBFBD>65536<33><36><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>65535<33>IJ<EFBFBD><C4B2>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ᱻд<E1B1BB>룩
|
|||
|
|
// * <20><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>֮ǰд<C7B0><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڵ<D6BD><DAB5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ĩβд<CEB2><D0B4><EFBFBD><EFBFBD>ֹ<EFBFBD>ַ<EFBFBD>
|
|||
|
|
// * len <20><><EFBFBD><EFBFBD>ֵΪ-1<><31><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>str<74>ij<EFBFBD><C4B3><EFBFBD>
|
|||
|
|
// */
|
|||
|
|
//inline void writeWideString(const char *str, size_t len = -1)
|
|||
|
|
//{
|
|||
|
|
// rawWriteWideStringLen<unsigned short>(str, len);
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
inline void setLength(size_t newLength)
|
|||
|
|
{
|
|||
|
|
if (newLength > (size_t)(end_ptr_ - mem_ptr_))
|
|||
|
|
setSize(newLength);
|
|||
|
|
|
|||
|
|
data_end_ = mem_ptr_ + newLength;
|
|||
|
|
|
|||
|
|
if (offset_ > data_end_)
|
|||
|
|
offset_ = data_end_;
|
|||
|
|
}
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD>ǰ<EFBFBD><C7B0>дλ<D0B4><CEBB><EFBFBD>ֽ<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ƫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD>ǰ<EFBFBD>ڴ<EFBFBD><EFBFBD>鳤<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>setLengthһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
inline size_t setPosition(size_t newPos)
|
|||
|
|
{
|
|||
|
|
size_t mem_size = end_ptr_ - mem_ptr_;
|
|||
|
|
|
|||
|
|
if (newPos > mem_size)
|
|||
|
|
setSize(newPos);
|
|||
|
|
|
|||
|
|
offset_ = mem_ptr_ + newPos;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>дָ<D0B4>볬<EFBFBD><EBB3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>Ϊ<EFBFBD><CEAA>дָ<D0B4><D6B8><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|||
|
|
if (offset_ > data_end_)
|
|||
|
|
data_end_ = offset_;
|
|||
|
|
|
|||
|
|
return newPos;
|
|||
|
|
}
|
|||
|
|
/* <20><><EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD><C7B0>дָ<D0B4><D6B8>ƫ<EFBFBD><C6AB>λ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
|
|||
|
|
* nOffsetToAdjust Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>ڴ濪ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>λ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ濪ͷ<EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ泤<EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ浽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
inline size_t adjustOffset(size_t adjust_offset)
|
|||
|
|
{
|
|||
|
|
offset_ += adjust_offset;
|
|||
|
|
|
|||
|
|
if (offset_ < mem_ptr_)
|
|||
|
|
offset_ = mem_ptr_;
|
|||
|
|
else if (offset_ > end_ptr_)
|
|||
|
|
setSize(offset_ - mem_ptr_);
|
|||
|
|
|
|||
|
|
if (offset_ > data_end_)
|
|||
|
|
data_end_ = offset_;
|
|||
|
|
|
|||
|
|
return offset_ - mem_ptr_;
|
|||
|
|
}
|
|||
|
|
inline size_t reserve(size_t newSize)
|
|||
|
|
{
|
|||
|
|
size_t Result = end_ptr_ - mem_ptr_;
|
|||
|
|
|
|||
|
|
if (Result < newSize)
|
|||
|
|
setSize(newSize);
|
|||
|
|
|
|||
|
|
return Result;
|
|||
|
|
}
|
|||
|
|
/*
|
|||
|
|
* <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>峤<EFBFBD><EFBFBD><EFBFBD>µĿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
inline size_t getAvaliableBufLen()
|
|||
|
|
{
|
|||
|
|
return end_ptr_ - offset_;
|
|||
|
|
}
|
|||
|
|
public:
|
|||
|
|
/*
|
|||
|
|
* Comment: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_DPPACK_MEM_CHK_<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>Խ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @Return void:
|
|||
|
|
*/
|
|||
|
|
inline void _Assert()
|
|||
|
|
{
|
|||
|
|
#ifdef _DPPACK_MEM_CHK_
|
|||
|
|
DbgAssert(!end_ptr_ || *(int*)end_ptr_ == 0xCCDDCCEE);
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
/*
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD>ֵ
|
|||
|
|
*/
|
|||
|
|
inline DataPacket& operator = (const DataPacket&)
|
|||
|
|
{
|
|||
|
|
//<2F><>ֹ<EFBFBD><D6B9><EFBFBD>ø<EFBFBD>ֵ<EFBFBD><D6B5>
|
|||
|
|
assert(false);
|
|||
|
|
}
|
|||
|
|
public:
|
|||
|
|
/* д<><D0B4>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
template <typename T>
|
|||
|
|
inline DataPacket& operator << (const T& val)
|
|||
|
|
{
|
|||
|
|
if (sizeof(val) <= sizeof(int))
|
|||
|
|
writeAtom<T>(val);
|
|||
|
|
else writeBuf(&val, sizeof(val));
|
|||
|
|
|
|||
|
|
return *this;
|
|||
|
|
}
|
|||
|
|
inline DataPacket& operator << (const char* val)
|
|||
|
|
{
|
|||
|
|
static const char* def = "";
|
|||
|
|
val ? writeString(val, strlen(val)) : writeString(def, strlen(def));
|
|||
|
|
return *this;
|
|||
|
|
}
|
|||
|
|
inline DataPacket& operator << (char* val)
|
|||
|
|
{
|
|||
|
|
static const char* def = "";
|
|||
|
|
val ? writeString(val, strlen(val)) : writeString(def, strlen(def));
|
|||
|
|
return *this;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
typedef DataPacketReader Inherited;
|
|||
|
|
|
|||
|
|
DataPacket()
|
|||
|
|
: Inherited()
|
|||
|
|
{
|
|||
|
|
allocator_ = NULL;
|
|||
|
|
alloc_count_ = 0;
|
|||
|
|
}
|
|||
|
|
DataPacket(const DataPacket&)
|
|||
|
|
{
|
|||
|
|
//Ϊ<>˷<EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD>ֵ<EFBFBD><D6B5>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>˴<F3A3ACB4><CBB4><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>
|
|||
|
|
assert(false);
|
|||
|
|
}
|
|||
|
|
DataPacket(void* buf, size_t size)
|
|||
|
|
: Inherited(buf, size)
|
|||
|
|
{
|
|||
|
|
data_end_ = mem_ptr_;
|
|||
|
|
allocator_ = NULL;
|
|||
|
|
alloc_count_ = 0;
|
|||
|
|
}
|
|||
|
|
DataPacket(BaseAllocator* allocator)
|
|||
|
|
: Inherited()
|
|||
|
|
{
|
|||
|
|
allocator_ = allocator;
|
|||
|
|
alloc_count_ = 0;
|
|||
|
|
}
|
|||
|
|
~DataPacket()
|
|||
|
|
{
|
|||
|
|
empty();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
|||
|
|
void empty()
|
|||
|
|
{
|
|||
|
|
if (mem_ptr_ && allocator_)
|
|||
|
|
{
|
|||
|
|
allocator_->FreeBuffer(mem_ptr_);
|
|||
|
|
mem_ptr_ = end_ptr_ = offset_ = data_end_ = NULL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
inline void setAllocSize(int size)
|
|||
|
|
{
|
|||
|
|
alloc_count_ = size;
|
|||
|
|
}
|
|||
|
|
// <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
inline void setAllocator(BaseAllocator* allocator)
|
|||
|
|
{
|
|||
|
|
allocator_ = allocator;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ڰ<EFBFBD><DAB0>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>Ŀǰ<C4BF>ĸ<EFBFBD>ʽд<CABD>뵽һ<EBB5BD><D2BB>buff, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵij<DDB5><C4B3><EFBFBD>
|
|||
|
|
static int writeString_s(char* buf, int maxLen, const char* str)
|
|||
|
|
{
|
|||
|
|
if (buf == NULL || maxLen < 3) return 0;
|
|||
|
|
|
|||
|
|
if (str == NULL) str = "";
|
|||
|
|
|
|||
|
|
int strLen = (int)strlen(str);
|
|||
|
|
|
|||
|
|
int cpyLen = __min(maxLen - 3, strLen);
|
|||
|
|
unsigned short* tmp = (unsigned short*)buf;
|
|||
|
|
*tmp = (unsigned short)cpyLen;
|
|||
|
|
memcpy(buf + 2, str, cpyLen);
|
|||
|
|
buf[cpyLen + 2] = 0;
|
|||
|
|
return cpyLen + 3;
|
|||
|
|
}
|
|||
|
|
protected:
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>趨<EFBFBD><E8B6A8><EFBFBD>ݰ<EFBFBD><DDB0>ڴ<EFBFBD><DAB4>ռ<EFBFBD><D5BC><EFBFBD>С */
|
|||
|
|
void setSize(size_t newSize)
|
|||
|
|
{
|
|||
|
|
char* old_mem = mem_ptr_;
|
|||
|
|
newSize += alloc_count_;
|
|||
|
|
//<2F>ڴ泤<DAB4>Ȱ<EFBFBD>CDataPacket::MemoryAlginmentSize<7A>ֽڶ<D6BD><DAB6><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ֹ<EFBFBD><D6B9><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ľ<EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD>
|
|||
|
|
//newSize = (newSize + MemoryAlginmentSize) & (~(MemoryAlginmentSize - 1));
|
|||
|
|
#ifdef _DPPACK_MEM_CHK_
|
|||
|
|
char* new_mem = (char*)allocator_->AllocBuffer(newSize + sizeof(int));
|
|||
|
|
#else
|
|||
|
|
char* new_mem = (char*)allocator_->AllocBuffer(newSize);
|
|||
|
|
#endif
|
|||
|
|
size_t offset = offset_ - mem_ptr_;
|
|||
|
|
size_t length = data_end_ - mem_ptr_;
|
|||
|
|
|
|||
|
|
if (length > 0)
|
|||
|
|
{
|
|||
|
|
memcpy(new_mem, mem_ptr_, __min(newSize, length));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
mem_ptr_ = new_mem;
|
|||
|
|
end_ptr_ = mem_ptr_ + newSize;
|
|||
|
|
#ifdef _DPPACK_MEM_CHK_
|
|||
|
|
*(int*)end_ptr_ = 0xCCDDCCEE;
|
|||
|
|
#endif
|
|||
|
|
offset_ = mem_ptr_ + offset;
|
|||
|
|
data_end_ = mem_ptr_ + length;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|||
|
|
if (old_mem)
|
|||
|
|
{
|
|||
|
|
_Assert();
|
|||
|
|
allocator_->FreeBuffer(old_mem);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* д<><D0B4>ANSI<53><49><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD>ʽΪ<EFBFBD><EFBFBD>[2<EFBFBD>ֽ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>][<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>65536<EFBFBD><EFBFBD><EFBFBD><EFBFBD>][<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD>ַ<EFBFBD>0]<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>65535<EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>֮ǰд<EFBFBD><EFBFBD>sizeof(TL)<EFBFBD>ֽڵij<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ĩβд<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD>ַ<EFBFBD>
|
|||
|
|
* <TL> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>Ϊunsigned char<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>unsigned short
|
|||
|
|
* len <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ-1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>str<EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
template <typename TL>
|
|||
|
|
void rawWriteStringLen(const char* str, size_t len)
|
|||
|
|
{
|
|||
|
|
if (!str) str = "";
|
|||
|
|
|
|||
|
|
if (len == ((size_t)-1))
|
|||
|
|
len = str ? (TL)strlen(str) : 0;
|
|||
|
|
else
|
|||
|
|
len = __min(len, strlen(str));
|
|||
|
|
|
|||
|
|
writeAtom<TL>((TL)len);//д<>볤<EFBFBD><EBB3A4>
|
|||
|
|
writeBuf(str, len * sizeof(*str));
|
|||
|
|
writeAtom<char>(0);//д<><D0B4><EFBFBD><EFBFBD>ֹ<EFBFBD>ַ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
///* д<><D0B4>UNICODE16<31><36><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// * <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rawWriteLengthString<6E><67>ͬ
|
|||
|
|
// */
|
|||
|
|
//template <typename TL>
|
|||
|
|
//void rawWriteWideStringLen(const char* str, size_t len)
|
|||
|
|
//{
|
|||
|
|
// if ( len == -1 )
|
|||
|
|
// len = str?(TL)wcslen(str):0;
|
|||
|
|
// writeAtom<TL>((TL)len);//д<>볤<EFBFBD><EBB3A4>
|
|||
|
|
// writeBuf(str, len * sizeof(*str));
|
|||
|
|
// writeAtom<char>(0);//д<><D0B4><EFBFBD><EFBFBD>ֹ<EFBFBD>ַ<EFBFBD>
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
BaseAllocator* allocator_; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int alloc_count_; // ÿ<><C3BF><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//private:
|
|||
|
|
// static const size_t MemoryAlginmentSize = 256; //<2F><><EFBFBD>ݰ<EFBFBD><DDB0>ڴ泤<DAB4>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD>߽<EFBFBD>
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|