提交 306974f5 编写于 作者: P Pieter Noordhuis

remove pop function and the sds dependency; can be implemented using get+delete

上级 4e16d8b3
......@@ -21,7 +21,6 @@
#include <assert.h>
#include <limits.h>
#include "zmalloc.h"
#include "sds.h"
#include "ziplist.h"
/* Important note: the ZIP_END value is used to depict the end of the
......@@ -382,30 +381,6 @@ unsigned char *ziplistPush(unsigned char *zl, unsigned char *s, unsigned int sle
return __ziplistInsert(zl,p,s,slen);
}
unsigned char *ziplistPop(unsigned char *zl, sds *target, int where) {
zlentry entry;
unsigned char *p;
long long value;
if (target) *target = NULL;
/* Get pointer to element to remove */
p = (where == ZIPLIST_HEAD) ? ZIPLIST_ENTRY_HEAD(zl) : ZIPLIST_ENTRY_TAIL(zl);
if (*p == ZIP_END) return zl;
entry = zipEntry(p);
if (target) {
if (entry.encoding == ZIP_ENC_RAW) {
*target = sdsnewlen(p+entry.headersize,entry.len);
} else {
value = zipLoadInteger(p+entry.headersize,entry.encoding);
*target = sdscatprintf(sdsempty(), "%lld", value);
}
}
zl = __ziplistDelete(zl,p,1);
return zl;
}
/* Returns an offset to use for iterating with ziplistNext. When the given
* index is negative, the list is traversed back to front. When the list
* doesn't contain an element at the provided index, NULL is returned. */
......@@ -644,12 +619,36 @@ void stress(int pos, int num, int maxsize, int dnum) {
}
}
void pop(unsigned char *zl, int where) {
unsigned char *p, *vstr;
unsigned int vlen;
long long vlong;
p = ziplistIndex(zl,where == ZIPLIST_HEAD ? 0 : -1);
if (ziplistGet(p,&vstr,&vlen,&vlong)) {
if (where == ZIPLIST_HEAD)
printf("Pop head: ");
else
printf("Pop tail: ");
if (vstr)
fwrite(vstr,vlen,1,stdout);
else
printf("%lld", vlong);
printf("\n");
ziplistDeleteRange(zl,-1,1);
} else {
printf("ERROR: Could not pop\n");
exit(1);
}
}
int main(int argc, char **argv) {
unsigned char *zl, *p;
unsigned char *entry;
unsigned int elen;
long long value;
sds s;
zl = createIntList();
ziplistRepr(zl);
......@@ -657,20 +656,16 @@ int main(int argc, char **argv) {
zl = createList();
ziplistRepr(zl);
zl = ziplistPop(zl, &s, ZIPLIST_TAIL);
printf("Pop tail: %s (length %ld)\n", s, sdslen(s));
pop(zl,ZIPLIST_TAIL);
ziplistRepr(zl);
zl = ziplistPop(zl, &s, ZIPLIST_HEAD);
printf("Pop head: %s (length %ld)\n", s, sdslen(s));
pop(zl,ZIPLIST_HEAD);
ziplistRepr(zl);
zl = ziplistPop(zl, &s, ZIPLIST_TAIL);
printf("Pop tail: %s (length %ld)\n", s, sdslen(s));
pop(zl,ZIPLIST_TAIL);
ziplistRepr(zl);
zl = ziplistPop(zl, &s, ZIPLIST_TAIL);
printf("Pop tail: %s (length %ld)\n", s, sdslen(s));
pop(zl,ZIPLIST_TAIL);
ziplistRepr(zl);
printf("Get element at index 3:\n");
......
......@@ -3,7 +3,6 @@
unsigned char *ziplistNew(void);
unsigned char *ziplistPush(unsigned char *zl, unsigned char *s, unsigned int slen, int where);
unsigned char *ziplistPop(unsigned char *zl, sds *target, int where);
unsigned char *ziplistIndex(unsigned char *zl, int index);
unsigned char *ziplistNext(unsigned char *zl, unsigned char *p);
unsigned char *ziplistPrev(unsigned char *zl, unsigned char *p);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册