class CLoopBuffer
{
private:
char* m_pBegin;
char* m_pEnd;
char* m_pNextRead;
char* m_pNextWrite;
unsigned int m_nSize;
public:
CLoopBuffer()
: m_pBegin(NULL)
, m_pEnd(NULL)
, m_pNextRead(NULL)
, m_pNextWrite(NULL)
{}
~CLoopBuffer()
{
if (NULL != m_pBegin)
{
delete[] m_pBegin;
m_pBegin = NULL;
}
}
bool Init(unsigned int nSize)
{
m_pBegin = new char[nSize + 1];
if (NULL == m_pBegin)
return false;
m_pNextRead = m_pBegin;
m_pNextWrite = m_pBegin;
m_pEnd = m_pBegin + nSize + 1;
m_nSize = nSize;
return true;
}
size_t PushBack(const char* pData, size_t nLen)
{
if (m_pNextWrite > m_pNextRead)
{
size_t nRight = m_pEnd - m_pNextWrite;
size_t nLeft = m_pNextRead - m_pBegin;
if (nRight < nLen && nLeft + nRight <= nLen)
return -1;
}
else if (m_pNextWrite < m_pNextRead)
{
if (m_pNextRead <= m_pNextWrite + nLen) // 这里必须是 <= 避免被覆盖写
return -2;
}
if (m_pEnd > m_pNextWrite + nLen)
{
memcpy(m_pNextWrite, pData, nLen);
m_pNextWrite += nLen;
}
else if (m_pEnd == m_pNextWrite + nLen)
{
memcpy(m_pNextWrite, pData, nLen);
m_pNextWrite = m_pBegin;
}
else
{
size_t nStartLen = m_pEnd - m_pNextWrite;
memcpy(m_pNextWrite, pData, nStartLen);
memcpy(m_pBegin, pData + nStartLen, nLen - nStartLen);
m_pNextWrite = m_pBegin + nLen - nStartLen;
}
return nLen;
}
size_t PopFront(char* &pBuf, size_t nLen, char* szData)
{
pBuf = m_pNextRead;
if (m_pNextWrite == m_pNextRead)
return -1;
else if (m_pNextWrite > m_pNextRead)
{
if (m_pNextWrite < nLen + m_pNextRead)
return -2;
}
else
{
size_t nRight = m_pEnd - m_pNextRead;
size_t nLeft = m_pNextWrite - m_pBegin;
if (nRight < nLen && nLeft + nRight < nLen)
return -3;
}
if (m_pEnd > m_pNextRead + nLen)
{
memcpy(szData, m_pNextRead, nLen);
m_pNextRead += nLen;
}
else if (m_pEnd == m_pNextRead + nLen)
{
memcpy(szData, m_pNextRead, nLen);
m_pNextRead = m_pBegin;
}
else
{
size_t nStartLen = m_pEnd - m_pNextRead;
memcpy(szData, m_pNextRead, nStartLen);
memcpy(szData + nStartLen, m_pBegin, nLen - nStartLen);
m_pNextRead = m_pBegin + nLen - nStartLen;
}
return nLen;
}
};
环缓冲模拟实现
最新推荐文章于 2025-01-07 23:40:56 发布