added GFreeFunc and g_hash_table_set_key_freefunc() prototype. added

Tue Nov 24 14:05:47 EST 1998	Michael K. Johnson <johnsonm@redhat.com>

	* glib.h: added GFreeFunc and g_hash_table_set_key_freefunc()
	prototype.
	* ghash.c: added g_hash_table_set_key_freefunc() implementation.
	Modified the prototypes of the functions g_hash_node_destroy() and
	g_hash_nodes_destroy(), and changed the functions that call them
	to match the new definitions.
	This changes no external interfaces, and should create no binary
	or source incompatibilities.  It does add a member to the
	GHashTable structure.
This commit is contained in:
EST 1998 Michael K. Johnson 1998-11-24 19:38:17 +00:00 committed by Michael Johnson
parent 9c1692c260
commit 3568d22b53
12 changed files with 148 additions and 18 deletions

View File

@ -1,3 +1,15 @@
Tue Nov 24 14:05:47 EST 1998 Michael K. Johnson <johnsonm@redhat.com>
* glib.h: added GFreeFunc and g_hash_table_set_key_freefunc()
prototype.
* ghash.c: added g_hash_table_set_key_freefunc() implementation.
Modified the prototypes of the functions g_hash_node_destroy() and
g_hash_nodes_destroy(), and changed the functions that call them
to match the new definitions.
This changes no external interfaces, and should create no binary
or source incompatibilities. It does add a member to the
GHashTable structure.
Tue Nov 24 09:40:00 1998 Tim Janik <timj@gtk.org>
* glib.h: removed the GListAllocator type and its g_*_allocator_*()

View File

@ -1,3 +1,15 @@
Tue Nov 24 14:05:47 EST 1998 Michael K. Johnson <johnsonm@redhat.com>
* glib.h: added GFreeFunc and g_hash_table_set_key_freefunc()
prototype.
* ghash.c: added g_hash_table_set_key_freefunc() implementation.
Modified the prototypes of the functions g_hash_node_destroy() and
g_hash_nodes_destroy(), and changed the functions that call them
to match the new definitions.
This changes no external interfaces, and should create no binary
or source incompatibilities. It does add a member to the
GHashTable structure.
Tue Nov 24 09:40:00 1998 Tim Janik <timj@gtk.org>
* glib.h: removed the GListAllocator type and its g_*_allocator_*()

View File

@ -1,3 +1,15 @@
Tue Nov 24 14:05:47 EST 1998 Michael K. Johnson <johnsonm@redhat.com>
* glib.h: added GFreeFunc and g_hash_table_set_key_freefunc()
prototype.
* ghash.c: added g_hash_table_set_key_freefunc() implementation.
Modified the prototypes of the functions g_hash_node_destroy() and
g_hash_nodes_destroy(), and changed the functions that call them
to match the new definitions.
This changes no external interfaces, and should create no binary
or source incompatibilities. It does add a member to the
GHashTable structure.
Tue Nov 24 09:40:00 1998 Tim Janik <timj@gtk.org>
* glib.h: removed the GListAllocator type and its g_*_allocator_*()

View File

@ -1,3 +1,15 @@
Tue Nov 24 14:05:47 EST 1998 Michael K. Johnson <johnsonm@redhat.com>
* glib.h: added GFreeFunc and g_hash_table_set_key_freefunc()
prototype.
* ghash.c: added g_hash_table_set_key_freefunc() implementation.
Modified the prototypes of the functions g_hash_node_destroy() and
g_hash_nodes_destroy(), and changed the functions that call them
to match the new definitions.
This changes no external interfaces, and should create no binary
or source incompatibilities. It does add a member to the
GHashTable structure.
Tue Nov 24 09:40:00 1998 Tim Janik <timj@gtk.org>
* glib.h: removed the GListAllocator type and its g_*_allocator_*()

View File

@ -1,3 +1,15 @@
Tue Nov 24 14:05:47 EST 1998 Michael K. Johnson <johnsonm@redhat.com>
* glib.h: added GFreeFunc and g_hash_table_set_key_freefunc()
prototype.
* ghash.c: added g_hash_table_set_key_freefunc() implementation.
Modified the prototypes of the functions g_hash_node_destroy() and
g_hash_nodes_destroy(), and changed the functions that call them
to match the new definitions.
This changes no external interfaces, and should create no binary
or source incompatibilities. It does add a member to the
GHashTable structure.
Tue Nov 24 09:40:00 1998 Tim Janik <timj@gtk.org>
* glib.h: removed the GListAllocator type and its g_*_allocator_*()

View File

@ -1,3 +1,15 @@
Tue Nov 24 14:05:47 EST 1998 Michael K. Johnson <johnsonm@redhat.com>
* glib.h: added GFreeFunc and g_hash_table_set_key_freefunc()
prototype.
* ghash.c: added g_hash_table_set_key_freefunc() implementation.
Modified the prototypes of the functions g_hash_node_destroy() and
g_hash_nodes_destroy(), and changed the functions that call them
to match the new definitions.
This changes no external interfaces, and should create no binary
or source incompatibilities. It does add a member to the
GHashTable structure.
Tue Nov 24 09:40:00 1998 Tim Janik <timj@gtk.org>
* glib.h: removed the GListAllocator type and its g_*_allocator_*()

