GDestroyNotify value_destroy_func;
};
-#define G_HASH_TABLE_RESIZE(hash_table) \
- G_STMT_START { \
- if ((hash_table->size >= 3 * hash_table->nnodes && \
- hash_table->size > HASH_TABLE_MIN_SIZE) || \
- (3 * hash_table->size <= hash_table->nnodes && \
- hash_table->size < HASH_TABLE_MAX_SIZE)) \
- g_hash_table_resize (hash_table); \
- } G_STMT_END
-
static void g_hash_table_resize (GHashTable *hash_table);
static GHashNode** g_hash_table_lookup_node (GHashTable *hash_table,
gconstpointer key,
static void g_hash_table_remove_all_nodes (GHashTable *hash_table,
gboolean notify);
+static inline void
+g_hash_table_maybe_resize (GHashTable *hash_table)
+{
+ gint nnodes = hash_table->nnodes;
+ gint size = hash_table->size;
+
+ if ((size >= 3 * nnodes && size > HASH_TABLE_MIN_SIZE) ||
+ (3 * size <= nnodes && size < HASH_TABLE_MAX_SIZE))
+ g_hash_table_resize (hash_table);
+}
/**
* g_hash_table_new:
g_hash_table_unref (hash_table);
}
-static inline GHashNode**
+static inline GHashNode **
g_hash_table_lookup_node (GHashTable *hash_table,
gconstpointer key,
guint *hash_return)
{
- GHashNode **node;
+ GHashNode **node_ptr, *node;
guint hash_value;
hash_value = (* hash_table->hash_func) (key);
- node = &hash_table->nodes[hash_value % hash_table->size];
+ node_ptr = &hash_table->nodes[hash_value % hash_table->size];
if (hash_return)
*hash_return = hash_value;
* key equality function in most cases.
*/
if (hash_table->key_equal_func)
- while (*node && (((*node)->key_hash != hash_value) ||
- !(*hash_table->key_equal_func) ((*node)->key, key)))
- node = &(*node)->next;
+ {
+ while ((node = *node_ptr))
+ {
+ if (node->key_hash == hash_value &&
+ hash_table->key_equal_func (node->key, key))
+ break;
+
+ node_ptr = &(*node_ptr)->next;
+ }
+ }
else
- while (*node && (*node)->key != key)
- node = &(*node)->next;
+ {
+ while ((node = *node_ptr))
+ {
+ if (node->key == key)
+ break;
+
+ node_ptr = &(*node_ptr)->next;
+ }
+ }
- return node;
+ return node_ptr;
}
/**
node = *g_hash_table_lookup_node (hash_table, lookup_key, NULL);
- if (node)
- {
- if (orig_key)
- *orig_key = node->key;
- if (value)
- *value = node->value;
- return TRUE;
- }
- else
+ if (node == NULL)
return FALSE;
+
+ if (orig_key)
+ *orig_key = node->key;
+
+ if (value)
+ *value = node->value;
+
+ return TRUE;
}
static void
gpointer value,
gboolean keep_new_key)
{
- GHashNode **node;
+ GHashNode **node_ptr, *node;
guint key_hash;
g_return_if_fail (hash_table != NULL);
g_return_if_fail (hash_table->ref_count > 0);
- node = g_hash_table_lookup_node (hash_table, key, &key_hash);
+ node_ptr = g_hash_table_lookup_node (hash_table, key, &key_hash);
- if (*node)
+ if ((node = *node_ptr))
{
if (keep_new_key)
{
if (hash_table->key_destroy_func)
- hash_table->key_destroy_func ((*node)->key);
- (*node)->key = key;
+ hash_table->key_destroy_func (node->key);
+ node->key = key;
}
else
{
}
if (hash_table->value_destroy_func)
- hash_table->value_destroy_func ((*node)->value);
+ hash_table->value_destroy_func (node->value);
- (*node)->value = value;
+ node->value = value;
}
else
{
- *node = g_hash_node_new (key, value, key_hash);
+ node = g_slice_new (GHashNode);
+
+ node->key = key;
+ node->value = value;
+ node->key_hash = key_hash;
+ node->next = NULL;
+
+ *node_ptr = node;
hash_table->nnodes++;
- G_HASH_TABLE_RESIZE (hash_table);
+ g_hash_table_maybe_resize (hash_table);
}
}
return FALSE;
g_hash_table_remove_node (hash_table, &node_ptr, notify);
- G_HASH_TABLE_RESIZE (hash_table);
+ g_hash_table_maybe_resize (hash_table);
return TRUE;
}
g_return_if_fail (hash_table != NULL);
g_hash_table_remove_all_nodes (hash_table, TRUE);
- G_HASH_TABLE_RESIZE (hash_table);
+ g_hash_table_maybe_resize (hash_table);
}
/**
g_return_if_fail (hash_table != NULL);
g_hash_table_remove_all_nodes (hash_table, FALSE);
- G_HASH_TABLE_RESIZE (hash_table);
+ g_hash_table_maybe_resize (hash_table);
}
/**
else
node_ptr = &node->next;
- G_HASH_TABLE_RESIZE (hash_table);
+ g_hash_table_maybe_resize (hash_table);
return deleted;
}
hash_table->size = new_size;
}
-static GHashNode*
-g_hash_node_new (gpointer key,
- gpointer value,
- guint key_hash)
-{
- GHashNode *hash_node = g_slice_new (GHashNode);
-
- hash_node->key = key;
- hash_node->value = value;
- hash_node->key_hash = key_hash;
- hash_node->next = NULL;
-
- return hash_node;
-}
-
#define __G_HASH_C__
#include "galiasdef.c"