//初始化列表类型的迭代器为一个指定的下标 listTypeIterator *listTypeInitIterator(robj *subject, long index, unsigned char direction) { listTypeIterator *li = zmalloc(sizeof(listTypeIterator)); //分配空间 //设置迭代器的各个成员的初始值 li->subject = subject; li->encoding = subject->encoding; li->direction = direction; li->iter = NULL; //quicklist迭代器为空 /* LIST_HEAD means start at TAIL and move *towards* head. * LIST_TAIL means start at HEAD and move *towards tail. */ //获得迭代方向 int iter_direction = direction == LIST_HEAD ? AL_START_TAIL : AL_START_HEAD; //对列表对象编码为quicklist类型操作 if (li->encoding == OBJ_ENCODING_QUICKLIST) { //将迭代器和下标为index的quicklistNode结合,迭代器指向该节点 li->iter = quicklistGetIteratorAtIdx(li->subject->ptr, iter_direction, index); } else { serverPanic("Unknown list encoding"); } return li; }
/* Initialize an iterator at the specified index. */ listTypeIterator *listTypeInitIterator(robj *subject, long index, unsigned char direction) { listTypeIterator *li = zmalloc(sizeof(listTypeIterator)); li->subject = subject; li->encoding = subject->encoding; li->direction = direction; li->iter = NULL; /* LIST_HEAD means start at TAIL and move *towards* head. * LIST_TAIL means start at HEAD and move *towards tail. */ int iter_direction = direction == LIST_HEAD ? AL_START_TAIL : AL_START_HEAD; if (li->encoding == OBJ_ENCODING_QUICKLIST) { li->iter = quicklistGetIteratorAtIdx(li->subject->ptr, iter_direction, index); } else { serverPanic("Unknown list encoding"); } return li; }