环缓冲模拟实现

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



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值