⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buffertemplet.h

📁 游戏框架
💻 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 + -