View File

@ -1,3 +1,15 @@
Tue Nov 24 14:05:47 EST 1998 Michael K. Johnson <johnsonm@redhat.com>
* glib.h: added GFreeFunc and g_hash_table_set_key_freefunc()
prototype.
* ghash.c: added g_hash_table_set_key_freefunc() implementation.
Modified the prototypes of the functions g_hash_node_destroy() and
g_hash_nodes_destroy(), and changed the functions that call them
to match the new definitions.
This changes no external interfaces, and should create no binary
or source incompatibilities. It does add a member to the
GHashTable structure.
Tue Nov 24 09:40:00 1998 Tim Janik <timj@gtk.org>
* glib.h: removed the GListAllocator type and its g_*_allocator_*()

View File

@ -1,3 +1,15 @@
Tue Nov 24 14:05:47 EST 1998 Michael K. Johnson <johnsonm@redhat.com>
* glib.h: added GFreeFunc and g_hash_table_set_key_freefunc()
prototype.
* ghash.c: added g_hash_table_set_key_freefunc() implementation.
Modified the prototypes of the functions g_hash_node_destroy() and
g_hash_nodes_destroy(), and changed the functions that call them
to match the new definitions.
This changes no external interfaces, and should create no binary
or source incompatibilities. It does add a member to the
GHashTable structure.
Tue Nov 24 09:40:00 1998 Tim Janik <timj@gtk.org>
* glib.h: removed the GListAllocator type and its g_*_allocator_*()

32
ghash.c
View File

