⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cyclebuf.cpp

📁 经常用到的 socketAPI
💻 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 + -