循环缓冲区类

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值