summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J Stevens <paul@nfg.nl>2010-08-10 14:59:00 +0200
committerPaul J Stevens <paul@nfg.nl>2010-08-10 14:59:00 +0200
commite10a61a4589b9c2bdfc6db3603f7a510e62e6887 (patch)
tree067ac2faff54af6cb77c13d64454420a39003af6
parent385c3feeb4c0db62c842fc63c78de38c901fa227 (diff)
small sset api change
-rw-r--r--src/dm_sset.c28
-rw-r--r--src/dm_sset.h5
-rw-r--r--test/check_dbmail_sset.c21
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;
}