📄 cyclebuf.cpp
字号:
// CycleBuf.cpp: implementation of the CCycleBuf class.
//
//////////////////////////////////////////////////////////////////////
#include "CycleBuf.h"
#include <iostream>
#include <utility>
//using namespace std;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
namespace mylib{
CCycleBuf::CCycleBuf(int Capacity):m_nCapacity(Capacity),m_nHead(0),m_nTail(0),m_buf(new char[Capacity])
{
}
CCycleBuf::CCycleBuf(const CCycleBuf &cyc)
{
m_nCapacity=cyc.m_nCapacity;
m_nHead=cyc.m_nHead;
m_nTail=cyc.m_nTail;
m_buf=new char[m_nCapacity];
memcpy(m_buf,cyc.m_buf,m_nCapacity);
}
CCycleBuf::~CCycleBuf()
{
delete []m_buf;
m_buf=0;
}
CCycleBuf& CCycleBuf::operator=(const CCycleBuf &cyc)
{
CCycleBuf temp(cyc);
Swap(temp);
return *this;
}
void CCycleBuf::Swap(CCycleBuf &cyc)
{
m_nCapacity=cyc.m_nCapacity;
m_nHead=cyc.m_nHead;
m_nTail=cyc.m_nTail;
std::swap(m_buf,cyc.m_buf);
}
int CCycleBuf::GetCapacity() const {return m_nCapacity;}
void CCycleBuf::Clear(){m_nTail=m_nHead;}
int CCycleBuf::GetUsedLen() const//head==tail表示清空,所以Input正好不能等于Capacity
{
if(m_nTail<m_nHead)
{
return m_nTail+m_nCapacity-m_nHead;
}
else
return m_nTail-m_nHead;
}
int CCycleBuf::GetFreeLen() const
{
return m_nCapacity - GetUsedLen();
}
bool CCycleBuf::Input(const char *BufIn,int len)
{
int nfreelen=GetFreeLen();
if(nfreelen<=0 || len<=0 || nfreelen<=len || len>=m_nCapacity)
return false;
for(int k=0;k<len;k++)
{
if(m_nTail<m_nCapacity)
{
memcpy(&m_buf[m_nTail],&BufIn[k],1);
m_nTail++;
}
else
{
m_nTail=0;
memcpy(&m_buf[m_nTail],&BufIn[k],1);
m_nTail++;
}
}
return true;
}
bool CCycleBuf::Output(char *BufOut,int len)
{
int nusedlen=GetUsedLen();
if(nusedlen<=0 || len<=0)
return false;
for(int k=0;k<nusedlen;k++)
{
if(m_nHead<m_nCapacity)
{
BufOut[k]=m_buf[m_nHead];
m_nHead++;
}
else
{
m_nHead=0;
BufOut[k]=m_buf[m_nHead];
m_nHead++;
}
}
return true;
}
bool CCycleBuf::Resize(int len)
{
if(len<=0)
return false;
if(len==m_nCapacity)
{
Clear();
return true;
}
//len<Capacity or len>Capacity
char *newbuf=new char[len];
memset(newbuf,0,len);
m_nCapacity=len;
delete []m_buf;
m_buf=newbuf;
Clear();
return true;
}
std::ostream& operator<< (std::ostream& os, const CCycleBuf& cyc)
{
if(cyc.GetUsedLen()==0)
{
os<<"empty buf!"<<std::endl;
return os;
}
os<<cyc.m_buf;
return os;
}
}//end of mylib
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -