一个循环缓冲区的实现类。
思路:分配一个固定缓冲区,利用缓冲区读写数据。当写到缓冲区底部而读指针不在缓冲区顶部时,则写指针移动到缓冲区顶部,继续写操作。
//InSream.h
#include <windows.h>
#pragma once
class InSream//循环堆栈
{
BYTE* pBuf;
BYTE* pReadCursor;
BYTE* pWriteCursor;
long nBufSize;
public:
InSream();
virtual ~InSream();
BOOL SetBufSize(UINT _size);
BOOL Create();
BYTE* GetBuf(){return pBuf;};
BYTE* GetReadCursor(){return pReadCursor;};
BYTE* GetWriteCursor(){return pWriteCursor;};
BOOL PushByte(BYTE* pData,long bufLen);
BOOL PopByte(BYTE* pData,long bufLen);
long GetDataLen();
};
//InSream.cpp
#include "stdafx.h"
#include "InStream.h"
//
// Construction/Destruction
//
InSream::InSream()
{
nBufSize=0;
pBuf=NULL;
pReadCursor=NULL;
pWriteCursor=NULL;
}
InSream::~InSream()
{
if(pBuf)free(pBuf);
}
InSream::SetBufSize(UINT _size)
{
if(nBufSize==0)
{
nBufSize=_size;
return true;
}
return false;
}
InSream::Create()
{
pBuf=new BYTE[nBufSize+1];
pReadCursor=pBuf;
pWriteCursor=pBuf;
return true;
}
BOOL InSream::PushByte(BYTE* pData,long bufLen)
{
if(nBufSize-GetDataLen()-bufLen<0)return false;//缓冲区满
long c=pWriteCursor-pReadCursor;
if(c<0)
{
long h=c-1;
if(h>=bufLen)
{
memcpy(pWriteCursor,pData,bufLen);
pWriteCursor+=bufLen;
return true;
}
return false;
}
if(c==0)//栈空
{
pWriteCursor=pBuf;
pReadCursor=pBuf;
memcpy(pWriteCursor,pData,bufLen);
pWriteCursor+=bufLen;
return true;
}
if(c>0)
{
long h=pBuf+nBufSize-pWriteCursor+1;
if(h>bufLen)
{
memcpy(pWriteCursor,pData,bufLen);
pWriteCursor+=bufLen;
return true;
}
if(h==bufLen)
{
memcpy(pWriteCursor,pData,bufLen);
pWriteCursor=pBuf;
return true;
}
if(h<bufLen)
{
memcpy(pWriteCursor,pData,h);
pData+=h;
bufLen-=h;
pWriteCursor=pBuf;
memcpy(pWriteCursor,pData,h);
pWriteCursor+=h;
return true;
}
}
return false;
}
BOOL InSream::PopByte(BYTE* pData,long bufLen)
{
if(bufLen==0)return true;
if(GetDataLen()<bufLen)return false;//缓冲区空
long c=pWriteCursor-pReadCursor;
if(c<0)
{
long h=pBuf+nBufSize-pReadCursor+1;
if(h>bufLen)
{
memcpy(pData,pReadCursor,bufLen);
pReadCursor+=bufLen;
return true;
}
if(h==bufLen)
{
memcpy(pData,pReadCursor,bufLen);
pReadCursor=pBuf;
return true;
}
if(h<bufLen)
{
memcpy(pData,pReadCursor,h);
pData+=h;
bufLen-=h;
pReadCursor=pBuf;
memcpy(pData,pReadCursor,bufLen);
pReadCursor+=bufLen;
return true;
}
}
if(c>0)
{
long h=c;
if(h>=bufLen)
{
memcpy(pData,pReadCursor,bufLen);
pReadCursor+=bufLen;
return true;
}
return false;
}
return false;
}
long InSream::GetDataLen()
{
long DateLen=pWriteCursor-pReadCursor;
if(DateLen<0)
{
DateLen=nBufSize-DateLen;
}
return DateLen;
}