Redisオープンソース読書ノート5(adlistモジュール)

3409 ワード

adlist機能特性
=="デュアルチェーンテーブルノード操作(ins,del,add,create,dup,release,search,rotate,index)をサポート
==』デュアルチェーンテーブルiter操作(get,release,rewind,next)をサポート
=="サポートリストとノードカスタマイズ操作(dup,free,match,prev,next,value)
adlist構造体
typedef struct listNode {     struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;
このチェーンテーブルノード構造体からadlistは二重チェーンテーブル操作のモジュールであることがわかる.
typedef struct listIter {     listNode *next;
    int direction;
} listIter;
これは何ですか.最初は本当に意味が分かりませんでしたが、コードの実装を見て、やっと悟りました.以前チェーンテーブルを見たことがありますが、自分で書いたこともありますが、この反復ノードポインタの機能は初めて見ました.
Unixの下のソフト接続の機能に似ているような気がしますが、もう少し徹底的にやれば、ハードリンクや引用カウントのような機能があるのがいいと思います.もちろん、これもいくつかの問題があります.似たような機能があれば、資源の解放が便利です.唯一の問題は、スレッドの安全を要求するにはロックを導入する必要があります.煩わしいのではないでしょうか.ここではしていません.思考を発散します.話題をそらさない.
主な操作は次のとおりです.
==》listIter *listGetIterator(list *list, int direction);
==》listNode *listNext(listIter *iter);
==》void listReleaseIterator(listIter *iter);
==》void listRewind(list *list, listIter *li);
==》void listRewindTail(list *list, listIter *li);
typedef struct list {     listNode *head;
    listNode *tail;
    void *(*dup)(void *ptr);
    void (*free)(void *ptr);
    int (*match)(void *ptr, void *key);
    unsigned long len;
} list;
ここでとてもおもしろくて、listも自分のdup、free、matchに対応する関数を加えました.オブジェクト向けプログラミングの考え方はこのadlistモジュールに統合され,listレプリケーション,破棄,検索の実現を容易にした.
adlist基本インタフェース
list *listCreate(void);
チェーンテーブルを作成し、空のポインタを返して失敗しました
void listRelease(list *list);
チェーンテーブルを解放し、解放中にlistのfree関数を用いて内部データをメモリ解放する.
list *listAddNodeHead(list *list, void *value);
チェーンテーブルの先端にvalueが指すノードを追加し、空のポインタを返すと失敗します.
list *listAddNodeTail(list *list, void *value);
チェーンテーブルの末尾にvalueが指すノードを追加し、空のポインタを返すと失敗します.
list *listInsertNode(list *list, listNode *old_node, void *value, int after);
afterの真値から判断するとold_Nodeの後ろまたは前にvalueが指すノードを追加し、空のポインタを返して失敗を示します.
void listDelNode(list *list, listNode *node);
リストのnodeノードを削除
listIter *listGetIterator(list *list, int direction);
iter反復ポインタを作成し、空のポインタを返すと失敗します.
listNode *listNext(listIter *iter);
反復ポインタ構成に基づいて、ステップ反復ポインタ
void listReleaseIterator(listIter *iter);
反復ポインタの解放
list *listDup(list *orig);
dupカスタム処理関数に基づいてlistのコピーを行い、空のポインタを返して失敗を表す
listNode *listSearchKey(list *list, void *key);
matchカスタム処理関数に基づいてlist検索keyコンテンツを行い、空のポインタを返すと失敗します
listNode *listIndex(list *list, long index);
ノード検索はindex番号に基づいて行い、index>=0順方向検索、index<0逆方向検索
void listRewind(list *list, listIter *li);
チェーンヘッダーへのiterの位置決め
void listRewindTail(list *list, listIter *li);
チェーンテーブルの末尾にiterを配置
void listRotate(list *list);
末尾ノードをチェーンヘッダーに移動
adlist基本マクロ操作
ノードのプライベート操作
#define listPrevNode(n) ((n)->prev)
#define listNextNode(n) ((n)->next)
#define listNodeValue(n) ((n)->value)

リストのプライベート操作
#define listLength(l) ((l)->len)
#define listFirst(l) ((l)->head)
#define listLast(l) ((l)->tail)

#define listSetDupMethod(l,m) ((l)->dup = (m))
#define listSetFreeMethod(l,m) ((l)->free = (m))
#define listSetMatchMethod(l,m) ((l)->match = (m))

#define listGetDupMethod(l) ((l)->dup)
#define listGetFree(l) ((l)->free)
#define listGetMatchMethod(l) ((l)->match)