/** * g_hash_table_lookup_extended: * @hash_table: a #GHashTable * @lookup_key: the key to look up * @orig_key: return location for the original key, or %NULL * @value: return location for the value associated with the key, or %NULL * * Looks up a key in the #GHashTable, returning the original key and the * associated value and a #gboolean which is %TRUE if the key was found. This * is useful if you need to free the memory allocated for the original key, * for example before calling g_hash_table_remove(). * * You can actually pass %NULL for @lookup_key to test * whether the %NULL key exists. * * Return value: %TRUE if the key was found in the #GHashTable. **/ gboolean g_hash_table_lookup_extended (GHashTable *hash_table, gconstpointer lookup_key, gpointer *orig_key, gpointer *value) { GHashNode *node; guint node_index; g_return_val_if_fail (hash_table != NULL, FALSE); node_index = g_hash_table_lookup_node (hash_table, lookup_key); node = &hash_table->nodes [node_index]; if (!node->key_hash) return FALSE; if (orig_key) *orig_key = node->key; if (value) *value = node->value; return TRUE; }
/** * g_hash_table_replace: * @hash_table: a #GHashTable. * @key: a key to insert. * @value: the value to associate with the key. * * Inserts a new key and value into a #GHashTable similar to * g_hash_table_insert(). The difference is that if the key already exists * in the #GHashTable, it gets replaced by the new key. If you supplied a * @value_destroy_func when creating the #GHashTable, the old value is freed * using that function. If you supplied a @key_destroy_func when creating the * #GHashTable, the old key is freed using that function. **/ void mono_g_hash_table_replace (MonoGHashTable *hash_table, gpointer key, gpointer value) { MonoGHashNode **node; g_return_if_fail (hash_table != NULL); node = g_hash_table_lookup_node (hash_table, key); if (*node) { if (hash_table->key_destroy_func) hash_table->key_destroy_func ((*node)->key); if (hash_table->value_destroy_func) hash_table->value_destroy_func ((*node)->value); SET_NODE_KEY ((*node), hash_table->gc_type, key); SET_NODE_VALUE ((*node), hash_table->gc_type, value); } else { *node = g_hash_node_new (key, value, hash_table->gc_type); hash_table->nnodes++; G_HASH_TABLE_RESIZE (hash_table); } }
/** * g_hash_table_replace: * @hash_table: a #GHashTable. * @key: a key to insert. * @value: the value to associate with the key. * * Inserts a new key and value into a #GHashTable similar to * g_hash_table_insert(). The difference is that if the key already exists * in the #GHashTable, it gets replaced by the new key. If you supplied a * @value_destroy_func when creating the #GHashTable, the old value is freed * using that function. If you supplied a @key_destroy_func when creating the * #GHashTable, the old key is freed using that function. **/ void g_hash_table_replace (GHashTable *hash_table, gpointer key, gpointer value) { GHashNode **node; g_return_if_fail (hash_table != NULL); node = g_hash_table_lookup_node (hash_table, key); if (*node) { if (hash_table->key_destroy_func) hash_table->key_destroy_func ((*node)->key); if (hash_table->value_destroy_func) hash_table->value_destroy_func ((*node)->value); (*node)->key = key; (*node)->value = value; } else { *node = g_hash_node_new (key, value); hash_table->nnodes++; G_HASH_TABLE_RESIZE (hash_table); } }
/* * g_hash_table_remove_internal: * @hash_table: our #GHashTable * @key: the key to remove * @notify: %TRUE if the destroy notify handlers are to be called * Return value: %TRUE if a node was found and removed, else %FALSE * * Implements the common logic for the g_hash_table_remove() and * g_hash_table_steal() functions. * * Do a lookup of @key and remove it if it is found, calling the * destroy notify handlers only if @notify is %TRUE. */ static gboolean g_hash_table_remove_internal (GHashTable *hash_table, gconstpointer key, gboolean notify) { GHashNode *node; guint node_index; g_return_val_if_fail (hash_table != NULL, FALSE); node_index = g_hash_table_lookup_node (hash_table, key); node = &hash_table->nodes [node_index]; /* g_hash_table_lookup_node() never returns a tombstone, so this is safe */ if (!node->key_hash) return FALSE; g_hash_table_remove_node (hash_table, node, notify); g_hash_table_maybe_resize (hash_table); #ifndef G_DISABLE_ASSERT hash_table->version++; #endif return TRUE; }
/** * g_hash_table_insert: * @hash_table: a #GHashTable. * @key: a key to insert. * @value: the value to associate with the key. * * Inserts a new key and value into a #GHashTable. * * If the key already exists in the #GHashTable its current value is replaced * with the new value. If you supplied a @value_destroy_func when creating the * #GHashTable, the old value is freed using that function. If you supplied * a @key_destroy_func when creating the #GHashTable, the passed key is freed * using that function. **/ void g_hash_table_insert (GHashTable *hash_table, gpointer key, gpointer value) { GHashNode **node; g_return_if_fail (hash_table != NULL); node = g_hash_table_lookup_node (hash_table, key); if (*node) { /* do not reset node->key in this place, keeping * the old key is the intended behaviour. * g_hash_table_replace() can be used instead. */ /* free the passed key */ if (hash_table->key_destroy_func) hash_table->key_destroy_func (key); if (hash_table->value_destroy_func) hash_table->value_destroy_func ((*node)->value); (*node)->value = value; } else { *node = g_hash_node_new (key, value); hash_table->nnodes++; G_HASH_TABLE_RESIZE (hash_table); } }
void g_hash_table_insert (GHashTable *hash_table, gpointer key, gpointer value) { GHashNode **node; node = g_hash_table_lookup_node (hash_table, key); if (*node) { /* free the passed key */ if (hash_table->key_destroy_func) hash_table->key_destroy_func (key); if (hash_table->value_destroy_func) hash_table->value_destroy_func ((*node)->value); (*node)->value = value; } else { *node = g_hash_node_new (key, value); hash_table->nnodes++; } }
/** * g_hash_table_remove: * @hash_table: a #GHashTable. * @key: the key to remove. * * Removes a key and its associated value from a #GHashTable. * * If the #GHashTable was created using g_hash_table_new_full(), the * key and value are freed using the supplied destroy functions, otherwise * you have to make sure that any dynamically allocated values are freed * yourself. * * Return value: %TRUE if the key was found and removed from the #GHashTable. **/ gboolean g_hash_table_remove (GHashTable *hash_table, gconstpointer key) { GHashNode **node, *dest; g_return_val_if_fail (hash_table != NULL, FALSE); node = g_hash_table_lookup_node (hash_table, key); if (*node) { dest = *node; (*node) = dest->next; g_hash_node_destroy (dest, hash_table->key_destroy_func, hash_table->value_destroy_func); hash_table->nnodes--; G_HASH_TABLE_RESIZE (hash_table); return TRUE; } return FALSE; }
gpointer g_hash_table_lookup (GHashTable *hash_table, gconstpointer key) { GHashNode *node; node = *g_hash_table_lookup_node (hash_table, key); return node ? node->value : NULL; }
static gboolean g_hash_table_insert_internal (GHashTable *hash_table, gpointer key, gpointer value, gboolean keep_new_key) { guint key_hash; guint node_index; node_index = g_hash_table_lookup_node (hash_table, key, &key_hash); return g_hash_table_insert_node (hash_table, node_index, key_hash, key, value, keep_new_key, FALSE); }
/** * g_hash_table_lookup: * @hash_table: a #GHashTable. * @key: the key to look up. * * Looks up a key in a #GHashTable. Note that this function cannot * distinguish between a key that is not present and one which is present * and has the value %NULL. If you need this distinction, use * g_hash_table_lookup_extended(). * * Return value: the associated value, or %NULL if the key is not found. **/ gpointer g_hash_table_lookup (GHashTable *hash_table, gconstpointer key) { GHashNode *node; g_return_val_if_fail (hash_table != NULL, NULL); node = *g_hash_table_lookup_node (hash_table, key, NULL); return node ? node->value : NULL; }
gpointer g_hash_table_lookup (GHashTable *hash_table, gconstpointer key) { guint node_index; guint node_hash; node_index = g_hash_table_lookup_node (hash_table, key, &node_hash); return HASH_IS_REAL (hash_table->hashes[node_index]) ? hash_table->values[node_index] : NULL; }
/* * g_hash_table_insert_internal: * @hash_table: our #GHashTable * @key: the key to insert * @value: the value to insert * @keep_new_key: if %TRUE and this key already exists in the table * then call the destroy notify function on the old key. If %FALSE * then call the destroy notify function on the new key. * * Implements the common logic for the g_hash_table_insert() and * g_hash_table_replace() functions. * * Do a lookup of @key. If it is found, replace it with the new * @value (and perhaps the new @key). If it is not found, create a * new node. */ static void g_hash_table_insert_internal (GHashTable *hash_table, gpointer key, gpointer value, gboolean keep_new_key) { GHashNode **node_ptr, *node; guint key_hash; g_return_if_fail (hash_table != NULL); g_return_if_fail (hash_table->ref_count > 0); node_ptr = g_hash_table_lookup_node (hash_table, key, &key_hash); if ((node = *node_ptr)) { if (keep_new_key) { if (hash_table->key_destroy_func) hash_table->key_destroy_func (node->key); node->key = key; } else { if (hash_table->key_destroy_func) hash_table->key_destroy_func (key); } if (hash_table->value_destroy_func) hash_table->value_destroy_func (node->value); node->value = value; } else { 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_maybe_resize (hash_table); #ifndef G_DISABLE_ASSERT hash_table->version++; #endif } }
/** * g_hash_table_lookup: * @hash_table: a #GHashTable. * @key: the key to look up. * * Looks up a key in a #GHashTable. Note that this function cannot * distinguish between a key that is not present and one which is present * and has the value %NULL. If you need this distinction, use * g_hash_table_lookup_extended(). * * Return value: the associated value, or %NULL if the key is not found. **/ gpointer g_hash_table_lookup (GHashTable *hash_table, gconstpointer key) { GHashNode *node; guint node_index; g_return_val_if_fail (hash_table != NULL, NULL); node_index = g_hash_table_lookup_node (hash_table, key); node = &hash_table->nodes [node_index]; return node->key_hash ? node->value : NULL; }
/* * g_hash_table_insert_internal: * @hash_table: our #GHashTable * @key: the key to insert * @value: the value to insert * @keep_new_key: if %TRUE and this key already exists in the table * then call the destroy notify function on the old key. If %FALSE * then call the destroy notify function on the new key. * * Implements the common logic for the g_hash_table_insert() and * g_hash_table_replace() functions. * * Do a lookup of @key. If it is found, replace it with the new * @value (and perhaps the new @key). If it is not found, create a * new node. */ static void g_hash_table_insert_internal (GHashTable *hash_table, gpointer key, gpointer value, gboolean keep_new_key) { guint key_hash; guint node_index; g_return_if_fail (hash_table != NULL); node_index = g_hash_table_lookup_node (hash_table, key, &key_hash); g_hash_table_insert_node (hash_table, node_index, key_hash, key, value, keep_new_key, FALSE); }
/* * g_hash_table_remove_internal: * @hash_table: our #GHashTable * @key: the key to remove * @notify: %TRUE if the destroy notify handlers are to be called * Return value: %TRUE if a node was found and removed, else %FALSE * * Implements the common logic for the g_hash_table_remove() and * g_hash_table_steal() functions. * * Do a lookup of @key and remove it if it is found, calling the * destroy notify handlers only if @notify is %TRUE. */ static gboolean g_hash_table_remove_internal (GHashTable *hash_table, gconstpointer key, gboolean notify) { GHashNode **node_ptr; g_return_val_if_fail (hash_table != NULL, FALSE); node_ptr = g_hash_table_lookup_node (hash_table, key, NULL); if (*node_ptr == NULL) return FALSE; g_hash_table_remove_node (hash_table, &node_ptr, notify); g_hash_table_maybe_resize (hash_table); #ifndef G_DISABLE_ASSERT hash_table->version++; #endif return TRUE; }
/** * g_hash_table_lookup_extended: * @hash_table: a #GHashTable. * @lookup_key: the key to look up. * @orig_key: returns the original key. * @value: returns the value associated with the key. * * Looks up a key in the #GHashTable, returning the original key and the * associated value and a #gboolean which is %TRUE if the key was found. This * is useful if you need to free the memory allocated for the original key, * for example before calling g_hash_table_remove(). * * Return value: %TRUE if the key was found in the #GHashTable. **/ gboolean g_hash_table_lookup_extended (GHashTable *hash_table, gconstpointer lookup_key, gpointer *orig_key, gpointer *value) { GHashNode *node; g_return_val_if_fail (hash_table != NULL, FALSE); node = *g_hash_table_lookup_node (hash_table, lookup_key, NULL); if (node == NULL) return FALSE; if (orig_key) *orig_key = node->key; if (value) *value = node->value; return TRUE; }
/** * g_hash_table_steal: * @hash_table: a #GHashTable. * @key: the key to remove. * * Removes a key and its associated value from a #GHashTable without * calling the key and value destroy functions. * * Return value: %TRUE if the key was found and removed from the #GHashTable. **/ gboolean mono_g_hash_table_steal (MonoGHashTable *hash_table, gconstpointer key) { MonoGHashNode **node, *dest; g_return_val_if_fail (hash_table != NULL, FALSE); node = g_hash_table_lookup_node (hash_table, key); if (*node) { dest = *node; (*node) = dest->next; g_hash_node_destroy (dest, hash_table->gc_type, NULL, NULL); hash_table->nnodes--; G_HASH_TABLE_RESIZE (hash_table); return TRUE; } return FALSE; }
/** * g_hash_table_lookup_extended: * @hash_table: a #GHashTable * @lookup_key: the key to look up * @orig_key: return location for the original key, or %NULL * @value: return location for the value associated with the key, or %NULL * * Looks up a key in the #GHashTable, returning the original key and the * associated value and a #gboolean which is %TRUE if the key was found. This * is useful if you need to free the memory allocated for the original key, * for example before calling g_hash_table_remove(). * * You can actually pass %NULL for @lookup_key to test * whether the %NULL key exists, provided the hash and equal functions * of @hash_table are %NULL-safe. * * Return value: %TRUE if the key was found in the #GHashTable. **/ gboolean g_hash_table_lookup_extended (GHashTable *hash_table, gconstpointer lookup_key, gpointer *orig_key, gpointer *value) { guint node_index; guint node_hash; g_return_val_if_fail (hash_table != NULL, FALSE); node_index = g_hash_table_lookup_node (hash_table, lookup_key, &node_hash); if (!HASH_IS_REAL (hash_table->hashes[node_index])) return FALSE; if (orig_key) *orig_key = hash_table->keys[node_index]; if (value) *value = hash_table->values[node_index]; return TRUE; }
/* * g_hash_table_remove_internal: * @hash_table: our #GHashTable * @key: the key to remove * @notify: %TRUE if the destroy notify handlers are to be called * Return value: %TRUE if a node was found and removed, else %FALSE * * Implements the common logic for the g_hash_table_remove() and * g_hash_table_steal() functions. * * Do a lookup of @key and remove it if it is found, calling the * destroy notify handlers only if @notify is %TRUE. */ static gboolean g_hash_table_remove_internal (GHashTable *hash_table, gconstpointer key, gboolean notify) { guint node_index; guint node_hash; g_return_val_if_fail (hash_table != NULL, FALSE); node_index = g_hash_table_lookup_node (hash_table, key, &node_hash); if (!HASH_IS_REAL (hash_table->hashes[node_index])) return FALSE; g_hash_table_remove_node (hash_table, node_index, notify); g_hash_table_maybe_resize (hash_table); #ifndef G_DISABLE_ASSERT hash_table->version++; #endif return TRUE; }