projects
/
rocksndiamonds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
added function parameters for hash table creation to free keys or values
[rocksndiamonds.git]
/
src
/
libgame
/
hash.c
diff --git
a/src/libgame/hash.c
b/src/libgame/hash.c
index e021da5c5959be418610e078e212d1e150e279e7..101ec1214a30aae2faddd478c24f53321d401832 100644
(file)
--- a/
src/libgame/hash.c
+++ b/
src/libgame/hash.c
@@
-41,9
+41,11
@@
/*****************************************************************************/
struct hashtable *
/*****************************************************************************/
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;
{
struct hashtable *h;
unsigned int i, size = 1u;
@@
-78,10
+80,21
@@
create_hashtable(unsigned int minsize, float maxloadfactor,
h->hashfn = hashf;
h->eqfn = eqf;
h->loadlimit = (unsigned int) ((float)size * maxloadfactor);
h->hashfn = hashf;
h->eqfn = eqf;
h->loadlimit = (unsigned int) ((float)size * maxloadfactor);
+ h->freekfn = freekfn;
+ h->freevfn = freevfn;
return h;
}
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)
/*****************************************************************************/
static unsigned int
hash(struct hashtable *h, void *k)
@@
-242,7
+255,8
@@
hashtable_change(struct hashtable *h, void *k, void *v)
/* Check hash value to short circuit heavier comparison */
if ((hashvalue == e->h) && (h->eqfn(k, e->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;
e->v = v;
return -1;
@@
-298,8
+312,13
@@
hashtable_remove(struct hashtable *h, void *k)
{
*pE = e->next;
h->entrycount--;
{
*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;
free(e);
return v;
@@
-315,7
+334,7
@@
hashtable_remove(struct hashtable *h, void *k)
/*****************************************************************************/
/* destroy */
void
/*****************************************************************************/
/* destroy */
void
-hashtable_destroy(struct hashtable *h
, int free_values
)
+hashtable_destroy(struct hashtable *h)
{
unsigned int i;
struct entry *e, *f;
{
unsigned int i;
struct entry *e, *f;
@@
-329,10
+348,10
@@
hashtable_destroy(struct hashtable *h, int free_values)
{
f = e;
e = e->next;
{
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(f);
}
@@
-342,7
+361,6
@@
hashtable_destroy(struct hashtable *h, int free_values)
free(h);
}
free(h);
}
-
/*****************************************************************************/
/* hashtable_iterator - iterator constructor */
/*****************************************************************************/
/* hashtable_iterator - iterator constructor */