循环缓冲区类

来源:互联网 发布:财经数据接口 编辑:程序博客网 时间:2024/05/19 15:22

一个循环缓冲区的实现类。

思路:分配一个固定缓冲区,利用缓冲区读写数据。当写到缓冲区底部而读指针不在缓冲区顶部时,则写指针移动到缓冲区顶部,继续写操作。

//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;
}
 

原创粉丝点击