/*****************************************************************************/
struct hashtable *
-create_hashtable(unsigned int minsize, float maxloadfactor,
- unsigned int (*hashf) (void*),
- int (*eqf) (void*, void*))
+create_hashtable_ext(unsigned int minsize, float maxloadfactor,
+ unsigned int (*hashf) (void*),
+ int (*eqf) (void*, void*),
+ void (*freekfn) (void*),
+ void (*freevfn) (void*))
{
struct hashtable *h;
unsigned int i, size = 1u;
h->hashfn = hashf;
h->eqfn = eqf;
h->loadlimit = (unsigned int) ((float)size * maxloadfactor);
+ h->freekfn = freekfn;
+ h->freevfn = freevfn;
return h;
}
+struct hashtable *
+create_hashtable(unsigned int (*hashf) (void*),
+ int (*eqf) (void*, void*),
+ void (*freekfn) (void*),
+ void (*freevfn) (void*))
+{
+ return create_hashtable_ext(16, 0.75, hashf, eqf, freekfn, freevfn);
+}
+
/*****************************************************************************/
static unsigned int
hash(struct hashtable *h, void *k)
/* Check hash value to short circuit heavier comparison */
if ((hashvalue == e->h) && (h->eqfn(k, e->k)))
{
- free(e->v);
+ if (h->freevfn != NULL)
+ h->freevfn(e->v);
e->v = v;
return -1;
{
*pE = e->next;
h->entrycount--;
- v = e->v;
- free(e->k);
+ v = NULL;
+ if (h->freekfn != NULL)
+ h->freekfn(e->k);
+ if (h->freevfn != NULL)
+ h->freevfn(e->v);
+ else
+ v = e->v;
free(e);
return v;
/*****************************************************************************/
/* destroy */
void
-hashtable_destroy(struct hashtable *h, int free_values)
+hashtable_destroy(struct hashtable *h)
{
unsigned int i;
struct entry *e, *f;
{
f = e;
e = e->next;
- free(f->k);
-
- if (free_values)
- free(f->v);
+ if (h->freekfn != NULL)
+ h->freekfn(f->k);
+ if (h->freevfn != NULL)
+ h->freevfn(f->v);
free(f);
}
free(h);
}
-
/*****************************************************************************/
/* hashtable_iterator - iterator constructor */