mirror of
https://github.com/fluencelabs/redis
synced 2025-03-30 22:31:03 +00:00
remove pop function and the sds dependency; can be implemented using get+delete
This commit is contained in:
parent
4e16d8b312
commit
306974f5d7
63
ziplist.c
63
ziplist.c
@ -21,7 +21,6 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include "zmalloc.h"
|
#include "zmalloc.h"
|
||||||
#include "sds.h"
|
|
||||||
#include "ziplist.h"
|
#include "ziplist.h"
|
||||||
|
|
||||||
/* Important note: the ZIP_END value is used to depict the end of the
|
/* 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);
|
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
|
/* 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
|
* 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. */
|
* 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) {
|
int main(int argc, char **argv) {
|
||||||
unsigned char *zl, *p;
|
unsigned char *zl, *p;
|
||||||
unsigned char *entry;
|
unsigned char *entry;
|
||||||
unsigned int elen;
|
unsigned int elen;
|
||||||
long long value;
|
long long value;
|
||||||
sds s;
|
|
||||||
|
|
||||||
zl = createIntList();
|
zl = createIntList();
|
||||||
ziplistRepr(zl);
|
ziplistRepr(zl);
|
||||||
@ -657,20 +656,16 @@ int main(int argc, char **argv) {
|
|||||||
zl = createList();
|
zl = createList();
|
||||||
ziplistRepr(zl);
|
ziplistRepr(zl);
|
||||||
|
|
||||||
zl = ziplistPop(zl, &s, ZIPLIST_TAIL);
|
pop(zl,ZIPLIST_TAIL);
|
||||||
printf("Pop tail: %s (length %ld)\n", s, sdslen(s));
|
|
||||||
ziplistRepr(zl);
|
ziplistRepr(zl);
|
||||||
|
|
||||||
zl = ziplistPop(zl, &s, ZIPLIST_HEAD);
|
pop(zl,ZIPLIST_HEAD);
|
||||||
printf("Pop head: %s (length %ld)\n", s, sdslen(s));
|
|
||||||
ziplistRepr(zl);
|
ziplistRepr(zl);
|
||||||
|
|
||||||
zl = ziplistPop(zl, &s, ZIPLIST_TAIL);
|
pop(zl,ZIPLIST_TAIL);
|
||||||
printf("Pop tail: %s (length %ld)\n", s, sdslen(s));
|
|
||||||
ziplistRepr(zl);
|
ziplistRepr(zl);
|
||||||
|
|
||||||
zl = ziplistPop(zl, &s, ZIPLIST_TAIL);
|
pop(zl,ZIPLIST_TAIL);
|
||||||
printf("Pop tail: %s (length %ld)\n", s, sdslen(s));
|
|
||||||
ziplistRepr(zl);
|
ziplistRepr(zl);
|
||||||
|
|
||||||
printf("Get element at index 3:\n");
|
printf("Get element at index 3:\n");
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
unsigned char *ziplistNew(void);
|
unsigned char *ziplistNew(void);
|
||||||
unsigned char *ziplistPush(unsigned char *zl, unsigned char *s, unsigned int slen, int where);
|
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 *ziplistIndex(unsigned char *zl, int index);
|
||||||
unsigned char *ziplistNext(unsigned char *zl, unsigned char *p);
|
unsigned char *ziplistNext(unsigned char *zl, unsigned char *p);
|
||||||
unsigned char *ziplistPrev(unsigned char *zl, unsigned char *p);
|
unsigned char *ziplistPrev(unsigned char *zl, unsigned char *p);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user