FILE : Redis/src/adlist.h
/* adlist.h 一个通用的双链表实现*/
#ifndef __ADLIST_H__
#define __ADLIST_H__
/* 实现这个链表只用三种数据结构: struct listNode, struct listIter, struct list */
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;
/* 宏函数(预处理时直接展开, 为了减少函数调用?) */
#define listLength(l) ((l)->len)
#define listFirst(l) ((l)->head)
#define listLast(l) ((l)->tail)
#define listPrevNode(n) ((n)->prev)
#define listNextNode(n) ((n)->next)
#define listNodeValue(n) ((n)->value)
#define listSetDupMethod(l,m) ((l)->dup = (m))
//设置回调函数 用于listDup(), 如果没设置list.dup, 直接浅拷贝
#define listSetFreeMethod(l,m) ((l)->free = (m))
//设置回调函数 用于删除节点时,释放listNode.value
#define listSetMatchMethod(l,m) ((l)->match = (m))
//设置回调函数 用于listSearchKey(list *list, void *key)
//如果没设置list.match, 直接比较 if (key == node->value){...}
#define listGetDupMethod(l) ((l)->dup)
#define listGetFree(l) ((l)->free)
#define listGetMatchMethod(l) ((l)->match)
/* Prototypes */
list *listCreate(void); //创建一个链表
void listRelease(list *list); //删除list这个数据结构
void listEmpty(list *list); //清除链表上的所有节点,完事了list是个空链表
list *listAddNodeHead(list *list, void *value); // 头插
list *listAddNodeTail(list *list, void *value); // 尾插
list *listInsertNode(list *list, listNode *old_node, void *value, int after);
//插入一个节点
//如果after = 0, 则在old_node之前插入, 否则在old_node之后插入
void listDelNode(list *list, listNode *node);
//删除一个节点
//如果 设置了list.free, 先用回调函数释放node.value
//再释放这个节点
listIter *listGetIterator(list *list, int direction);
//根据direction, 拿到list的一个迭代器
//direction = AL_START_HEAD, 迭代器指向head
//direction = AL_START_TAIL, 迭代器指向tail
listNode *listNext(listIter *iter);
//根据direction, 返回迭代器的下个节点
//direction = AL_START_HEAD, iter->next = iter->next->next
//direction = AL_START_TAIL, iter->next = iter->next->prev
void listReleaseIterator(listIter *iter); // 释放 struct listIter
list *listDup(list *orig);
//复制整个orig链表
//如果 设置了list.dup,则用这个回调函数复制每个node.value, 否则直接浅拷贝
//如果内存不足返回NULL, 否则返回复制出的链表的指针
listNode *listSearchKey(list *list, void *key);
//遍历整个链表,寻找匹配key的node
//如果 设置了list.match, 则用这个回调函数比较.否则直接比较if(key == node.value)
//如果存在这个样的节点,返回它的指针. 否则,返回NULL
listNode *listIndex(list *list, long index);
// 从head到tail,head下标是0,head->next()下标是1,如此类推
// 从tail到head,tail下标是-1,tail->prev()下标是-2,如此类推
//返回index下标对应的节点, 非法下标返回NULL
void listRewind(list *list, listIter *li);//给list创造一个迭代器,方向是从head到tail
void listRewindTail(list *list, listIter *li);//给list创造一个迭代器,方向是从tail到head
void listRotate(list *list); //把尾节点取下来,插到头结点前面,作为新的头结点
void listJoin(list *l, list *o); //将o链表的所有节点放到l链表后面,完事后o链表变成空链表
/*迭代器前进的方向(从head到tail, 还是反之) */
#define AL_START_HEAD 0
#define AL_START_TAIL 1
#endif /* __ADLIST_H__ */