Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
306974f5
Commit
306974f5
authored
Jun 09, 2010
by
Pieter Noordhuis
Browse files
remove pop function and the sds dependency; can be implemented using get+delete
parent
4e16d8b3
Changes
2
Hide whitespace changes
Inline
Side-by-side
ziplist.c
View file @
306974f5
...
@@ -21,7 +21,6 @@
...
@@ -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
...
@@ -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) {
...
@@ -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) {
...
@@ -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
"
);
...
...
ziplist.h
View file @
306974f5
...
@@ -3,7 +3,6 @@
...
@@ -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
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment