c++

头文件
#ifndef CSTATICFIFO_H_HEADER_INCLUDED_BE3589ED
#define CSTATICFIFO_H_HEADER_INCLUDED_BE3589ED


// This class implements a static FIFO queue with a specified length.
// The access operations are encapsulated.
//##ModelId=41CA3A9503E5
class CStaticFIFO
{
public:
//Constructure
//##ModelId=41CA3B6B0373
CStaticFIFO();

//Destructure
//##ModelId=41CA3B6B03C3
virtual ~CStaticFIFO();

// Push an item.
//##ModelId=41CA3B71014D
bool Push(int iItem);

// Pop an item.
//##ModelId=41CA3BC1033F
bool Pop(int* pItem);

// Reset the content.
//##ModelId=41CA3BE5014C
void Reset();

//Is the queue empty?
//##ModelId=41CFBFE6001E
bool IsEmpty();

//Set the capability.
//##ModelId=41CA55C7019A
void SetCapability(int iSize,int *pContent);
// Get the maximum of billing events.
//##ModelId=41D26AB40178
int get_m_iMaxPointer() const;


// Obtain the valid items list.
//##ModelId=41D26AF80356
void ViewItems(int* pViewBuff, int& nItems);

void setName(const char*);
protected:
// The name of this fifo
char m_sFifoName[32];
// The starting pointer.
//##ModelId=41CA3B2C00DD
int m_iStartPointer;

// The end pointer.
//##ModelId=41CA3B510092
int m_iEndPointer;

//The content offset.
//##ModelId=41CFBFE503CA
int m_pQueueOffset;

//The upper limit of pointer
//##ModelId=41CA55C700F0
int m_iMaxPointer;
private:
};


#endif /* CSTATICFIFO_H_HEADER_INCLUDED_BE3589ED */

源文件
#include <string.h>
#include <stdio.h>
#include "CStaticFIFO.h"

#define FESM_UNUSED_ID -1
//##ModelId=41CA3B6B0373
CStaticFIFO::CStaticFIFO()
{
m_iMaxPointer = 0;
m_iStartPointer = -1;
m_iEndPointer = -1;
}


//##ModelId=41CA3B6B03C3
CStaticFIFO::~CStaticFIFO()
{
}

//##ModelId=41CA3B71014D
bool CStaticFIFO::Push(int iItem)
{
int iIndex = m_iEndPointer;
int *m_pQueue = (int *)(((char*)(this) + m_pQueueOffset));
if(iIndex < (m_iMaxPointer - 1) )
{
iIndex++;
}
else
{
if(m_iStartPointer > 0)
{
iIndex = 0;
}
else
{
//Loging
return false;
}
}
if(m_pQueue[iIndex] == FESM_UNUSED_ID)
{
m_pQueue[iIndex] = iItem;
m_iEndPointer = iIndex;
return true;
}
else
{
//Loging
return false;
}
}

//##ModelId=41CA3BC1033F
bool CStaticFIFO::Pop(int* pItem)
{
int iIndex = m_iStartPointer;
if(iIndex < 0) iIndex = 0;
if(iIndex == m_iMaxPointer) iIndex = 0;
int *m_pQueue = (int *)((char*)(this) + m_pQueueOffset);
if( m_pQueue[iIndex] == FESM_UNUSED_ID )
{
*pItem = FESM_UNUSED_ID;
return false;
}
if( (iIndex > (m_iMaxPointer - 1)) || (iIndex < 0) )
{
return false;
}
*pItem = m_pQueue[iIndex];
m_pQueue[iIndex] = FESM_UNUSED_ID;
iIndex++;
//if(iIndex == m_iMaxPointer) iIndex = 0;
m_iStartPointer = iIndex;
return true;
}

//##ModelId=41CA3BE5014C
void CStaticFIFO::Reset()
{
m_iStartPointer = -1;
m_iEndPointer = -1;
int *m_pQueue = (int *)((char*)(this) + m_pQueueOffset);
for(int i = 0; i < m_iMaxPointer;i++)
{
m_pQueue[i] = FESM_UNUSED_ID;
}
}


//##ModelId=41CA55C7019A
void CStaticFIFO::SetCapability(int iSize,int *pContent)
{
m_iMaxPointer = iSize;
m_pQueueOffset = (char*)(pContent) - (char*)this;
Reset();
}

//##ModelId=41CFBFE6001E
bool CStaticFIFO::IsEmpty()
{
int iIndex = m_iStartPointer;
if(iIndex < 0) iIndex = 0;
if(iIndex == m_iMaxPointer) iIndex = 0;
int *m_pQueue = (int *)((char*)(this) + m_pQueueOffset);
if( m_pQueue[iIndex] != FESM_UNUSED_ID )
{
return false;
}
//Todo. Sanity checking
return true;
}

//##ModelId=41D26AB40178
int CStaticFIFO::get_m_iMaxPointer() const
{
return m_iMaxPointer;
}

//##ModelId=41D26AF80356
void CStaticFIFO::ViewItems(int* pViewBuff, int& nItems)
{
nItems = 0;
int *m_pQueue = (int *)((char*)(this) + m_pQueueOffset);
for(int i = 0; i < m_iMaxPointer; i++)
{
if( m_pQueue[i] != FESM_UNUSED_ID )
{
pViewBuff[nItems] = m_pQueue[i];
nItems++;
}
}
}

void CStaticFIFO::setName(const char* szStr)
{
#ifdef _DEBUG
memset(m_sFifoName,0,sizeof(m_sFifoName));
strcpy(m_sFifoName,"FIFO ");
strcat(m_sFifoName,szStr);
m_sFifoName[sizeof(m_sFifoName)-1] = '|';
#endif
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值