90 lines
1.9 KiB
C++
Executable File
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;
|
|
}
|