在學習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