在学习linux内核源码kfifo队列之际,自己用C++模板简单写了一个类似的队列,如下:
对linux内核的kfifo队列讲解详细可参考:Linux内核数据结构kfifo详解
#ifndef MFIFO_H
#define MFIFO_H
#include <iostream>
using namespace std;
template <class T>
class MFIFO
{
public:
MFIFO();
~MFIFO();
bool builtMfifo(unsigned int size);//建立队列
void inMfifo(T data); //入队列
void outMfifo(T *data); //出队列
void showMfifoState(void); //显示队列状态
void printMfifo(void); //打印队列
private:
T *queue;
unsigned int queue_size; //队列的大小
unsigned int in_count; //入队列游标
unsigned int out_count; //出队列游标
};
template <class T>
MFIFO<T>::MFIFO()
{
//初始化队列
queue=NULL;
queue_size=0;
in_count=0;
out_count=0;
}
template <class T>
MFIFO<T>::~MFIFO()
{
}
template <class T>
bool MFIFO<T>::builtMfifo(unsigned int size)
{
if(size==0)
{
queue=NULL;
return false;
}
else if((size&(size-1))==0) //若size大小已经是2的次幂就创建队列
{
queue=new T[size];
queue_size=size;
}
else
{
do
{
size++;
}while(((size&(size-1))!=0)); //如果size不是2的次幂,就向上增至2的次幂
queue=new T[size];
queue_size=size;
}
return true;
}
template <class T>
void MFIFO<T>::inMfifo(T data)
{
unsigned int left=0;
if(NULL==queue)
{
return;
}
else
{
left=queue_size-in_count+out_count;
if(left!=0)
{
cout<<"in data: "<<data<<endl;
queue[in_count&(queue_size-1)]=data;
in_count=(unsigned int)(in_count+1);
}
}
}
template <class T>
void MFIFO<T>::outMfifo(T *data)
{
unsigned int left=0;
if(NULL==queue)
{
return;
}
else
{
left=queue_size-in_count+out_count;
if(left!=queue_size)
{
*data=queue[out_count&(queue_size-1)];
out_count++;
}
}
}
template <class T>
void MFIFO<T>::showMfifoState()
{
if(NULL!=queue)
{
cout<<"queue_size: "<<queue_size<<endl;
cout<<"in_count: "<<in_count<<endl;
cout<<"out_count: "<<out_count<<endl;
cout<<"queue left: "<<queue_size-in_count+out_count<<endl<<endl;
}
}
template <class T>
void MFIFO<T>::printMfifo()
{
unsigned int i=out_count;
if(NULL!=queue)
{
for(i=out_count;i<in_count;i++)
{
cout<<i<<" : "<<queue[i]<<endl;
}
}
}
#endif // MFIFO_H