Simple queue(SIMPLEQ)

キューは先に入れたデータが、先に出てくるデータ構造であり、First In, First Out(FIFO)と呼ばれる事もあります。また特殊なキューとして優先順位付きキュー[priority queue]などがあります。

Simple queueの構造
Simple queueの構造

SIMPLEQ 構造体の定義

SIMPLEQ構造を使用するには、まずSIMPLEQ形式のデータ構造を定義する必要があります。

SIMPLEQ_ENTRY(type)

SIMPLEQ_ENTRYはSIMPLEQ形式のデータ構造を定義します。 各エレメントに数字が1つだけ入っているSIMPLEQ構造、SimpleQを定義してみると、下記のようになります。

struct SimpleQ {
    SIMPLEQ_ENTRY(SimpleQ) squeue_ptr;
                int32_t data;
};	

これは、次のように展開されます。

struct SimpleQ {
    struct {
	struct SimpleQ *sqe_next;
    } squeue_ptr;
                       int32_t data;
};	

これは定義だけで、まだ実体は無いことに注意してください。

SIMPLEQ_HEAD(name, type)

SIMPLEQ_HEADは、エレメントの先頭アドレスが入る構造体を定義します。

SIMPLEQ_HEAD(SimpleQHead, SimpleQ);	

これは、次のように展開されます。

struct SimpleQHead { struct SimpleQ *sqh_first; struct SimpleQ **sqh_last; };	

これも定義だけで、まだ実体は無いことに注意してください。

SIMPLEQ 構造体の初期化

SIMPLEQ_HEAD_INITIALIZER(head)

SIMPLEQ_HEAD_INITIALIZERは、SIMPLEQ_HEADを初期化します。次のように使用します。

// SIMPLEQヘッダの実体を定義
struct SimpleQHead squeue_head = SIMPLEQ_HEAD_INITIALIZER(&squeue_head);	

SIMPLEQ_INIT(head)

SIMPLEQ_INITは、SIMPLEQを初期化します。次のように使用します。

if(!(SIMPLEQ_EMPTY(&squeue_head)))         // SIMPLEQが空であるかチェック
    SIMPLEQ_INIT(&squeue_head);            // SIMPLEQの初期化	

SIMPLEQ Access Methods

SIMPLEQ_FIRST(head)

SIMPLEQ_FIRSTは、SIMPLEQの先頭エレメントのポインタを返します。

arithmetic = SIMPLEQ_FIRST(&squeue_head);	

SIMPLEQ_END(head)

SIMPLEQ_ENDは、NULLを返します。

SIMPLEQ_EMPTY(head)

SIMPLEQ_EMPTYは、SIMPLEQが空か調べます。

SIMPLEQ_NEXT(elm, field)

SIMPLEQ_NEXTは、エレメント(elm)に連結されている次エレメントのポインタを返します。

arithmetic_next = SIMPLEQ_NEXT(arithmetic,squeue_ptr);	

SIMPLEQ Insert Methods

SIMPLEQ_INSERT_HEAD(head, elm, field)

SIMPLEQ_INSERT_HEADは、新しいエレメント(elm)をSIMPLEQ(head)の先頭に追加します。

for(i=0;i<5;i++){
    number[i].data = i;
    number[i].squeue_ptr.sqe_next = NULL;
}
SIMPLEQ_INSERT_HEAD(&squeue_head, &number[0], squeue_ptr); // 先頭に追加	

SIMPLEQ_INSERT_AFTER(head, listelm, elm, field)

SIMPLEQ_INSERT_AFTERは、指定したエレメント(listelm)の後に、新しいエレメント(elm)を追加します。

SIMPLEQ_INSERT_AFTER(&squeue_head,&number[0],&number[1],squeue_ptr); // 後ろに追加	

結果は次のようになります。

SIMPLEQ_INSERT_AFTERの結果
SIMPLEQ_INSERT_AFTERの結果

SIMPLEQ_INSERT_TAIL(head, elm, field)

SIMPLEQ_INSERT_TAILは、新しいエレメント(elm)をSIMPLEQ(head)の一番最後に追加します。

SIMPLEQ_INSERT_TAIL(&squeue_head,&number[2],squeue_ptr); // 最後に追加	

結果は次のようになります。

SIMPLEQ_INSERT_TAILの結果
SIMPLEQ_INSERT_TAILの結果

SIMPLEQ Loop Methods

SIMPLEQ_FOREACH(var, head, field)

SIMPLEQ_FOREACHは、headに格納されたエレメントを最初から終りまでループして、varにポインタを返します。

// エレメントの最初から終わりまでループ
SIMPLEQ_FOREACH(arithmetic, &squeue_head, squeue_ptr){
   printf("%d\n",arithmetic->data);
}	

結果は、下記のようになります。

0
1
2
      

SIMPLEQ Remove Methods

SIMPLEQ_REMOVE_HEAD(head, field)

SIMPLEQ_REMOVE_HEADは、SIMPLEQ(head)の先頭エレメントを削除します。

// エレメントが空になるまで削除します
while (SIMPLEQ_FIRST(&squeue_head))
    SIMPLEQ_REMOVE_HEAD(&squeue_head,squeue_ptr);	

SIMPLEQデータの操作sample

SIMPLEQデータの操作sampleです。

Last modified: Thu Jan 24 18:15:07 2008 JST