📄 loopbuf.cpp
字号:
//********************************************************************************//
// 名称:环行缓冲区实现文件
// 功能:对实现环行缓冲区类和接口函数
// 作者:郭炜
// 时间:2000/3/22
// 版本:1.0
// 修改:
//
//
//********************************************************************************//
#include "loopbuf.h"
#include <prepc.h>
CLoopBuf::CLoopBuf()
{
WORD i;
m_nSize=0;
m_pWrite=m_pRead=&m_List[0];
for(i=0;i<MAX_LOOPBUF_NUM-1;i++)
{
m_List[i].nLen = 0;
m_List[i].pData = NULL;
m_List[i].next = &m_List[i+1];
}
m_List[i].nLen = 0;
m_List[i].pData = NULL;
m_List[i].next = &m_List[0];
}
CLoopBuf::CLoopBuf(WORD len)
{
WORD i;
m_nSize=len;
for( i=0;i<MAX_LOOPBUF_NUM-1;i++)
{
m_List[i].nLen = 0;
m_List[i].pData = new BYTE[len];
m_List[i].next = &m_List[i+1];
}
m_List[i].nLen = 0;
m_List[i].pData = new BYTE[len];
m_List[i].next = &m_List[0];
m_pWrite=m_pRead=&m_List[0];
}
void CLoopBuf::Init(WORD len)
{
WORD i;
m_nSize=len;
for( i=0;i<MAX_LOOPBUF_NUM;i++)
{
m_List[i].pData = new BYTE[len];
}
}
BOOL CLoopBuf::WriteElement( BYTE *buf, WORD len )
{
// check whether the loop is full
if( m_pWrite->next == m_pRead )
return FALSE;
// Check the validaty of parameter
if(len>m_nSize)
return FALSE;
// Set data validaty flag
m_pWrite->nFlag = USED;
// Set data length
m_pWrite->nLen = len;
// copy the data to buffer
memcpy( m_pWrite->pData, buf, len );
// move the write pointer
MoveWritePointer();
return TRUE;
}
WORD CLoopBuf::ReadElement( BYTE *buf, WORD len )
{
WORD length;
// check whether the loop is blank
if( m_pRead == m_pWrite )
return 0;
// check whether the current buffer has data.
if( m_pRead->nFlag== NOUSE || m_pRead->nLen <= 0 )
return 0;
// read the data
if(len>m_pRead->nLen)
{
memcpy( buf, m_pRead->pData, m_pRead->nLen );
length = m_pRead->nLen;
m_pRead->nLen=0;
m_pRead->nFlag = NOUSE;
m_pRead = m_pRead->next;
}
else
{
memcpy( buf, m_pRead->pData, len );
length = len;
m_pRead->nLen -= len;
if( m_pRead->nLen <= 0 )
m_pRead->nFlag = NOUSE;
}
return length;
}
BOOL CLoopBuf::MoveWritePointer()
{
if( m_pWrite->next == m_pRead )
return FALSE;
else
{
m_pWrite = m_pWrite->next;
return TRUE;
}
}
BOOL CLoopBuf::MoveReadPointer()
{
if( m_pWrite == m_pRead )
return FALSE;
else
{
m_pRead = m_pRead->next;
return TRUE;
}
}
BOOL CLoopBuf::HasData()
{
if( m_pWrite == m_pRead )
return FALSE;
else
return TRUE;
}
BOOL CLoopBuf::IsFull()
{
if( m_pWrite->next == m_pRead )
return TRUE;
else
return FALSE;
}
void CLoopBuf::Clear()
{
m_pWrite=m_pRead=&m_List[0];
for(WORD i=0;i<MAX_LOOPBUF_NUM;i++)
{
m_List[i].nLen = 0;
memset( m_List[i].pData, 0, m_nSize );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -