⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ghash.c

📁 嵌入式下基于MiniGUI的Web Browser
💻 C
📖 第 1 页 / 共 2 页
字号:
/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* * Modified by the GLib Team and others 1997-2000.  See the AUTHORS * file for a list of people on the GLib Team.  See the ChangeLog * files for a list of changes.  These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/.  *//*  * MT safe */#ifdef HAVE_CONFIG_H#include "glibconfig.h"#endif#include "glib.h"#define HASH_TABLE_MIN_SIZE 11#define HASH_TABLE_MAX_SIZE 13845163typedef struct _GHashNode      GHashNode;struct _GHashNode{  gpointer   key;  gpointer   value;  GHashNode *next;};struct _GHashTable{  gint             size;  gint             nnodes;  GHashNode      **nodes;  GHashFunc        hash_func;  GEqualFunc       key_equal_func;  GDestroyNotify   key_destroy_func;  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_ENDstatic void		g_hash_table_resize	  (GHashTable	  *hash_table);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,                                                   GDestroyNotify  key_destroy_func,                                                   GDestroyNotify  value_destroy_func);static void		g_hash_nodes_destroy	  (GHashNode	  *hash_node,						  GDestroyNotify   key_destroy_func,						  GDestroyNotify   value_destroy_func);static guint g_hash_table_foreach_remove_or_steal (GHashTable     *hash_table,                                                   GHRFunc	   func,                                                   gpointer	   user_data,                                                   gboolean        notify);G_LOCK_DEFINE_STATIC (g_hash_global);static GMemChunk *node_mem_chunk = NULL;static GHashNode *node_free_list = NULL;/** * g_hash_table_new: * @hash_func: a function to create a hash value from a key. *   Hash values are used to determine where keys are stored within the *   #GHashTable data structure. The g_direct_hash(), g_int_hash() and  *   g_str_hash() functions are provided for some common types of keys.  *   If hash_func is %NULL, g_direct_hash() is used. * @key_equal_func: a function to check two keys for equality.  This is *   used when looking up keys in the #GHashTable.  The g_direct_equal(), *   g_int_equal() and g_str_equal() functions are provided for the most *   common types of keys. If @key_equal_func is %NULL, keys are compared *   directly in a similar fashion to g_direct_equal(), but without the *   overhead of a function call. * * Creates a new #GHashTable. *  * Return value: a new #GHashTable. **/GHashTable*g_hash_table_new (GHashFunc    hash_func,		  GEqualFunc   key_equal_func){  return g_hash_table_new_full (hash_func, key_equal_func, NULL, NULL);}/** * g_hash_table_new_full: * @hash_func: a function to create a hash value from a key. * @key_equal_func: a function to check two keys for equality. * @key_destroy_func: a function to free the memory allocated for the key  *   used when removing the entry from the #GHashTable or %NULL if you  *   don't want to supply such a function. * @value_destroy_func: a function to free the memory allocated for the  *   value used when removing the entry from the #GHashTable or %NULL if  *   you don't want to supply such a function. *  * Creates a new #GHashTable like g_hash_table_new() and allows to specify * functions to free the memory allocated for the key and value that get  * called when removing the entry from the #GHashTable. *  * Return value: a new #GHashTable. **/GHashTable*g_hash_table_new_full (GHashFunc       hash_func,		       GEqualFunc      key_equal_func,		       GDestroyNotify  key_destroy_func,		       GDestroyNotify  value_destroy_func){  GHashTable *hash_table;  guint i;    hash_table = g_new (GHashTable, 1);  hash_table->size               = HASH_TABLE_MIN_SIZE;  hash_table->nnodes             = 0;  hash_table->hash_func          = hash_func ? hash_func : g_direct_hash;  hash_table->key_equal_func     = key_equal_func;  hash_table->key_destroy_func   = key_destroy_func;  hash_table->value_destroy_func = value_destroy_func;  hash_table->nodes              = g_new (GHashNode*, hash_table->size);    for (i = 0; i < hash_table->size; i++)    hash_table->nodes[i] = NULL;    return hash_table;}/** * g_hash_table_destroy: * @hash_table: a #GHashTable. *  * Destroys the #GHashTable. If keys and/or values are dynamically  * allocated, you should either free them first or create the #GHashTable * using g_hash_table_new_full(). In the latter case the destroy functions  * you supplied will be called on all keys and values before destroying  * the #GHashTable. **/voidg_hash_table_destroy (GHashTable *hash_table){  guint i;    g_return_if_fail (hash_table != NULL);    for (i = 0; i < hash_table->size; i++)    g_hash_nodes_destroy (hash_table->nodes[i], 			  hash_table->key_destroy_func,			  hash_table->value_destroy_func);    g_free (hash_table->nodes);  g_free (hash_table);}static inline GHashNode**g_hash_table_lookup_node (GHashTable	*hash_table,			  gconstpointer	 key){  GHashNode **node;    node = &hash_table->nodes    [(* hash_table->hash_func) (key) % hash_table->size];    /* Hash table lookup needs to be fast.   *  We therefore remove the extra conditional of testing   *  whether to call the key_equal_func or not from   *  the inner loop.   */  if (hash_table->key_equal_func)    while (*node && !(*hash_table->key_equal_func) ((*node)->key, key))      node = &(*node)->next;  else    while (*node && (*node)->key != key)      node = &(*node)->next;    return node;}/** * g_hash_table_lookup: * @hash_table: a #GHashTable. * @key: the key to look up. *  * Looks up a key in a #GHashTable. *  * Return value: the associated value, or %NULL if the key is not found. **/gpointerg_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);    return node ? node->value : NULL;}/** * 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. **/gbooleang_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);    if (node)    {      if (orig_key)	*orig_key = node->key;      if (value)	*value = node->value;      return TRUE;    }  else    return FALSE;}/** * 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. **/voidg_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);    }}/** * 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.  **/voidg_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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -