summaryrefslogtreecommitdiff
path: root/tables
diff options
context:
space:
mode:
authorJim Jagielski <jim@apache.org>2014-05-27 14:20:29 +0000
committerJim Jagielski <jim@apache.org>2014-05-27 14:20:29 +0000
commite369495b297825ed267050c99cb74439f79bce90 (patch)
tree2c34fe57bac838c5699aca6ef10cbeec0e282459 /tables
parent165c734a447f99fc28885dbd66a6287d08b29f65 (diff)
downloadapr-e369495b297825ed267050c99cb74439f79bce90.tar.gz
apr_skiplist_add()... idea from yann
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1597797 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'tables')
-rw-r--r--tables/apr_skiplist.c44
1 files changed, 32 insertions, 12 deletions
diff --git a/tables/apr_skiplist.c b/tables/apr_skiplist.c
index effcf603b..a638a698a 100644
--- a/tables/apr_skiplist.c
+++ b/tables/apr_skiplist.c
@@ -339,16 +339,8 @@ APR_DECLARE(void *) apr_skiplist_previous(apr_skiplist *sl, apr_skiplistnode **i
return (*iter) ? ((*iter)->data) : NULL;
}
-APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert(apr_skiplist *sl, void *data)
-{
- if (!sl->compare) {
- return 0;
- }
- return apr_skiplist_insert_compare(sl, data, sl->compare);
-}
-
-APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert_compare(apr_skiplist *sl, void *data,
- apr_skiplist_compare comp)
+static apr_skiplistnode *insert_compare(apr_skiplist *sl, void *data,
+ apr_skiplist_compare comp, int replace)
{
apr_skiplistnode *m, *p, *tmp, *ret = NULL, **stack;
int nh = 1, ch, stacki;
@@ -406,11 +398,11 @@ APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert_compare(apr_skiplist *sl, vo
if (m->next) {
compared = comp(data, m->next->data);
}
- if (compared == 0) {
+ if (compared == 0 && replace) {
free(stack); /* OK. was malloc'ed */
return 0;
}
- if ((m->next == NULL) || (compared < 0)) {
+ if ( (compared < 0) || (replace && (m->next == NULL)) ) {
if (ch <= nh) {
/* push on stack */
stack[stacki++] = m;
@@ -470,6 +462,34 @@ APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert_compare(apr_skiplist *sl, vo
return ret;
}
+APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert(apr_skiplist *sl, void *data)
+{
+ if (!sl->compare) {
+ return 0;
+ }
+ return insert_compare(sl, data, sl->compare, 1);
+}
+
+APR_DECLARE(apr_skiplistnode *) apr_skiplist_add_compare(apr_skiplist *sl, void *data,
+ apr_skiplist_compare comp)
+{
+ return insert_compare(sl, data, comp, 0);
+}
+
+APR_DECLARE(apr_skiplistnode *) apr_skiplist_add(apr_skiplist *sl, void *data)
+{
+ if (!sl->compare) {
+ return 0;
+ }
+ return insert_compare(sl, data, sl->compare, 0);
+}
+
+APR_DECLARE(apr_skiplistnode *) apr_skiplist_insert_compare(apr_skiplist *sl, void *data,
+ apr_skiplist_compare comp)
+{
+ return insert_compare(sl, data, comp, 1);
+}
+
APR_DECLARE(int) apr_skiplist_remove(apr_skiplist *sl, void *data, apr_skiplist_freefunc myfree)
{
if (!sl->compare) {