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