cog/Libraries/MAC/Files/Source/Shared/CircleBuffer.cpp

90 lines
1.9 KiB
C++
Executable File

#include "All.h"
#include "CircleBuffer.h"
CCircleBuffer::CCircleBuffer()
{
m_pBuffer = NULL;
m_nTotal = 0;
m_nHead = 0;
m_nTail = 0;
m_nEndCap = 0;
m_nMaxDirectWriteBytes = 0;
}
CCircleBuffer::~CCircleBuffer()
{
SAFE_ARRAY_DELETE(m_pBuffer)
}
void CCircleBuffer::CreateBuffer(int nBytes, int nMaxDirectWriteBytes)
{
SAFE_ARRAY_DELETE(m_pBuffer)
m_nMaxDirectWriteBytes = nMaxDirectWriteBytes;
m_nTotal = nBytes + 1 + nMaxDirectWriteBytes;
m_pBuffer = new unsigned char [m_nTotal];
m_nHead = 0;
m_nTail = 0;
m_nEndCap = m_nTotal;
}
int CCircleBuffer::MaxAdd()
{
int nMaxAdd = (m_nTail >= m_nHead) ? (m_nTotal - 1 - m_nMaxDirectWriteBytes) - (m_nTail - m_nHead) : m_nHead - m_nTail - 1;
return nMaxAdd;
}
int CCircleBuffer::MaxGet()
{
return (m_nTail >= m_nHead) ? m_nTail - m_nHead : (m_nEndCap - m_nHead) + m_nTail;
}
int CCircleBuffer::Get(unsigned char * pBuffer, int nBytes)
{
int nTotalGetBytes = 0;
if (pBuffer != NULL && nBytes > 0)
{
int nHeadBytes = min(m_nEndCap - m_nHead, nBytes);
int nFrontBytes = nBytes - nHeadBytes;
memcpy(&pBuffer[0], &m_pBuffer[m_nHead], nHeadBytes);
nTotalGetBytes = nHeadBytes;
if (nFrontBytes > 0)
{
memcpy(&pBuffer[nHeadBytes], &m_pBuffer[0], nFrontBytes);
nTotalGetBytes += nFrontBytes;
}
RemoveHead(nBytes);
}
return nTotalGetBytes;
}
void CCircleBuffer::Empty()
{
m_nHead = 0;
m_nTail = 0;
m_nEndCap = m_nTotal;
}
int CCircleBuffer::RemoveHead(int nBytes)
{
nBytes = min(MaxGet(), nBytes);
m_nHead += nBytes;
if (m_nHead >= m_nEndCap)
m_nHead -= m_nEndCap;
return nBytes;
}
int CCircleBuffer::RemoveTail(int nBytes)
{
nBytes = min(MaxGet(), nBytes);
m_nTail -= nBytes;
if (m_nTail < 0)
m_nTail += m_nEndCap;
return nBytes;
}