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

📄 ringbuffer.cpp

📁 下棋
💻 CPP
字号:
// RingBuffer.cpp: implementation of the CRingBuffer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
//#include "PowerWatch.h"
#include "RingBuffer.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/***********************************************************************/
/*id=CRingBuffer													   */
/*func=创建一个指定大小循环缓冲区        						       */
/*format=CRingBuffer(DWORD nKB)                                        */
/*date=2000/9/21 xiepf;	                                               */
/***********************************************************************/
CRingBuffer::CRingBuffer()
{
	m_pBuffer=NULL;
	m_readPoint=m_writePoint=0;
	m_nSize=0;
	m_bFull=0;
	m_bLocked[0]=m_bLocked[1]=FALSE;
}

CRingBuffer::~CRingBuffer()
{
	Release();
}

/**********************************************************************/
/*id=Release													      */
/*func=释放所有资源’											      */
/*format=void Release()                                               */
/*io=                                                                 */
/*return=void                                                         */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/

void CRingBuffer::Release()
{
	 if(m_pBuffer) delete m_pBuffer;
	 m_readPoint=0;
	 m_writePoint=0;
	 m_bFull=0;
	 m_pBuffer=NULL;
}

/**********************************************************************/
/*id=Init													          */
/*func=初始化数据缓冲区,使用前必须调用							      */
/*format=BOOL Init()                                                  */
/*io=nKb:I:DWORD:Ring Buffer Size                                      */
/*return=TRUE:成功                                                    */
/*       FALSE:失败                                                   */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/

BOOL CRingBuffer::Init(DWORD nKb)
{
	 m_nSize=nKb*1024;
	 if(m_pBuffer) delete m_pBuffer;
     m_pBuffer=new BYTE[m_nSize];
	 if(m_pBuffer==NULL) return FALSE;
	 m_readPoint=0;
	 m_writePoint=0;
	 m_bFull=0;
	 return TRUE;
}

/**********************************************************************/
/*id=GetDataCount													  */
/*func=读取缓冲区中所有的数据长度							          */
/*format=DWORD GetDataCount()                                         */
/*io=                                                                 */
/*return=DWORD:数据长度                                               */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/


DWORD CRingBuffer::GetDataCount()
{
	 ASSERT(m_pBuffer!=NULL);
	 if(m_bFull) return m_nSize;
	 if(m_readPoint==m_writePoint) return 0;	 
	 if(m_writePoint>m_readPoint) return m_writePoint-m_readPoint;
	 else return m_writePoint+m_nSize-m_readPoint;;
}

/**********************************************************************/
/*id=IsFull													          */
/*func=检查缓冲区是否为‘满’							              */
/*format=BOOL IsFull()                                                */
/*io=                                                                 */
/*return=TRUE:缓冲区满                                                */
/*       FALSE:缓冲区不满                                             */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/

BOOL CRingBuffer::IsFull()
{
	 ASSERT(m_pBuffer!=NULL);
	 return m_bFull;
}

/**********************************************************************/
/*id=IsEmpty												          */
/*func=检查缓冲区是否为‘空’							              */
/*format=BOOL IsEmpty()                                               */
/*io=                                                                 */
/*return=TRUE:缓冲区空                                                */
/*       FALSE:缓冲区非空                                             */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/


BOOL CRingBuffer::IsEmpty()
{
	 ASSERT(m_pBuffer!=NULL);
	 if(m_bFull) return FALSE;
	 return m_readPoint==m_writePoint;
}

/**********************************************************************/
/*id=Reset													          */
/*func=复位缓冲区							                          */
/*format=void Reset()                                                 */
/*io=                                                                 */
/*return=void                                                         */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/


void CRingBuffer::Reset(DWORD nKb)
{
	ASSERT(m_pBuffer!=NULL);
	if(nKb>0) m_nSize=nKb*1024;
    m_readPoint=m_writePoint=0;
	m_bFull=FALSE;
	m_bLocked[0]=m_bLocked[1]=FALSE;
}

/**********************************************************************/
/*id=Read													          */
/*func=读取指定长度的数据并移动读指针                                 */
/*format=BOOL Read(LPBYTE pBuf,DWORD nLen)                            */
/*io=pBuf:O:LPBYTE:数据缓冲区地址                                     */
/*   nLen:I:DWORD:要读取的数据长度									  */
/*return=TRUE:成功                                                    */  
/*       FALSE:失败                                                   */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/

