#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
?