#ifndef _RingQueue_H_ #define _RingQueue_H_ #include <memory.h> template<class T, unsigned int MAX_LEN = 1024> class RingQueue { public://-----------------------------------------------------// 构造//----------------------------------------------------- RingQueue(){m_nHead = 0;m_nTail = 0;}//-----------------------------------------------------// 析构//-----------------------------------------------------~RingQueue(){}//-----------------------------------------------------// 重置,清空队列//-----------------------------------------------------void Reset(){m_nHead = 0;m_nTail = 0;}//-----------------------------------------------------// 取得最多读取个数//-----------------------------------------------------unsigned int GetMaxReadSize(){int size = (m_nTail - m_nHead + MAX_LEN) % MAX_LEN;return size;}//-----------------------------------------------------// 取得最多写入个数//-----------------------------------------------------unsigned int GetMaxWriteSize(){int size = (m_nHead - m_nTail + MAX_LEN - 1) % MAX_LEN; return size;}//-----------------------------------------------------// 添加数据//-----------------------------------------------------bool PushData(const T* pData, unsigned int nLength = 1){if (pData == nullptr || nLength > GetMaxWriteSize()){return false;}if (m_nTail + nLength <= MAX_LEN){memcpy(m_Buffer + m_nTail, pData, nLength * sizeof(T));m_nTail = (m_nTail + nLength) % MAX_LEN;}else{unsigned int size1 = MAX_LEN - m_nTail;unsigned int size2 = nLength - size1;memcpy(m_Buffer + m_nTail, pData, size1 * sizeof(T));memcpy(m_Buffer, pData+size1, size2 * sizeof(T));m_nTail = size2;}return true;}//-----------------------------------------------------// 取出并删除数据//-----------------------------------------------------bool PopData(T* pData, unsigned int nLength = 1){if (pData == nullptr || nLength > GetMaxReadSize() || nLength <= 0){return false;}if (m_nHead + nLength <= MAX_LEN){memcpy(pData, m_Buffer + m_nHead, nLength * sizeof(T));m_nHead = (m_nHead + nLength) % MAX_LEN;}else{unsigned int size1 = MAX_LEN - m_nHead;unsigned int size2 = nLength - size1;memcpy(pData, m_Buffer + m_nHead, size1 * sizeof(T));memcpy(pData + size1, m_Buffer, size2 * sizeof(T));m_nHead = size2;}return true;}//-----------------------------------------------------// 查看数据 不删除//-----------------------------------------------------bool PeekData(T* pData, unsigned int nLen){if (nLen > GetMaxReadSize() || nLen <= 0){return false;}if (m_nHead + nLen <= MAX_LEN){memcpy(pData, m_Buffer + m_nHead, nLen * sizeof(T));}else{unsigned int size1 = MAX_LEN - m_nHead;unsigned int size2 = nLen - size1;memcpy(pData, m_Buffer + m_nHead, size1 * sizeof(T));memcpy(pData + size1, m_Buffer, size2 * sizeof(T));}return true;}//-----------------------------------------------------// 删除数据//-----------------------------------------------------bool DeleteData(unsigned int nLen){if (nLen > GetMaxReadSize() || nLen <= 0){return false;}if (m_nHead + nLen <= MAX_LEN ){m_nHead = (m_nHead + nLen) % MAX_LEN;}else{m_nHead = nLen - (MAX_LEN - m_nHead);}return true;}public:T m_Buffer[MAX_LEN]; // 数据区 private:unsigned int m_nHead; // 队头unsigned int m_nTail; // 队尾 };#endif