@ -40,6 +40,7 @@ struct _GHashTable
GHashNode **nodes;
GHashFunc hash_func;
GCompareFunc key_compare_func;
GFreeFunc *free_func;
};
@ -48,8 +49,10 @@ static GHashNode** g_hash_table_lookup_node (GHashTable *hash_table,
gconstpointer key);
static GHashNode* g_hash_node_new (gpointer key,
gpointer value);
static void g_hash_node_destroy (GHashNode *hash_node);
static void g_hash_nodes_destroy (GHashNode *hash_node);
static void g_hash_node_destroy (GHashNode *hash_node,
GFreeFunc *free_func);
static void g_hash_nodes_destroy (GHashNode *hash_node,
GFreeFunc *free_func);
static GMemChunk *node_mem_chunk = NULL;
@ -70,6 +73,7 @@ g_hash_table_new (GHashFunc hash_func,
hash_table->hash_func = hash_func ? hash_func : g_direct_hash;
hash_table->key_compare_func = key_compare_func;
hash_table->nodes = g_new (GHashNode*, hash_table->size);
hash_table->free_func = NULL;
for (i = 0; i < hash_table->size; i++)
hash_table->nodes[i] = NULL;
@ -85,7 +89,7 @@ g_hash_table_destroy (GHashTable *hash_table)
g_return_if_fail (hash_table != NULL);
for (i = 0; i < hash_table->size; i++)
g_hash_nodes_destroy (hash_table->nodes[i]);
g_hash_nodes_destroy (hash_table->nodes[i], hash_table->free_func);
g_free (hash_table->nodes);
g_free (hash_table);
@ -170,7 +174,7 @@ g_hash_table_remove (GHashTable *hash_table,
{
dest = *node;
(*node) = dest->next;
g_hash_node_destroy (dest);
g_hash_node_destroy (dest, hash_table->free_func);
hash_table->nnodes--;
}
@ -249,13 +253,13 @@ g_hash_table_foreach_remove (GHashTable *hash_table,
if (prev)
{
prev->next = node->next;
g_hash_node_destroy (node);
g_hash_node_destroy (node, hash_table->free_func);
node = prev;
}
else
{
hash_table->nodes[i] = node->next;
g_hash_node_destroy (node);
g_hash_node_destroy (node, hash_table->free_func);
goto restart;
}
}
@ -293,6 +297,12 @@ g_hash_table_size (GHashTable *hash_table)
return hash_table->nnodes;
}
void
g_hash_table_set_key_freefunc (GHashTable *hash_table, GFreeFunc *free_func)
{
hash_table->free_func = free_func;
}
static void
g_hash_table_resize (GHashTable *hash_table)
{
@ -361,14 +371,15 @@ g_hash_node_new (gpointer key,
}
static void
g_hash_node_destroy (GHashNode *hash_node)
g_hash_node_destroy (GHashNode *hash_node, GFreeFunc *free_func)
{
if (free_func) (*free_func)(hash_node->key);
hash_node->next = node_free_list;
node_free_list = hash_node;
}
static void
g_hash_nodes_destroy (GHashNode *hash_node)
g_hash_nodes_destroy (GHashNode *hash_node, GFreeFunc *free_func)
{
GHashNode *node;
@ -378,7 +389,10 @@ g_hash_nodes_destroy (GHashNode *hash_node)
node = hash_node;
while (node->next)
node = node->next;
{
if (free_func) (*free_func)(node->key);
node = node->next;
}
node->next = node_free_list;
node_free_list = hash_node;

3
glib.h
View File

@ -779,6 +779,7 @@ typedef void (*GDataForeachFunc) (GQuark key_id,
typedef void (*GFunc) (gpointer data,
gpointer user_data);
typedef guint (*GHashFunc) (gconstpointer key);
typedef void (*GFreeFunc) (gpointer data);
typedef void (*GHFunc) (gpointer key,
gpointer value,
gpointer user_data);
@ -986,6 +987,8 @@ gint g_hash_table_foreach_remove (GHashTable *hash_table,
GHRFunc func,
gpointer user_data);
gint g_hash_table_size (GHashTable *hash_table);
void g_hash_table_set_key_freefunc (GHashTable *hash_table,
GFreeFunc *free_func);
/* Caches

View File

@ -40,6 +40,7 @@ struct _GHashTable
GHashNode **nodes;
GHashFunc hash_func;
GCompareFunc key_compare_func;
GFreeFunc *free_func;
};
@ -48,8 +49,10 @@ static GHashNode** g_hash_table_lookup_node (GHashTable *hash_table,
gconstpointer key);
static GHashNode* g_hash_node_new (gpointer key,
gpointer value);
static void g_hash_node_destroy (GHashNode *hash_node);
static void g_hash_nodes_destroy (GHashNode *hash_node);
static void g_hash_node_destroy (GHashNode *hash_node,
GFreeFunc *free_func);
static void g_hash_nodes_destroy (GHashNode *hash_node,
GFreeFunc *free_func);
static GMemChunk *node_mem_chunk = NULL;
@ -70,6 +73,7 @@ g_hash_table_new (GHashFunc hash_func,
hash_table->hash_func = hash_func ? hash_func : g_direct_hash;
hash_table->key_compare_func = key_compare_func;
hash_table->nodes = g_new (GHashNode*, hash_table->size);
hash_table->free_func = NULL;
for (i = 0; i < hash_table->size; i++)
hash_table->nodes[i] = NULL;
@ -85,7 +89,7 @@ g_hash_table_destroy (GHashTable *hash_table)
g_return_if_fail (hash_table != NULL);
for (i = 0; i < hash_table->size; i++)
g_hash_nodes_destroy (hash_table->nodes[i]);
g_hash_nodes_destroy (hash_table->nodes[i], hash_table->free_func);
g_free (hash_table->nodes);
g_free (hash_table);
@ -170,7 +174,7 @@ g_hash_table_remove (GHashTable *hash_table,
{
dest = *node;
(*node) = dest->next;
g_hash_node_destroy (dest);
g_hash_node_destroy (dest, hash_table->free_func);
hash_table->nnodes--;
}
@ -249,13 +253,13 @@ g_hash_table_foreach_remove (GHashTable *hash_table,
if (prev)
{
prev->next = node->next;
g_hash_node_destroy (node);
g_hash_node_destroy (node, hash_table->free_func);
node = prev;
}
else
{
hash_table->nodes[i] = node->next;
g_hash_node_destroy (node);
g_hash_node_destroy (node, hash_table->free_func);
goto restart;
}
}
@ -293,6 +297,12 @@ g_hash_table_size (GHashTable *hash_table)
return hash_table->nnodes;
}
void
g_hash_table_set_key_freefunc (GHashTable *hash_table, GFreeFunc *free_func)
{
hash_table->free_func = free_func;
}
static void
g_hash_table_resize (GHashTable *hash_table)
{
@ -361,14 +371,15 @@ g_hash_node_new (gpointer key,
}
static void
g_hash_node_destroy (GHashNode *hash_node)
g_hash_node_destroy (GHashNode *hash_node, GFreeFunc *free_func)
{
if (free_func) (*free_func)(hash_node->key);
hash_node->next = node_free_list;
node_free_list = hash_node;
}
static void
g_hash_nodes_destroy (GHashNode *hash_node)
g_hash_nodes_destroy (GHashNode *hash_node, GFreeFunc *free_func)
{
GHashNode *node;
@ -378,7 +389,10 @@ g_hash_nodes_destroy (GHashNode *hash_node)
node = hash_node;
while (node->next)
node = node->next;
{
if (free_func) (*free_func)(node->key);
node = node->next;
}
node->next = node_free_list;
node_free_list = hash_node;

View File

@ -779,6 +779,7 @@ typedef void (*GDataForeachFunc) (GQuark key_id,
typedef void (*GFunc) (gpointer data,
gpointer user_data);
typedef guint (*GHashFunc) (gconstpointer key);
typedef void (*GFreeFunc) (gpointer data);
typedef void (*GHFunc) (gpointer key,
gpointer value,
gpointer user_data);
@ -986,6 +987,8 @@ gint g_hash_table_foreach_remove (GHashTable *hash_table,
GHRFunc func,
gpointer user_data);
gint g_hash_table_size (GHashTable *hash_table);
void g_hash_table_set_key_freefunc (GHashTable *hash_table,
GFreeFunc *free_func);
/* Caches