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

📄 loopbuf.cpp

📁 一个虚拟内存组织的例子
💻 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 + -