BOOL CRingBuffer::Read(LPBYTE pBuf, DWORD nLen)
{
	ASSERT(m_pBuffer!=NULL);
	if(nLen>GetDataCount()) return FALSE;
	ReadData(pBuf,nLen);
	m_readPoint+=nLen;
	m_bFull=0;
	if(m_readPoint>=m_nSize) m_readPoint-=m_nSize;
	return TRUE;
}

/**********************************************************************/
/*id=ReadData												          */
/*func=读取指定长度的数据(不移动读指针)			                      */
/*format=BOOL ReadData(LPBYTE pBuf,DWORD nLen)                        */
/*io=pBuf:O:LPBYTE:数据缓冲区地址                                     */
/*   nLen:I:DWORD:要读取的数据长度									  */
/*return=TRUE:成功                                                    */  
/*       FALSE:失败                                                   */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/

void CRingBuffer::ReadData(LPBYTE pBuf, int nLen)
{
    if(m_readPoint+nLen<m_nSize)
		memcpy(pBuf,m_pBuffer+m_readPoint,nLen);
	else
	{
		int nSize=m_nSize-m_readPoint;
		memcpy(pBuf,m_pBuffer+m_readPoint,nSize);
		memcpy(pBuf+nSize,m_pBuffer,nLen-nSize);
	}
}

/**********************************************************************/
/*id=GetFreeCount									                  */
/*func=取得剩余空间大小				                                  */
/*format=DWORD GetFreeCount()                                         */
/*io=                                                                 */
/*return=DWORD:空间大小字节数                                         */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/


DWORD CRingBuffer::GetFreeCount()
{
	ASSERT(m_pBuffer!=NULL);
	if(m_bFull) return 0;
	if(m_writePoint>=m_readPoint) return m_nSize+m_readPoint-m_writePoint;
	else return m_readPoint-m_writePoint;
}

/**********************************************************************/
/*id=Write													          */
/*func=写入指定长度的数据,并移动写指针                                */
/*format=BOOL Write(LPBYTE pBuf,DWORD nLen)                           */
/*io=pBuf:I:LPBYTE:数据缓冲区地址                                     */
/*   nLen:I:DWORD:要写入的数据长度									  */
/*return=TRUE:成功                                                    */  
/*       FALSE:失败                                                   */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/


BOOL CRingBuffer::Write(LPBYTE pBuf, DWORD nLen)
{
	ASSERT(m_pBuffer!=NULL);
    if(nLen>GetFreeCount()) return FALSE;
	if(m_writePoint+nLen<m_nSize) memcpy(m_pBuffer+m_writePoint,pBuf,nLen);
	else
	{
		int nSize=m_nSize-m_writePoint;
		memcpy(m_pBuffer+m_writePoint,pBuf,nSize);
		memcpy(m_pBuffer,pBuf+nSize,nLen-nSize);
	}
	m_writePoint+=nLen;
	if(m_writePoint>m_nSize) m_writePoint-=m_nSize;
	m_bFull=(m_writePoint==m_readPoint);
	return TRUE;
}

/**********************************************************************/
/*id=GetData													      */
/*func=读取指定长度的数据(不移动写指针)	                              */
/*format=BOOL GetData(LPBYTE pBuf,DWORD nLen)                         */
/*io=pBuf:O:LPBYTE:数据缓冲区地址                                     */
/*   nLen:I:DWORD:要读取的数据长度									  */
/*return=TRUE:成功                                                    */  
/*       FALSE:失败                                                   */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/


BOOL CRingBuffer::GetData(LPBYTE pBuf, DWORD nLen)
{
	ASSERT(m_pBuffer!=NULL);
	if(nLen>GetDataCount()) return FALSE;
	ReadData(pBuf,nLen);
	return TRUE;
}

/**********************************************************************/
/*id=CanWrite												          */
/*func=测试缓冲区是否有足够空间可以写入指定长度的数据                 */
/*format=BOOL CanWrite(DWORD nLen)                                    */
/*io=nLen:I:DWORD:要写入的数据长度									  */
/*return=TRUE:可以                                                    */  
/*       FALSE:不行                                                   */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/


BOOL CRingBuffer::CanWrite(DWORD nLen)
{
	ASSERT(m_pBuffer!=NULL);
	return GetFreeCount()>=nLen;
}

/**********************************************************************/
/*id=CanRead												          */
/*func=测试缓冲区是否有足够数据可读                                   */
/*format=BOOL CanRead(DWORD nLen)                                     */
/*io=nLen:I:DWORD:要读取的数据长度									  */
/*return=TRUE:可以                                                    */  
/*       FALSE:不行                                                   */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/


BOOL CRingBuffer::CanRead(DWORD nLen)
{
	ASSERT(m_pBuffer!=NULL);
    return GetDataCount()>=nLen;
}

/**********************************************************************/
/*id=Skip												              */
/*func=跳过指定长度的数据(移动读指针,负数则恢复,不能为零)           */
/*format=BOOL Skip(int nLen)                                          */
/*io=nLen:I:int:要跳过的数据长度									  */
/*return=TRUE:成功                                                    */  
/*       FALSE:失败                                                   */
/*date=2000/9/21 xiepf	                                              */
/**********************************************************************/


BOOL CRingBuffer::Skip(int nLen)
{
	ASSERT(m_pBuffer!=NULL);
	if(nLen==0) return FALSE;
	if(nLen>0)
	{
	   if((DWORD)nLen>GetDataCount()) return FALSE;
	   m_readPoint+=nLen;
	   if(m_readPoint>=m_nSize) m_readPoint-=m_nSize;
	}
	else
	{
	   if((DWORD)-nLen>GetFreeCount()) return FALSE;
	   if(m_readPoint>(DWORD)-nLen)  m_readPoint+=nLen;
	   else m_readPoint+=(m_nSize+nLen);	   
	}
	return TRUE;
}

BOOL CRingBuffer::IsLocked()
{
	return m_bLocked[0]&&m_bLocked[1];
}

void CRingBuffer::Lock(BOOL bLock)
{
	if(bLock)
	{
	   if(!m_bLocked[0]) m_bLocked[0]=1;
	   else if(!m_bLocked[1]) m_bLocked[1]=1;
	}
	else
	{
	   if(m_bLocked[0]) m_bLocked[0]=0;
	   else if(m_bLocked[1]) m_bLocked[1]=0;
	}
}

BOOL CRingBuffer::WriteToFile(CFile &file, DWORD nLen)
{
	ASSERT(m_pBuffer!=NULL);
	if(nLen>GetDataCount()) return FALSE;
	TRY
	{
		if(m_readPoint+nLen<m_nSize)
			file.Write(m_pBuffer+m_readPoint,nLen);
		else
		{
			int nSize=m_nSize-m_readPoint;
			file.Write(m_pBuffer+m_readPoint,nSize);
			file.Write(m_pBuffer,nLen-nSize);
		}	
	}CATCH(CFileException,e)
	{
		return FALSE;
	}END_CATCH;
	m_readPoint+=nLen;
	m_bFull=0;
	if(m_readPoint>=m_nSize) m_readPoint-=m_nSize;
	return TRUE;    
}

BOOL CRingBuffer::WriteToFile(CFile &file)
{
    DWORD nLen=GetDataCount();
	if(nLen==0) return FALSE;
	TRY
	{
		if(m_readPoint+nLen<m_nSize)
			file.Write(m_pBuffer+m_readPoint,nLen);
		else
		{
			int nSize=m_nSize-m_readPoint;
			file.Write(m_pBuffer+m_readPoint,nSize);
			file.Write(m_pBuffer,nLen-nSize);
		}
	}CATCH(CFileException,e)
	{
		return FALSE;
	}END_CATCH;
	m_readPoint=m_writePoint;
	m_bFull=0;
	return TRUE;
}

BOOL CRingBuffer::ReadFromFile(CFile &file, DWORD nLen)
{
   DWORD nFree=GetFreeCount();
   if(nFree<nLen) return FALSE;
   TRY
   {
	  if(m_writePoint+nLen<m_nSize) 
		  file.Read(m_pBuffer+m_writePoint,nLen);
	  else
	  {
		int nSize=m_nSize-m_writePoint;
		file.Read(m_pBuffer+m_writePoint,nSize);
		file.Read(m_pBuffer,nLen-nSize);
	  }
   }
   CATCH(CFileException,e)
   {
   }END_CATCH;   
   m_writePoint+=nLen;
   if(m_writePoint>m_nSize) m_writePoint-=m_nSize;
   m_bFull=(m_writePoint==m_readPoint);
   return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -