头文件
源文件
#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
}