1. 程式人生 > >redis list結構體中支援多種資料格式的實現

redis list結構體中支援多種資料格式的實現

redis在adlist.h中定義了雙向連結串列的資料結構

typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

typedef struct listIter {
    listNode *next;
    int direction;
} listIter;

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;
第一個定義了每一個節點的資料型別,前向指標後項指標和一個value,這個value定義成了void *的型別,使這個雙向連結串列的節點能夠儲存任意型別的資料,但是又涉及到一個問題,對不同型別進行相同的操作時(比如 複製,釋放,比較等等)的方法一定是不同的,這就出現了麻煩。所以在定義連結串列的結構時,結構體裡面除了必須的資料外,還有三個函式指標,真三個函式指標分別為複製,釋放和匹配,dup返回一個void型別的指標,當需要用到這些操作時,直接利用對應的函式指標就可以完成。
#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)
六個巨集定義的方法,設定和獲取當前連結串列使用的方法,真正的實現在函式m裡面