diff options
author | jim <jim@13f79535-47bb-0310-9956-ffa450edef68> | 2014-05-27 14:20:29 +0000 |
---|---|---|
committer | jim <jim@13f79535-47bb-0310-9956-ffa450edef68> | 2014-05-27 14:20:29 +0000 |
commit | 89ee42db43a7687f7e029afd833476aa740928f2 (patch) | |
tree | 2c34fe57bac838c5699aca6ef10cbeec0e282459 /tables | |
parent | 6c97dbec19e44ecbd55f69b21c21816f40ec074a (diff) | |
download | libapr-89ee42db43a7687f7e029afd833476aa740928f2.tar.gz |
apr_skiplist_add()... idea from yann
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@1597797 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'tables')
-rw-r--r-- | tables/apr_skiplist.c | 44 |
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) { |