一个对大小固定的内存数据进行操作的简单类

#include "stdafx.h"
#include  <windows.h>


// 固定内存大小队列管理
class CFixedQueue
{
	public:
		enum FuncResult
		{
			ErrNull,		// 没有错误
			ErrInit,		// 初始化错误
			ErrParam,		// 参数错误
			ErrEmpty,		// 空的不能进行出队操作
			ErrFull,		// 满了不能进行入队
		};

	public :
		CFixedQueue();
		CFixedQueue(LPVOID lpData, int nElemSize, int nMaxNum);
		BOOL Attach(LPVOID lpData, int nElemSize, int nMaxNum);		// 对内存进行挂钩
		FuncResult Push(LPVOID lpElem);					// 压入数据
		FuncResult Pop(LPVOID lpData);					// 弹出数据
		int  GetElemTotalNum() const;					// 获取当前数据条数
		int  GetMaxNum() const;						// 获取数据最大存储条数
		BOOL IsFull() const;						// 数据是否已经存满
		BOOL IsEmpty() const;						// 数据是否为空
		BOOL IsValid() const;						// 数据空间是否有效
		void ClearAll();						// 清空

	protected:		
		void Init();
		LPBYTE m_pData;				// 数据起始指针
		int	   m_nMaxNum;			// 最大个数
		int    m_nBeginIndex;			// 起始偏移
		int    m_nCurNum;			// 当前成员个数
		int	   m_nElemSize;			// 每个成员大小
		BOOL   m_fgInit;			// 有没有初始化好
};




/************************************************************************/
/*                                                                      */
/************************************************************************/

CFixedQueue::CFixedQueue(LPVOID lpData, int nElemSize, int nMaxNum)
{
	Attach(lpData, nElemSize, nMaxNum);
}


CFixedQueue::CFixedQueue()
{
	Init();
}

void CFixedQueue::Init()
{
	m_pData = NULL;
	m_nElemSize = 0;
	m_nMaxNum = 0;
	m_nBeginIndex = 0;
	m_nCurNum = 0;
	m_fgInit = FALSE;
}

BOOL CFixedQueue::Attach(LPVOID lpData, int nElemSize, int nMaxNum)
{
	Init();
	if (lpData != NULL && nElemSize > 0 && nMaxNum > 0)
	{
		m_pData = (LPBYTE)lpData;
		m_nElemSize = nElemSize;
		m_nMaxNum = nMaxNum;
		m_fgInit = TRUE;
		return TRUE;
	}
	return FALSE;
}


CFixedQueue::FuncResult CFixedQueue::Push(LPVOID lpElem)
{
	if (NULL == lpElem)
	{
		return ErrParam;
	}

	if (!IsValid())
	{
		return ErrInit;
	}

	if (IsFull())
	{
		return ErrFull;
	}

	int nTempIndex = m_nBeginIndex + m_nCurNum;
	if (nTempIndex >= m_nMaxNum)
	{
		nTempIndex -= m_nMaxNum;
	}
	memcpy(m_pData+nTempIndex*m_nElemSize, lpElem, m_nElemSize);
	m_nCurNum++;	
	return ErrNull;
}



CFixedQueue::FuncResult CFixedQueue::Pop(LPVOID lpData)
{
	if (NULL == lpData)
	{
		return ErrParam;
	}

	if (!IsValid())
	{
		return ErrInit;
	}

	if (IsEmpty())
	{
		return ErrEmpty;
	}

	memcpy(lpData, m_pData+m_nBeginIndex*m_nElemSize, m_nElemSize);
	if (1 == m_nCurNum)
	{
		ClearAll();
	}
	else
	{	
		m_nCurNum--;
		m_nBeginIndex++;
		if (m_nBeginIndex >= m_nMaxNum)
		{
			m_nBeginIndex = 0;			
		}		
	}
	return ErrNull;
}

int CFixedQueue::GetElemTotalNum() const
{
	return m_nCurNum;
}

int CFixedQueue::GetMaxNum() const
{
	return m_nMaxNum;
}

BOOL CFixedQueue::IsFull() const
{
	return (m_fgInit && m_nMaxNum <= m_nCurNum);
}

BOOL CFixedQueue::IsEmpty() const
{
	return (m_nCurNum == 0);
}


BOOL CFixedQueue::IsValid() const
{
	return m_fgInit;
}

void CFixedQueue::ClearAll()
{
	m_nBeginIndex = 0;
	m_nCurNum = 0;
}


int _tmain(int argc, _TCHAR* argv[])
{
	int nData[5];	
	
	CFixedQueue fixQueue(nData, sizeof(nData[0]), 5);

	int nTmp;
	nTmp = 1;
	fixQueue.Push(&nTmp);

	nTmp = 2;
	fixQueue.Push(&nTmp);

	nTmp = 3;
	fixQueue.Push(&nTmp);

	nTmp = 4;
	fixQueue.Push(&nTmp);

	nTmp = 5;
	fixQueue.Push(&nTmp);

	if (CFixedQueue::ErrFull == fixQueue.Push(&nTmp))
	{
		printf("Error\n");
	}

	fixQueue.Pop(&nTmp);
	fixQueue.Pop(&nTmp);
	fixQueue.Pop(&nTmp);
	fixQueue.Pop(&nTmp);

	nTmp = 10;
	fixQueue.Push(&nTmp);

	nTmp = 11;
	fixQueue.Push(&nTmp);

	nTmp = 12;
	fixQueue.Push(&nTmp);

	nTmp = 13;
	fixQueue.Push(&nTmp);

	nTmp = 14;
	fixQueue.Push(&nTmp);

	nTmp = 15;
	fixQueue.Push(&nTmp);

	nTmp = 16;
	fixQueue.Push(&nTmp);

	fixQueue.Pop(&nTmp);

	//nTmp = 6;
	//fixQueue.Push(&nTmp);

	int i;
	int n = fixQueue.GetElemTotalNum();
	for (i=0; i<n; i++)
	{
		fixQueue.Pop(&nTmp);
		printf("%d\n", nTmp);
	}	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值