This commit is contained in:
aixianling
2025-01-09 17:45:40 +08:00
commit 5c9f1dae4a
3482 changed files with 1146531 additions and 0 deletions

View File

@@ -0,0 +1,338 @@
#ifndef _DATA_PACKET_HPP_
#define _DATA_PACKET_HPP_
/***********************************************************************
<20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD>д<EFBFBD><D0B4>
ʵ<>ַ<EFBFBD>ʽ<EFBFBD><CABD>MemoryStream<61><6D>ͬ<EFBFBD><CDAC>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ʱ<EFBFBD><CAB1>д<EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ݵĿռ<D5BC><E4B3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20>ڴ<EFBFBD><DAB4><EFBFBD><E9B3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ档
<20><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʱͨ<CAB1><CDA8><EFBFBD>ڴ<EFBFBD><DAB4>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еģ<D0B5><C4A3><EFBFBD>ʹ<EFBFBD>ø<EFBFBD><C3B8><EFBFBD>Ч<EFBFBD>ʵ<EFBFBD><CAB5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0>е<EFBFBD><D0B5>ַ<EFBFBD><D6B7><EFBFBD>
<20><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD>ANSI<53>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Լ<EFBFBD>UNICODE16<31>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>д<EFBFBD><D0B4>
<20><><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ṹΪ<E1B9B9><CEAA>
[2<>ֽ<EFBFBD><D6BD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>][<5B>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>65536<33><36><EFBFBD><EFBFBD>][<5B>ַ<EFBFBD><D6B7><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 ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ָ<EFBFBD><D6B8>
* dwSize <20><><EFBFBD>ݵ<EFBFBD><DDB5>ֽڳ<D6BD><DAB3><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*<2A><>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊԭ<CEAA><D4AD><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>
* <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD>ǰ<EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><E9B3A4>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>setLengthһ<68><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><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 Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ڴ濪ʼ<E6BFAA><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>λ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ڴ濪ͷ<E6BFAA><CDB7>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ泤<DAB4>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ浽<DAB4><E6B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
*/
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;
}
/*
* <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><E5B3A4><EFBFBD>µĿ<C2B5><C4BF><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
*/
inline size_t getAvaliableBufLen()
{
return end_ptr_ - offset_;
}
public:
/*
* Comment: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_DPPACK_MEM_CHK_<4B><5F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @Return void:
*/
inline void _Assert()
{
#ifdef _DPPACK_MEM_CHK_
DbgAssert(!end_ptr_ || *(int*)end_ptr_ == 0xCCDDCCEE);
#endif
}
/*
* <20><><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>
* <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD>ʽΪ<CABD><CEAA>[2<>ֽ<EFBFBD><D6BD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>][<5B>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>65536<33><36><EFBFBD><EFBFBD>][<5B>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD>ַ<EFBFBD>0]<5D><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>65535<33><35><EFBFBD>IJ<EFBFBD><C4B2>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>֮ǰд<C7B0><D0B4>sizeof(TL)<29>ֽڵij<DAB5><C4B3><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ĩβд<CEB2><D0B4><EFBFBD><EFBFBD>ֹ<EFBFBD>ַ<EFBFBD>
* <TL> <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6>ַ<EFBFBD><D6B7><EFBFBD>Ӧ<EFBFBD><D3A6>Ϊunsigned char<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>unsigned short
* len <09><><EFBFBD><EFBFBD>ֵΪ-1<><31><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>str<74>ij<EFBFBD><C4B3><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