/** @file MemNode.h
@brief 封装内存池的内存节点
* Copyright (c) 2007,第九城市游戏研发中心
* All rights reserved.
*
* 当前版本:
* 作 者:张少东
* 完成日期:2008-01-20
*
* 取代版本:
* 作 者:
* 完成日期:
*/
#ifndef MEMNODE_H
#define MEMNODE_H
#include
class CMemPool;
class CMemNode: public OVERLAPPED
{
public:
friend class CMemPool;
public:
virtual ~CMemNode(void);
public:
//把给定的数据放进缓冲区
void AddData(const char* const pData, size_t DataLen);
//获取缓冲区的已用大小
size_t GetUsedSize() const;
//获得缓冲区大小
size_t GetSize() const;
//获取数据指针
char* GetBufferPrt();
//设定要用的大小,一般和GetBufferPtr一起使用
void SetUseSize(size_t UseSize);
//设置、获取附加数据
size_t GetBufType() const {return m_BufType;}
void SetBufType(size_t BufType);
//分割Buf
CMemNode* SplitBuf(size_t RemoveDataLen);
//获取新的MemNode
CMemNode* NewMemNode();
//移除缓冲区中的部分数据
void RemoveData(size_t RomoveDataLen);
//增加一定数目的数据到给定的MemNode
void AddToMemNode(CMemNode* pToMemNode, size_t nAddDataLen);
//清空数据
void Empty();
//操作序列号
unsigned long GetSeqNum() const {return m_SeqNum;}
void SetSeqNum(unsigned long ulSeqNo);
public:
CMemNode* m_NextNode;
private:
//属于附加数据,标示这个数据节点的含义
size_t m_BufType;
const size_t m_BufSize; //缓冲区大小
size_t m_UsedSize; //已使用的大小
unsigned long m_SeqNum; //序列号
//long m_RefCount; //引用计数
CMemPool& m_MemPool; //内存池对象
#pragma warning(disable:4200) //禁掉0长度数组警告
char m_Data[0]; //数据指针, 必须是最后一个数据成员
private:
CMemNode(CMemPool& MemPool, size_t MemSize);
//此处也应该提供数据版本的new与delete
static void* operator new(size_t ObjSize, size_t BufSize);
static void operator delete(void* pObj, size_t BufSize);
//禁用Copy构造函数、赋值运算符
CMemNode(const CMemNode& );
CMemNode& operator=(const CMemNode&);
};
#endif