📄 buffertemplet.h
字号:
#include ".\stdafx.h"
#define DEFAULT_BUFFER_SIZE 255 // 缓冲区默认大小
template <class TYPE>
class CBufferTemplate{
private:
TYPE* m_pBufferTail; // 缓冲区尾指针
TYPE* m_pBuffer; // 缓冲区头指针
TYPE* m_pFront; // 头指针
TYPE* m_pTail; // 尾指针
DWORD m_dwCount; // 计数器
DWORD m_dwFullSize; // 缓冲区的总大小
DWORD m_dwTypeSize; // 类型结构大小
CThreadLock m_Lock; // 锁
public:
CBufferTemplate(DWORD dwBufferSize = 0);
~CBufferTemplate(void);
public:
void Push(const TYPE& Element); // 压栈
BOOL Pop(TYPE* Element); // 出栈
BOOL GetBuffer(TYPE* Elements,DWORD nSize = 0); // 获取缓冲区所有有效区域
BOOL IsEnmity(); // 判断当前缓冲区是否为空
DWORD GetCount(); // 返回当前缓冲区有效的区域个数
};
// 构造函数
template <class TYPE>
inline CBufferTemplate<TYPE>::CBufferTemplate(DWORD dwBufferSize){
if(dwBufferSize == 0) dwBufferSize = DEFAULT_BUFFER_SIZE;
m_pBuffer = new TYPE[dwBufferSize];
m_dwFullSize = dwBufferSize;
m_pFront = m_pTail = m_pBuffer;
m_pBufferTail = m_pBuffer + dwBufferSize - 1;
m_dwCount = 0;
m_dwTypeSize = sizeof(TYPE);
return;
}
// 释构函数
template <class TYPE>
inline CBufferTemplate<TYPE>::~CBufferTemplate(){
SafeDelete(m_pBuffer);
return;
}
// 插入缓冲区
template <class TYPE>
inline void CBufferTemplate<TYPE>::Push(const TYPE& Element){
// 写入数据
CopyMemory(m_pTail,&Element,m_dwTypeSize);
// 计数器
if(m_dwCount >=m_dwFullSize) m_dwCount = m_dwFullSize;
else m_dwCount++;
// 判断缓冲区是否达到最大容量
if(m_dwCount == m_dwFullSize){
if(m_pTail == m_pBufferTail){
m_pTail = m_pFront = m_pBuffer;
}else{
m_pTail++;
m_pFront++;
}
// 判断尾指针情况
}else if(m_pTail != m_pBufferTail){
m_pTail++;
}else if(m_pTail == m_pBufferTail){
m_pTail = m_pBuffer;
}
return;
}
// 提取缓冲队列元素
template <class TYPE>
inline BOOL CBufferTemplate<TYPE>::Pop(TYPE* Element){
// 缓冲区是否为空
if(IsEnmity()) return false;
m_Lock.Lock();
CopyMemory(Element,m_pFront,m_dwTypeSize);
m_Lock.UnLock();
// 计数器
m_dwCount--;
// 判断头指针情况
if(m_pFront != m_pBufferTail){
m_pFront++;
}else if(m_pFront == m_pBufferTail){
m_pFront = m_pBuffer;
}
return true;
}
// 获取缓冲区
template <class TYPE>
inline BOOL CBufferTemplate<TYPE>::GetBuffer(TYPE *Elements,DWORD nSize){
// 判断是否为空
if(IsEnmity())return false;
// 按照头指针与尾指针位置获取缓冲区所有有效值
if(m_pTail > m_pFront){
m_Lock.Lock();
CopyMemory(Elements,m_pFront,(m_pTail - m_pFront)*m_dwTypeSize);
m_Lock.UnLock();
}else{
m_Lock.Lock();
CopyMemory(Elements,m_pFront,(m_pBufferTail-m_pFront+1)*m_dwTypeSize);
CopyMemory(Elements + (m_pBufferTail-m_pFront+1),m_pBuffer,(m_pTail-m_pBuffer)*m_dwTypeSize);
m_Lock.UnLock();
}
// 重置缓冲区
m_dwCount = 0;
m_pFront = m_pTail = m_pBuffer;
return true;
}
// 判断是否未空
template <class TYPE>
inline BOOL CBufferTemplate<TYPE>::IsEnmity(){
if(m_dwCount == 0) return true;
return false;
}
// 返回缓冲区当前有效区域个数
template <class TYPE>
inline DWORD CBufferTemplate<TYPE>::GetCount(){
return m_dwCount;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -