#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;}