diff options
author | Paul J Stevens <paul@nfg.nl> | 2010-08-10 14:59:00 +0200 |
---|---|---|
committer | Paul J Stevens <paul@nfg.nl> | 2010-08-10 14:59:00 +0200 |
commit | e10a61a4589b9c2bdfc6db3603f7a510e62e6887 (patch) | |
tree | 067ac2faff54af6cb77c13d64454420a39003af6 | |
parent | 385c3feeb4c0db62c842fc63c78de38c901fa227 (diff) |
small sset api change
-rw-r--r-- | src/dm_sset.c | 28 | ||||
-rw-r--r-- | src/dm_sset.h | 5 | ||||
-rw-r--r-- | test/check_dbmail_sset.c | 21 |
3 files changed, 29 insertions, 25 deletions
diff --git a/src/dm_sset.c b/src/dm_sset.c index 403959f0..ed7bb7a8 100644 --- a/src/dm_sset.c +++ b/src/dm_sset.c @@ -18,8 +18,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <string.h> #include <stdlib.h> -#include <search.h> #include <assert.h> #include <glib.h> @@ -36,19 +36,26 @@ struct T { void *root; int (*cmp)(const void *, const void *); - int len; size_t size; // sizeof key + void (*free)(void *); }; -T Sset_new(int (*cmp)(const void *a, const void *b), size_t size) +static int compare_data(void *a, void *b, void *c) +{ + T S = (T)c; + return S->cmp(a, b); +} + +T Sset_new(int (*cmp)(const void *a, const void *b), size_t size, void (*free)(void *)) { T S; assert(size > 0); S = calloc(1, sizeof(*S)); - S->root = (void *)g_tree_new((GCompareFunc)cmp); + S->root = (void *)g_tree_new_full((GCompareDataFunc)compare_data, S, free, NULL); S->cmp = cmp; S->size = size; + S->free = free; return S; } @@ -69,12 +76,11 @@ int Sset_len(T S) return g_tree_nnodes((GTree *)S->root); } -void * Sset_del(T S, const void * a) +void Sset_del(T S, const void * a) { void * t = NULL; if ((t = g_tree_lookup((GTree *)S->root, a)) != NULL) g_tree_remove((GTree *)S->root, a); - return t; } struct mapper_data { @@ -110,7 +116,7 @@ void Sset_free(T *S) static int sset_copy(void *a, void *c) { T t = (T)c; - if (! Sset_has(c, a)) { + if (! Sset_has(t, a)) { void * item = malloc(t->size); memcpy(item, (const void *)a, t->size); Sset_add(t, item); @@ -120,7 +126,7 @@ static int sset_copy(void *a, void *c) T Sset_or(T a, T b) // a + b { - T c = Sset_new(a->cmp, a->size); + T c = Sset_new(a->cmp, a->size, a->free?a->free:free); Sset_map(a, sset_copy, c); Sset_map(b, sset_copy, c); @@ -148,7 +154,7 @@ static int sset_match_and(void *a, void *c) T Sset_and(T a, T b) // a * b { - T c = Sset_new(a->cmp, a->size); + T c = Sset_new(a->cmp, a->size, a->free?a->free:free); T s; struct sset_match_helper h; if (Sset_len(a) < Sset_len(b)) { @@ -180,7 +186,7 @@ static int sset_match_not(void *a, void *c) T Sset_not(T a, T b) // a - b { - T c = Sset_new(a->cmp, a->size); + T c = Sset_new(a->cmp, a->size, a->free?a->free:free); struct sset_match_helper h; h.o = c; @@ -192,7 +198,7 @@ T Sset_not(T a, T b) // a - b T Sset_xor(T a, T b) // a / b { - T c = Sset_new(a->cmp, a->size); + T c = Sset_new(a->cmp, a->size, a->free?a->free:free); struct sset_match_helper h; h.o = c; diff --git a/src/dm_sset.h b/src/dm_sset.h index 1bba5eec..c2a2e540 100644 --- a/src/dm_sset.h +++ b/src/dm_sset.h @@ -25,7 +25,6 @@ * Universe */ -#include <string.h> #ifndef SSET_H #define SSET_H @@ -34,11 +33,11 @@ typedef struct T *T; -extern T Sset_new(int (*cmp)(const void *, const void *), size_t); +extern T Sset_new(int (*cmp)(const void *, const void *), size_t, void (*free)(void *)); extern int Sset_has(T, const void *); extern void Sset_add(T, const void *); extern int Sset_len(T); -extern void * Sset_del(T, const void *); +extern void Sset_del(T, const void *); extern void Sset_map(T, int (*func)(void *, void *), void *); extern void Sset_free(T *); diff --git a/test/check_dbmail_sset.c b/test/check_dbmail_sset.c index 9623a47f..985a205a 100644 --- a/test/check_dbmail_sset.c +++ b/test/check_dbmail_sset.c @@ -90,18 +90,19 @@ void setup(void) { configure_debug(255,0); config_read(configFile); - V = Sset_new(compare, sizeof(struct item)); - W = Sset_new(compare, sizeof(struct item)); + V = Sset_new(compare, sizeof(struct item), NULL); + W = Sset_new(compare, sizeof(struct item), NULL); } void teardown(void) { Sset_free(&V); + Sset_free(&W); } START_TEST(test_sset_add) { - int i, n = 1000000; + int i, n = 10000; struct item *t, *k; start_clock(); @@ -122,7 +123,7 @@ END_TEST START_TEST(test_sset_del) { - int i, n = 1000000; + int i, n = 10000; struct item p, *t, *k; t = k = malloc(sizeof(struct item) * n); @@ -150,7 +151,7 @@ END_TEST START_TEST(test_sset_or) { - long long int i, n = 1000000; + long long int i, n = 10000; struct item *t, *k, *l; t = k = malloc(sizeof(struct item) * n); @@ -183,7 +184,7 @@ END_TEST START_TEST(test_sset_and1) { - long long int i, n = 1000000; + long long int i, n = 10000; struct item *t, *k, *l; k = malloc(sizeof(struct item) * n); @@ -216,7 +217,7 @@ END_TEST START_TEST(test_sset_and2) { - long long int i, n = 1000000; + long long int i, n = 10000; struct item *t, *k, *l; k = malloc(sizeof(struct item) * n); @@ -249,7 +250,7 @@ END_TEST START_TEST(test_sset_not) { - long long int i, n = 1000000; + long long int i, n = 10000; struct item *t, *k, *l; k = malloc(sizeof(struct item) * n); @@ -282,7 +283,7 @@ END_TEST START_TEST(test_sset_xor) { - long long int i, n = 1000000; + long long int i, n = 10000; struct item *t, *k, *l; k = malloc(sizeof(struct item) * n); @@ -324,14 +325,12 @@ Suite *dbmail_sset_suite(void) tcase_add_checked_fixture(tc_sset, setup, teardown); tcase_add_test(tc_sset, test_sset_add); - /* tcase_add_test(tc_sset, test_sset_del); tcase_add_test(tc_sset, test_sset_or); tcase_add_test(tc_sset, test_sset_and1); tcase_add_test(tc_sset, test_sset_and2); tcase_add_test(tc_sset, test_sset_not); tcase_add_test(tc_sset, test_sset_xor); -*/ return s; } |