• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GLIB - Library of useful routines for C programming
2  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19 
20 /*
21  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GLib Team.  See the ChangeLog
23  * files for a list of changes.  These files are distributed with
24  * GLib at ftp://ftp.gtk.org/pub/gtk/.
25  */
26 
27 /*
28  * MT safe
29  */
30 
31 #include "config.h"
32 
33 #include <string.h>  /* memset */
34 
35 #include "glib.h"
36 #include "galias.h"
37 
38 #define HASH_TABLE_MIN_SHIFT 3  /* 1 << 3 == 8 buckets */
39 
40 typedef struct _GHashNode      GHashNode;
41 
42 struct _GHashNode
43 {
44   gpointer   key;
45   gpointer   value;
46 
47   /* If key_hash == 0, node is not in use
48    * If key_hash == 1, node is a tombstone
49    * If key_hash >= 2, node contains data */
50   guint      key_hash;
51 };
52 
53 struct _GHashTable
54 {
55   gint             size;
56   gint             mod;
57   guint            mask;
58   gint             nnodes;
59   gint             noccupied;  /* nnodes + tombstones */
60   GHashNode       *nodes;
61   GHashFunc        hash_func;
62   GEqualFunc       key_equal_func;
63   volatile gint    ref_count;
64 #ifndef G_DISABLE_ASSERT
65   /*
66    * Tracks the structure of the hash table, not its contents: is only
67    * incremented when a node is added or removed (is not incremented
68    * when the key or data of a node is modified).
69    */
70   int              version;
71 #endif
72   GDestroyNotify   key_destroy_func;
73   GDestroyNotify   value_destroy_func;
74 };
75 
76 typedef struct
77 {
78   GHashTable  *hash_table;
79   gpointer     dummy1;
80   gpointer     dummy2;
81   int          position;
82   gboolean     dummy3;
83   int          version;
84 } RealIter;
85 
86 /* Each table size has an associated prime modulo (the first prime
87  * lower than the table size) used to find the initial bucket. Probing
88  * then works modulo 2^n. The prime modulo is necessary to get a
89  * good distribution with poor hash functions. */
90 static const gint prime_mod [] =
91 {
92   1,          /* For 1 << 0 */
93   2,
94   3,
95   7,
96   13,
97   31,
98   61,
99   127,
100   251,
101   509,
102   1021,
103   2039,
104   4093,
105   8191,
106   16381,
107   32749,
108   65521,      /* For 1 << 16 */
109   131071,
110   262139,
111   524287,
112   1048573,
113   2097143,
114   4194301,
115   8388593,
116   16777213,
117   33554393,
118   67108859,
119   134217689,
120   268435399,
121   536870909,
122   1073741789,
123   2147483647  /* For 1 << 31 */
124 };
125 
126 static void
g_hash_table_set_shift(GHashTable * hash_table,gint shift)127 g_hash_table_set_shift (GHashTable *hash_table, gint shift)
128 {
129   gint i;
130   guint mask = 0;
131 
132   hash_table->size = 1 << shift;
133   hash_table->mod  = prime_mod [shift];
134 
135   for (i = 0; i < shift; i++)
136     {
137       mask <<= 1;
138       mask |= 1;
139     }
140 
141   hash_table->mask = mask;
142 }
143 
144 static gint
g_hash_table_find_closest_shift(gint n)145 g_hash_table_find_closest_shift (gint n)
146 {
147   gint i;
148 
149   for (i = 0; n; i++)
150     n >>= 1;
151 
152   return i;
153 }
154 
155 static void
g_hash_table_set_shift_from_size(GHashTable * hash_table,gint size)156 g_hash_table_set_shift_from_size (GHashTable *hash_table, gint size)
157 {
158   gint shift;
159 
160   shift = g_hash_table_find_closest_shift (size);
161   shift = MAX (shift, HASH_TABLE_MIN_SHIFT);
162 
163   g_hash_table_set_shift (hash_table, shift);
164 }
165 
166 /*
167  * g_hash_table_lookup_node:
168  * @hash_table: our #GHashTable
169  * @key: the key to lookup against
170  * @hash_return: optional key hash return location
171  * Return value: index of the described #GHashNode
172  *
173  * Performs a lookup in the hash table.  Virtually all hash operations
174  * will use this function internally.
175  *
176  * This function first computes the hash value of the key using the
177  * user's hash function.
178  *
179  * If an entry in the table matching @key is found then this function
180  * returns the index of that entry in the table, and if not, the
181  * index of an empty node (never a tombstone).
182  */
183 static inline guint
g_hash_table_lookup_node(GHashTable * hash_table,gconstpointer key)184 g_hash_table_lookup_node (GHashTable    *hash_table,
185                           gconstpointer  key)
186 {
187   GHashNode *node;
188   guint node_index;
189   guint hash_value;
190   guint step = 0;
191 
192   /* Empty buckets have hash_value set to 0, and for tombstones, it's 1.
193    * We need to make sure our hash value is not one of these. */
194 
195   hash_value = (* hash_table->hash_func) (key);
196   if (G_UNLIKELY (hash_value <= 1))
197     hash_value = 2;
198 
199   node_index = hash_value % hash_table->mod;
200   node = &hash_table->nodes [node_index];
201 
202   while (node->key_hash)
203     {
204       /*  We first check if our full hash values
205        *  are equal so we can avoid calling the full-blown
206        *  key equality function in most cases.
207        */
208 
209       if (node->key_hash == hash_value)
210         {
211           if (hash_table->key_equal_func)
212             {
213               if (hash_table->key_equal_func (node->key, key))
214                 break;
215             }
216           else if (node->key == key)
217             {
218               break;
219             }
220         }
221 
222       step++;
223       node_index += step;
224       node_index &= hash_table->mask;
225       node = &hash_table->nodes [node_index];
226     }
227 
228   return node_index;
229 }
230 
231 /*
232  * g_hash_table_lookup_node_for_insertion:
233  * @hash_table: our #GHashTable
234  * @key: the key to lookup against
235  * @hash_return: key hash return location
236  * Return value: index of the described #GHashNode
237  *
238  * Performs a lookup in the hash table, preserving extra information
239  * usually needed for insertion.
240  *
241  * This function first computes the hash value of the key using the
242  * user's hash function.
243  *
244  * If an entry in the table matching @key is found then this function
245  * returns the index of that entry in the table, and if not, the
246  * index of an unused node (empty or tombstone) where the key can be
247  * inserted.
248  *
249  * The computed hash value is returned in the variable pointed to
250  * by @hash_return. This is to save insertions from having to compute
251  * the hash record again for the new record.
252  */
253 static inline guint
g_hash_table_lookup_node_for_insertion(GHashTable * hash_table,gconstpointer key,guint * hash_return)254 g_hash_table_lookup_node_for_insertion (GHashTable    *hash_table,
255                                         gconstpointer  key,
256                                         guint         *hash_return)
257 {
258   GHashNode *node;
259   guint node_index;
260   guint hash_value;
261   guint first_tombstone;
262   gboolean have_tombstone = FALSE;
263   guint step = 0;
264 
265   /* Empty buckets have hash_value set to 0, and for tombstones, it's 1.
266    * We need to make sure our hash value is not one of these. */
267 
268   hash_value = (* hash_table->hash_func) (key);
269   if (G_UNLIKELY (hash_value <= 1))
270     hash_value = 2;
271 
272   *hash_return = hash_value;
273 
274   node_index = hash_value % hash_table->mod;
275   node = &hash_table->nodes [node_index];
276 
277   while (node->key_hash)
278     {
279       /*  We first check if our full hash values
280        *  are equal so we can avoid calling the full-blown
281        *  key equality function in most cases.
282        */
283 
284       if (node->key_hash == hash_value)
285         {
286           if (hash_table->key_equal_func)
287             {
288               if (hash_table->key_equal_func (node->key, key))
289                 return node_index;
290             }
291           else if (node->key == key)
292             {
293               return node_index;
294             }
295         }
296       else if (node->key_hash == 1 && !have_tombstone)
297         {
298           first_tombstone = node_index;
299           have_tombstone = TRUE;
300         }
301 
302       step++;
303       node_index += step;
304       node_index &= hash_table->mask;
305       node = &hash_table->nodes [node_index];
306     }
307 
308   if (have_tombstone)
309     return first_tombstone;
310 
311   return node_index;
312 }
313 
314 /*
315  * g_hash_table_remove_node:
316  * @hash_table: our #GHashTable
317  * @node: pointer to node to remove
318  * @notify: %TRUE if the destroy notify handlers are to be called
319  *
320  * Removes a node from the hash table and updates the node count.
321  * The node is replaced by a tombstone. No table resize is performed.
322  *
323  * If @notify is %TRUE then the destroy notify functions are called
324  * for the key and value of the hash node.
325  */
326 static void
g_hash_table_remove_node(GHashTable * hash_table,GHashNode * node,gboolean notify)327 g_hash_table_remove_node (GHashTable   *hash_table,
328                           GHashNode    *node,
329                           gboolean      notify)
330 {
331   if (notify && hash_table->key_destroy_func)
332     hash_table->key_destroy_func (node->key);
333 
334   if (notify && hash_table->value_destroy_func)
335     hash_table->value_destroy_func (node->value);
336 
337   /* Erect tombstone */
338   node->key_hash = 1;
339 
340   /* Be GC friendly */
341   node->key = NULL;
342   node->value = NULL;
343 
344   hash_table->nnodes--;
345 }
346 
347 /*
348  * g_hash_table_remove_all_nodes:
349  * @hash_table: our #GHashTable
350  * @notify: %TRUE if the destroy notify handlers are to be called
351  *
352  * Removes all nodes from the table.  Since this may be a precursor to
353  * freeing the table entirely, no resize is performed.
354  *
355  * If @notify is %TRUE then the destroy notify functions are called
356  * for the key and value of the hash node.
357  */
358 static void
g_hash_table_remove_all_nodes(GHashTable * hash_table,gboolean notify)359 g_hash_table_remove_all_nodes (GHashTable *hash_table,
360                                gboolean    notify)
361 {
362   int i;
363 
364   for (i = 0; i < hash_table->size; i++)
365     {
366       GHashNode *node = &hash_table->nodes [i];
367 
368       if (node->key_hash > 1)
369         {
370           if (notify && hash_table->key_destroy_func)
371             hash_table->key_destroy_func (node->key);
372 
373           if (notify && hash_table->value_destroy_func)
374             hash_table->value_destroy_func (node->value);
375         }
376     }
377 
378   /* We need to set node->key_hash = 0 for all nodes - might as well be GC
379    * friendly and clear everything */
380   memset (hash_table->nodes, 0, hash_table->size * sizeof (GHashNode));
381 
382   hash_table->nnodes = 0;
383   hash_table->noccupied = 0;
384 }
385 
386 /*
387  * g_hash_table_resize:
388  * @hash_table: our #GHashTable
389  *
390  * Resizes the hash table to the optimal size based on the number of
391  * nodes currently held.  If you call this function then a resize will
392  * occur, even if one does not need to occur.  Use
393  * g_hash_table_maybe_resize() instead.
394  *
395  * This function may "resize" the hash table to its current size, with
396  * the side effect of cleaning up tombstones and otherwise optimizing
397  * the probe sequences.
398  */
399 static void
g_hash_table_resize(GHashTable * hash_table)400 g_hash_table_resize (GHashTable *hash_table)
401 {
402   GHashNode *new_nodes;
403   gint old_size;
404   gint i;
405 
406   old_size = hash_table->size;
407   g_hash_table_set_shift_from_size (hash_table, hash_table->nnodes * 2);
408 
409   new_nodes = g_new0 (GHashNode, hash_table->size);
410 
411   for (i = 0; i < old_size; i++)
412     {
413       GHashNode *node = &hash_table->nodes [i];
414       GHashNode *new_node;
415       guint hash_val;
416       guint step = 0;
417 
418       if (node->key_hash <= 1)
419         continue;
420 
421       hash_val = node->key_hash % hash_table->mod;
422       new_node = &new_nodes [hash_val];
423 
424       while (new_node->key_hash)
425         {
426           step++;
427           hash_val += step;
428           hash_val &= hash_table->mask;
429           new_node = &new_nodes [hash_val];
430         }
431 
432       *new_node = *node;
433     }
434 
435   g_free (hash_table->nodes);
436   hash_table->nodes = new_nodes;
437   hash_table->noccupied = hash_table->nnodes;
438 }
439 
440 /*
441  * g_hash_table_maybe_resize:
442  * @hash_table: our #GHashTable
443  *
444  * Resizes the hash table, if needed.
445  *
446  * Essentially, calls g_hash_table_resize() if the table has strayed
447  * too far from its ideal size for its number of nodes.
448  */
449 static inline void
g_hash_table_maybe_resize(GHashTable * hash_table)450 g_hash_table_maybe_resize (GHashTable *hash_table)
451 {
452   gint noccupied = hash_table->noccupied;
453   gint size = hash_table->size;
454 
455   if ((size > hash_table->nnodes * 4 && size > 1 << HASH_TABLE_MIN_SHIFT) ||
456       (size <= noccupied + (noccupied / 16)))
457     g_hash_table_resize (hash_table);
458 }
459 
460 /**
461  * g_hash_table_new:
462  * @hash_func: a function to create a hash value from a key.
463  *   Hash values are used to determine where keys are stored within the
464  *   #GHashTable data structure. The g_direct_hash(), g_int_hash() and
465  *   g_str_hash() functions are provided for some common types of keys.
466  *   If hash_func is %NULL, g_direct_hash() is used.
467  * @key_equal_func: a function to check two keys for equality.  This is
468  *   used when looking up keys in the #GHashTable.  The g_direct_equal(),
469  *   g_int_equal() and g_str_equal() functions are provided for the most
470  *   common types of keys. If @key_equal_func is %NULL, keys are compared
471  *   directly in a similar fashion to g_direct_equal(), but without the
472  *   overhead of a function call.
473  *
474  * Creates a new #GHashTable with a reference count of 1.
475  *
476  * Return value: a new #GHashTable.
477  **/
478 GHashTable*
g_hash_table_new(GHashFunc hash_func,GEqualFunc key_equal_func)479 g_hash_table_new (GHashFunc    hash_func,
480                   GEqualFunc   key_equal_func)
481 {
482   return g_hash_table_new_full (hash_func, key_equal_func, NULL, NULL);
483 }
484 
485 
486 /**
487  * g_hash_table_new_full:
488  * @hash_func: a function to create a hash value from a key.
489  * @key_equal_func: a function to check two keys for equality.
490  * @key_destroy_func: a function to free the memory allocated for the key
491  *   used when removing the entry from the #GHashTable or %NULL if you
492  *   don't want to supply such a function.
493  * @value_destroy_func: a function to free the memory allocated for the
494  *   value used when removing the entry from the #GHashTable or %NULL if
495  *   you don't want to supply such a function.
496  *
497  * Creates a new #GHashTable like g_hash_table_new() with a reference count
498  * of 1 and allows to specify functions to free the memory allocated for the
499  * key and value that get called when removing the entry from the #GHashTable.
500  *
501  * Return value: a new #GHashTable.
502  **/
503 GHashTable*
g_hash_table_new_full(GHashFunc hash_func,GEqualFunc key_equal_func,GDestroyNotify key_destroy_func,GDestroyNotify value_destroy_func)504 g_hash_table_new_full (GHashFunc       hash_func,
505                        GEqualFunc      key_equal_func,
506                        GDestroyNotify  key_destroy_func,
507                        GDestroyNotify  value_destroy_func)
508 {
509   GHashTable *hash_table;
510 
511   hash_table = g_slice_new (GHashTable);
512   g_hash_table_set_shift (hash_table, HASH_TABLE_MIN_SHIFT);
513   hash_table->nnodes             = 0;
514   hash_table->noccupied          = 0;
515   hash_table->hash_func          = hash_func ? hash_func : g_direct_hash;
516   hash_table->key_equal_func     = key_equal_func;
517   hash_table->ref_count          = 1;
518 #ifndef G_DISABLE_ASSERT
519   hash_table->version            = 0;
520 #endif
521   hash_table->key_destroy_func   = key_destroy_func;
522   hash_table->value_destroy_func = value_destroy_func;
523   hash_table->nodes              = g_new0 (GHashNode, hash_table->size);
524 
525   return hash_table;
526 }
527 
528 /**
529  * g_hash_table_iter_init:
530  * @iter: an uninitialized #GHashTableIter.
531  * @hash_table: a #GHashTable.
532  *
533  * Initializes a key/value pair iterator and associates it with
534  * @hash_table. Modifying the hash table after calling this function
535  * invalidates the returned iterator.
536  * |[
537  * GHashTableIter iter;
538  * gpointer key, value;
539  *
540  * g_hash_table_iter_init (&iter, hash_table);
541  * while (g_hash_table_iter_next (&iter, &key, &value))
542  *   {
543  *     /&ast; do something with key and value &ast;/
544  *   }
545  * ]|
546  *
547  * Since: 2.16
548  **/
549 void
g_hash_table_iter_init(GHashTableIter * iter,GHashTable * hash_table)550 g_hash_table_iter_init (GHashTableIter *iter,
551 			GHashTable     *hash_table)
552 {
553   RealIter *ri = (RealIter *) iter;
554 
555   g_return_if_fail (iter != NULL);
556   g_return_if_fail (hash_table != NULL);
557 
558   ri->hash_table = hash_table;
559   ri->position = -1;
560 #ifndef G_DISABLE_ASSERT
561   ri->version = hash_table->version;
562 #endif
563 }
564 
565 /**
566  * g_hash_table_iter_next:
567  * @iter: an initialized #GHashTableIter.
568  * @key: a location to store the key, or %NULL.
569  * @value: a location to store the value, or %NULL.
570  *
571  * Advances @iter and retrieves the key and/or value that are now
572  * pointed to as a result of this advancement. If %FALSE is returned,
573  * @key and @value are not set, and the iterator becomes invalid.
574  *
575  * Return value: %FALSE if the end of the #GHashTable has been reached.
576  *
577  * Since: 2.16
578  **/
579 gboolean
g_hash_table_iter_next(GHashTableIter * iter,gpointer * key,gpointer * value)580 g_hash_table_iter_next (GHashTableIter *iter,
581 			gpointer       *key,
582 			gpointer       *value)
583 {
584   RealIter *ri = (RealIter *) iter;
585   GHashNode *node;
586   gint position;
587 
588   g_return_val_if_fail (iter != NULL, FALSE);
589 #ifndef G_DISABLE_ASSERT
590   g_return_val_if_fail (ri->version == ri->hash_table->version, FALSE);
591 #endif
592   g_return_val_if_fail (ri->position < ri->hash_table->size, FALSE);
593 
594   position = ri->position;
595 
596   do
597     {
598       position++;
599       if (position >= ri->hash_table->size)
600         {
601           ri->position = position;
602           return FALSE;
603         }
604 
605       node = &ri->hash_table->nodes [position];
606     }
607   while (node->key_hash <= 1);
608 
609   if (key != NULL)
610     *key = node->key;
611   if (value != NULL)
612     *value = node->value;
613 
614   ri->position = position;
615   return TRUE;
616 }
617 
618 /**
619  * g_hash_table_iter_get_hash_table:
620  * @iter: an initialized #GHashTableIter.
621  *
622  * Returns the #GHashTable associated with @iter.
623  *
624  * Return value: the #GHashTable associated with @iter.
625  *
626  * Since: 2.16
627  **/
628 GHashTable *
g_hash_table_iter_get_hash_table(GHashTableIter * iter)629 g_hash_table_iter_get_hash_table (GHashTableIter *iter)
630 {
631   g_return_val_if_fail (iter != NULL, NULL);
632 
633   return ((RealIter *) iter)->hash_table;
634 }
635 
636 static void
iter_remove_or_steal(RealIter * ri,gboolean notify)637 iter_remove_or_steal (RealIter *ri, gboolean notify)
638 {
639   g_return_if_fail (ri != NULL);
640 #ifndef G_DISABLE_ASSERT
641   g_return_if_fail (ri->version == ri->hash_table->version);
642 #endif
643   g_return_if_fail (ri->position >= 0);
644   g_return_if_fail (ri->position < ri->hash_table->size);
645 
646   g_hash_table_remove_node (ri->hash_table, &ri->hash_table->nodes [ri->position], notify);
647 
648 #ifndef G_DISABLE_ASSERT
649   ri->version++;
650   ri->hash_table->version++;
651 #endif
652 }
653 
654 /**
655  * g_hash_table_iter_remove():
656  * @iter: an initialized #GHashTableIter.
657  *
658  * Removes the key/value pair currently pointed to by the iterator
659  * from its associated #GHashTable. Can only be called after
660  * g_hash_table_iter_next() returned %TRUE, and cannot be called more
661  * than once for the same key/value pair.
662  *
663  * If the #GHashTable was created using g_hash_table_new_full(), the
664  * key and value are freed using the supplied destroy functions, otherwise
665  * you have to make sure that any dynamically allocated values are freed
666  * yourself.
667  *
668  * Since: 2.16
669  **/
670 void
g_hash_table_iter_remove(GHashTableIter * iter)671 g_hash_table_iter_remove (GHashTableIter *iter)
672 {
673   iter_remove_or_steal ((RealIter *) iter, TRUE);
674 }
675 
676 /**
677  * g_hash_table_iter_steal():
678  * @iter: an initialized #GHashTableIter.
679  *
680  * Removes the key/value pair currently pointed to by the iterator
681  * from its associated #GHashTable, without calling the key and value
682  * destroy functions. Can only be called after
683  * g_hash_table_iter_next() returned %TRUE, and cannot be called more
684  * than once for the same key/value pair.
685  *
686  * Since: 2.16
687  **/
688 void
g_hash_table_iter_steal(GHashTableIter * iter)689 g_hash_table_iter_steal (GHashTableIter *iter)
690 {
691   iter_remove_or_steal ((RealIter *) iter, FALSE);
692 }
693 
694 
695 /**
696  * g_hash_table_ref:
697  * @hash_table: a valid #GHashTable.
698  *
699  * Atomically increments the reference count of @hash_table by one.
700  * This function is MT-safe and may be called from any thread.
701  *
702  * Return value: the passed in #GHashTable.
703  *
704  * Since: 2.10
705  **/
706 GHashTable*
g_hash_table_ref(GHashTable * hash_table)707 g_hash_table_ref (GHashTable *hash_table)
708 {
709   g_return_val_if_fail (hash_table != NULL, NULL);
710   g_return_val_if_fail (hash_table->ref_count > 0, hash_table);
711 
712   g_atomic_int_add (&hash_table->ref_count, 1);
713   return hash_table;
714 }
715 
716 /**
717  * g_hash_table_unref:
718  * @hash_table: a valid #GHashTable.
719  *
720  * Atomically decrements the reference count of @hash_table by one.
721  * If the reference count drops to 0, all keys and values will be
722  * destroyed, and all memory allocated by the hash table is released.
723  * This function is MT-safe and may be called from any thread.
724  *
725  * Since: 2.10
726  **/
727 void
g_hash_table_unref(GHashTable * hash_table)728 g_hash_table_unref (GHashTable *hash_table)
729 {
730   g_return_if_fail (hash_table != NULL);
731   g_return_if_fail (hash_table->ref_count > 0);
732 
733   if (g_atomic_int_exchange_and_add (&hash_table->ref_count, -1) - 1 == 0)
734     {
735       g_hash_table_remove_all_nodes (hash_table, TRUE);
736       g_free (hash_table->nodes);
737       g_slice_free (GHashTable, hash_table);
738     }
739 }
740 
741 /**
742  * g_hash_table_destroy:
743  * @hash_table: a #GHashTable.
744  *
745  * Destroys all keys and values in the #GHashTable and decrements its
746  * reference count by 1. If keys and/or values are dynamically allocated,
747  * you should either free them first or create the #GHashTable with destroy
748  * notifiers using g_hash_table_new_full(). In the latter case the destroy
749  * functions you supplied will be called on all keys and values during the
750  * destruction phase.
751  **/
752 void
g_hash_table_destroy(GHashTable * hash_table)753 g_hash_table_destroy (GHashTable *hash_table)
754 {
755   g_return_if_fail (hash_table != NULL);
756   g_return_if_fail (hash_table->ref_count > 0);
757 
758   g_hash_table_remove_all (hash_table);
759   g_hash_table_unref (hash_table);
760 }
761 
762 /**
763  * g_hash_table_lookup:
764  * @hash_table: a #GHashTable.
765  * @key: the key to look up.
766  *
767  * Looks up a key in a #GHashTable. Note that this function cannot
768  * distinguish between a key that is not present and one which is present
769  * and has the value %NULL. If you need this distinction, use
770  * g_hash_table_lookup_extended().
771  *
772  * Return value: the associated value, or %NULL if the key is not found.
773  **/
774 gpointer
g_hash_table_lookup(GHashTable * hash_table,gconstpointer key)775 g_hash_table_lookup (GHashTable   *hash_table,
776                      gconstpointer key)
777 {
778   GHashNode *node;
779   guint      node_index;
780 
781   g_return_val_if_fail (hash_table != NULL, NULL);
782 
783   node_index = g_hash_table_lookup_node (hash_table, key);
784   node = &hash_table->nodes [node_index];
785 
786   return node->key_hash ? node->value : NULL;
787 }
788 
789 /**
790  * g_hash_table_lookup_extended:
791  * @hash_table: a #GHashTable
792  * @lookup_key: the key to look up
793  * @orig_key: return location for the original key, or %NULL
794  * @value: return location for the value associated with the key, or %NULL
795  *
796  * Looks up a key in the #GHashTable, returning the original key and the
797  * associated value and a #gboolean which is %TRUE if the key was found. This
798  * is useful if you need to free the memory allocated for the original key,
799  * for example before calling g_hash_table_remove().
800  *
801  * You can actually pass %NULL for @lookup_key to test
802  * whether the %NULL key exists.
803  *
804  * Return value: %TRUE if the key was found in the #GHashTable.
805  **/
806 gboolean
g_hash_table_lookup_extended(GHashTable * hash_table,gconstpointer lookup_key,gpointer * orig_key,gpointer * value)807 g_hash_table_lookup_extended (GHashTable    *hash_table,
808                               gconstpointer  lookup_key,
809                               gpointer      *orig_key,
810                               gpointer      *value)
811 {
812   GHashNode *node;
813   guint      node_index;
814 
815   g_return_val_if_fail (hash_table != NULL, FALSE);
816 
817   node_index = g_hash_table_lookup_node (hash_table, lookup_key);
818   node = &hash_table->nodes [node_index];
819 
820   if (!node->key_hash)
821     return FALSE;
822 
823   if (orig_key)
824     *orig_key = node->key;
825 
826   if (value)
827     *value = node->value;
828 
829   return TRUE;
830 }
831 
832 /*
833  * g_hash_table_insert_internal:
834  * @hash_table: our #GHashTable
835  * @key: the key to insert
836  * @value: the value to insert
837  * @keep_new_key: if %TRUE and this key already exists in the table
838  *   then call the destroy notify function on the old key.  If %FALSE
839  *   then call the destroy notify function on the new key.
840  *
841  * Implements the common logic for the g_hash_table_insert() and
842  * g_hash_table_replace() functions.
843  *
844  * Do a lookup of @key.  If it is found, replace it with the new
845  * @value (and perhaps the new @key).  If it is not found, create a
846  * new node.
847  */
848 static void
g_hash_table_insert_internal(GHashTable * hash_table,gpointer key,gpointer value,gboolean keep_new_key)849 g_hash_table_insert_internal (GHashTable *hash_table,
850                               gpointer    key,
851                               gpointer    value,
852                               gboolean    keep_new_key)
853 {
854   GHashNode *node;
855   guint node_index;
856   guint key_hash;
857   guint old_hash;
858 
859   g_return_if_fail (hash_table != NULL);
860   g_return_if_fail (hash_table->ref_count > 0);
861 
862   node_index = g_hash_table_lookup_node_for_insertion (hash_table, key, &key_hash);
863   node = &hash_table->nodes [node_index];
864 
865   old_hash = node->key_hash;
866 
867   if (old_hash > 1)
868     {
869       if (keep_new_key)
870         {
871           if (hash_table->key_destroy_func)
872             hash_table->key_destroy_func (node->key);
873           node->key = key;
874         }
875       else
876         {
877           if (hash_table->key_destroy_func)
878             hash_table->key_destroy_func (key);
879         }
880 
881       if (hash_table->value_destroy_func)
882         hash_table->value_destroy_func (node->value);
883 
884       node->value = value;
885     }
886   else
887     {
888       node->key = key;
889       node->value = value;
890       node->key_hash = key_hash;
891 
892       hash_table->nnodes++;
893 
894       if (old_hash == 0)
895         {
896           /* We replaced an empty node, and not a tombstone */
897           hash_table->noccupied++;
898           g_hash_table_maybe_resize (hash_table);
899         }
900 
901 #ifndef G_DISABLE_ASSERT
902       hash_table->version++;
903 #endif
904     }
905 }
906 
907 /**
908  * g_hash_table_insert:
909  * @hash_table: a #GHashTable.
910  * @key: a key to insert.
911  * @value: the value to associate with the key.
912  *
913  * Inserts a new key and value into a #GHashTable.
914  *
915  * If the key already exists in the #GHashTable its current value is replaced
916  * with the new value. If you supplied a @value_destroy_func when creating the
917  * #GHashTable, the old value is freed using that function. If you supplied
918  * a @key_destroy_func when creating the #GHashTable, the passed key is freed
919  * using that function.
920  **/
921 void
g_hash_table_insert(GHashTable * hash_table,gpointer key,gpointer value)922 g_hash_table_insert (GHashTable *hash_table,
923                      gpointer    key,
924                      gpointer    value)
925 {
926   g_hash_table_insert_internal (hash_table, key, value, FALSE);
927 }
928 
929 /**
930  * g_hash_table_replace:
931  * @hash_table: a #GHashTable.
932  * @key: a key to insert.
933  * @value: the value to associate with the key.
934  *
935  * Inserts a new key and value into a #GHashTable similar to
936  * g_hash_table_insert(). The difference is that if the key already exists
937  * in the #GHashTable, it gets replaced by the new key. If you supplied a
938  * @value_destroy_func when creating the #GHashTable, the old value is freed
939  * using that function. If you supplied a @key_destroy_func when creating the
940  * #GHashTable, the old key is freed using that function.
941  **/
942 void
g_hash_table_replace(GHashTable * hash_table,gpointer key,gpointer value)943 g_hash_table_replace (GHashTable *hash_table,
944                       gpointer    key,
945                       gpointer    value)
946 {
947   g_hash_table_insert_internal (hash_table, key, value, TRUE);
948 }
949 
950 /*
951  * g_hash_table_remove_internal:
952  * @hash_table: our #GHashTable
953  * @key: the key to remove
954  * @notify: %TRUE if the destroy notify handlers are to be called
955  * Return value: %TRUE if a node was found and removed, else %FALSE
956  *
957  * Implements the common logic for the g_hash_table_remove() and
958  * g_hash_table_steal() functions.
959  *
960  * Do a lookup of @key and remove it if it is found, calling the
961  * destroy notify handlers only if @notify is %TRUE.
962  */
963 static gboolean
g_hash_table_remove_internal(GHashTable * hash_table,gconstpointer key,gboolean notify)964 g_hash_table_remove_internal (GHashTable    *hash_table,
965                               gconstpointer  key,
966                               gboolean       notify)
967 {
968   GHashNode *node;
969   guint node_index;
970 
971   g_return_val_if_fail (hash_table != NULL, FALSE);
972 
973   node_index = g_hash_table_lookup_node (hash_table, key);
974   node = &hash_table->nodes [node_index];
975 
976   /* g_hash_table_lookup_node() never returns a tombstone, so this is safe */
977   if (!node->key_hash)
978     return FALSE;
979 
980   g_hash_table_remove_node (hash_table, node, notify);
981   g_hash_table_maybe_resize (hash_table);
982 
983 #ifndef G_DISABLE_ASSERT
984   hash_table->version++;
985 #endif
986 
987   return TRUE;
988 }
989 
990 /**
991  * g_hash_table_remove:
992  * @hash_table: a #GHashTable.
993  * @key: the key to remove.
994  *
995  * Removes a key and its associated value from a #GHashTable.
996  *
997  * If the #GHashTable was created using g_hash_table_new_full(), the
998  * key and value are freed using the supplied destroy functions, otherwise
999  * you have to make sure that any dynamically allocated values are freed
1000  * yourself.
1001  *
1002  * Return value: %TRUE if the key was found and removed from the #GHashTable.
1003  **/
1004 gboolean
g_hash_table_remove(GHashTable * hash_table,gconstpointer key)1005 g_hash_table_remove (GHashTable    *hash_table,
1006                      gconstpointer  key)
1007 {
1008   return g_hash_table_remove_internal (hash_table, key, TRUE);
1009 }
1010 
1011 /**
1012  * g_hash_table_steal:
1013  * @hash_table: a #GHashTable.
1014  * @key: the key to remove.
1015  *
1016  * Removes a key and its associated value from a #GHashTable without
1017  * calling the key and value destroy functions.
1018  *
1019  * Return value: %TRUE if the key was found and removed from the #GHashTable.
1020  **/
1021 gboolean
g_hash_table_steal(GHashTable * hash_table,gconstpointer key)1022 g_hash_table_steal (GHashTable    *hash_table,
1023                     gconstpointer  key)
1024 {
1025   return g_hash_table_remove_internal (hash_table, key, FALSE);
1026 }
1027 
1028 /**
1029  * g_hash_table_remove_all:
1030  * @hash_table: a #GHashTable
1031  *
1032  * Removes all keys and their associated values from a #GHashTable.
1033  *
1034  * If the #GHashTable was created using g_hash_table_new_full(), the keys
1035  * and values are freed using the supplied destroy functions, otherwise you
1036  * have to make sure that any dynamically allocated values are freed
1037  * yourself.
1038  *
1039  * Since: 2.12
1040  **/
1041 void
g_hash_table_remove_all(GHashTable * hash_table)1042 g_hash_table_remove_all (GHashTable *hash_table)
1043 {
1044   g_return_if_fail (hash_table != NULL);
1045 
1046 #ifndef G_DISABLE_ASSERT
1047   if (hash_table->nnodes != 0)
1048     hash_table->version++;
1049 #endif
1050 
1051   g_hash_table_remove_all_nodes (hash_table, TRUE);
1052   g_hash_table_maybe_resize (hash_table);
1053 }
1054 
1055 /**
1056  * g_hash_table_steal_all:
1057  * @hash_table: a #GHashTable.
1058  *
1059  * Removes all keys and their associated values from a #GHashTable
1060  * without calling the key and value destroy functions.
1061  *
1062  * Since: 2.12
1063  **/
1064 void
g_hash_table_steal_all(GHashTable * hash_table)1065 g_hash_table_steal_all (GHashTable *hash_table)
1066 {
1067   g_return_if_fail (hash_table != NULL);
1068 
1069 #ifndef G_DISABLE_ASSERT
1070   if (hash_table->nnodes != 0)
1071     hash_table->version++;
1072 #endif
1073 
1074   g_hash_table_remove_all_nodes (hash_table, FALSE);
1075   g_hash_table_maybe_resize (hash_table);
1076 }
1077 
1078 /*
1079  * g_hash_table_foreach_remove_or_steal:
1080  * @hash_table: our #GHashTable
1081  * @func: the user's callback function
1082  * @user_data: data for @func
1083  * @notify: %TRUE if the destroy notify handlers are to be called
1084  *
1085  * Implements the common logic for g_hash_table_foreach_remove() and
1086  * g_hash_table_foreach_steal().
1087  *
1088  * Iterates over every node in the table, calling @func with the key
1089  * and value of the node (and @user_data).  If @func returns %TRUE the
1090  * node is removed from the table.
1091  *
1092  * If @notify is true then the destroy notify handlers will be called
1093  * for each removed node.
1094  */
1095 static guint
g_hash_table_foreach_remove_or_steal(GHashTable * hash_table,GHRFunc func,gpointer user_data,gboolean notify)1096 g_hash_table_foreach_remove_or_steal (GHashTable *hash_table,
1097                                       GHRFunc	  func,
1098                                       gpointer    user_data,
1099                                       gboolean    notify)
1100 {
1101   guint deleted = 0;
1102   gint i;
1103 
1104   for (i = 0; i < hash_table->size; i++)
1105     {
1106       GHashNode *node = &hash_table->nodes [i];
1107 
1108       if (node->key_hash > 1 && (* func) (node->key, node->value, user_data))
1109         {
1110           g_hash_table_remove_node (hash_table, node, notify);
1111           deleted++;
1112         }
1113     }
1114 
1115   g_hash_table_maybe_resize (hash_table);
1116 
1117 #ifndef G_DISABLE_ASSERT
1118   if (deleted > 0)
1119     hash_table->version++;
1120 #endif
1121 
1122   return deleted;
1123 }
1124 
1125 /**
1126  * g_hash_table_foreach_remove:
1127  * @hash_table: a #GHashTable.
1128  * @func: the function to call for each key/value pair.
1129  * @user_data: user data to pass to the function.
1130  *
1131  * Calls the given function for each key/value pair in the #GHashTable.
1132  * If the function returns %TRUE, then the key/value pair is removed from the
1133  * #GHashTable. If you supplied key or value destroy functions when creating
1134  * the #GHashTable, they are used to free the memory allocated for the removed
1135  * keys and values.
1136  *
1137  * See #GHashTableIter for an alternative way to loop over the
1138  * key/value pairs in the hash table.
1139  *
1140  * Return value: the number of key/value pairs removed.
1141  **/
1142 guint
g_hash_table_foreach_remove(GHashTable * hash_table,GHRFunc func,gpointer user_data)1143 g_hash_table_foreach_remove (GHashTable *hash_table,
1144                              GHRFunc     func,
1145                              gpointer    user_data)
1146 {
1147   g_return_val_if_fail (hash_table != NULL, 0);
1148   g_return_val_if_fail (func != NULL, 0);
1149 
1150   return g_hash_table_foreach_remove_or_steal (hash_table, func, user_data, TRUE);
1151 }
1152 
1153 /**
1154  * g_hash_table_foreach_steal:
1155  * @hash_table: a #GHashTable.
1156  * @func: the function to call for each key/value pair.
1157  * @user_data: user data to pass to the function.
1158  *
1159  * Calls the given function for each key/value pair in the #GHashTable.
1160  * If the function returns %TRUE, then the key/value pair is removed from the
1161  * #GHashTable, but no key or value destroy functions are called.
1162  *
1163  * See #GHashTableIter for an alternative way to loop over the
1164  * key/value pairs in the hash table.
1165  *
1166  * Return value: the number of key/value pairs removed.
1167  **/
1168 guint
g_hash_table_foreach_steal(GHashTable * hash_table,GHRFunc func,gpointer user_data)1169 g_hash_table_foreach_steal (GHashTable *hash_table,
1170                             GHRFunc     func,
1171                             gpointer    user_data)
1172 {
1173   g_return_val_if_fail (hash_table != NULL, 0);
1174   g_return_val_if_fail (func != NULL, 0);
1175 
1176   return g_hash_table_foreach_remove_or_steal (hash_table, func, user_data, FALSE);
1177 }
1178 
1179 /**
1180  * g_hash_table_foreach:
1181  * @hash_table: a #GHashTable.
1182  * @func: the function to call for each key/value pair.
1183  * @user_data: user data to pass to the function.
1184  *
1185  * Calls the given function for each of the key/value pairs in the
1186  * #GHashTable.  The function is passed the key and value of each
1187  * pair, and the given @user_data parameter.  The hash table may not
1188  * be modified while iterating over it (you can't add/remove
1189  * items). To remove all items matching a predicate, use
1190  * g_hash_table_foreach_remove().
1191  *
1192  * See g_hash_table_find() for performance caveats for linear
1193  * order searches in contrast to g_hash_table_lookup().
1194  **/
1195 void
g_hash_table_foreach(GHashTable * hash_table,GHFunc func,gpointer user_data)1196 g_hash_table_foreach (GHashTable *hash_table,
1197                       GHFunc      func,
1198                       gpointer    user_data)
1199 {
1200   gint i;
1201 
1202   g_return_if_fail (hash_table != NULL);
1203   g_return_if_fail (func != NULL);
1204 
1205   for (i = 0; i < hash_table->size; i++)
1206     {
1207       GHashNode *node = &hash_table->nodes [i];
1208 
1209       if (node->key_hash > 1)
1210         (* func) (node->key, node->value, user_data);
1211     }
1212 }
1213 
1214 /**
1215  * g_hash_table_find:
1216  * @hash_table: a #GHashTable.
1217  * @predicate:  function to test the key/value pairs for a certain property.
1218  * @user_data:  user data to pass to the function.
1219  *
1220  * Calls the given function for key/value pairs in the #GHashTable until
1221  * @predicate returns %TRUE.  The function is passed the key and value of
1222  * each pair, and the given @user_data parameter. The hash table may not
1223  * be modified while iterating over it (you can't add/remove items).
1224  *
1225  * Note, that hash tables are really only optimized for forward lookups,
1226  * i.e. g_hash_table_lookup().
1227  * So code that frequently issues g_hash_table_find() or
1228  * g_hash_table_foreach() (e.g. in the order of once per every entry in a
1229  * hash table) should probably be reworked to use additional or different
1230  * data structures for reverse lookups (keep in mind that an O(n) find/foreach
1231  * operation issued for all n values in a hash table ends up needing O(n*n)
1232  * operations).
1233  *
1234  * Return value: The value of the first key/value pair is returned, for which
1235  * func evaluates to %TRUE. If no pair with the requested property is found,
1236  * %NULL is returned.
1237  *
1238  * Since: 2.4
1239  **/
1240 gpointer
g_hash_table_find(GHashTable * hash_table,GHRFunc predicate,gpointer user_data)1241 g_hash_table_find (GHashTable      *hash_table,
1242                    GHRFunc          predicate,
1243                    gpointer         user_data)
1244 {
1245   gint i;
1246 
1247   g_return_val_if_fail (hash_table != NULL, NULL);
1248   g_return_val_if_fail (predicate != NULL, NULL);
1249 
1250   for (i = 0; i < hash_table->size; i++)
1251     {
1252       GHashNode *node = &hash_table->nodes [i];
1253 
1254       if (node->key_hash > 1 && predicate (node->key, node->value, user_data))
1255         return node->value;
1256     }
1257 
1258   return NULL;
1259 }
1260 
1261 /**
1262  * g_hash_table_size:
1263  * @hash_table: a #GHashTable.
1264  *
1265  * Returns the number of elements contained in the #GHashTable.
1266  *
1267  * Return value: the number of key/value pairs in the #GHashTable.
1268  **/
1269 guint
g_hash_table_size(GHashTable * hash_table)1270 g_hash_table_size (GHashTable *hash_table)
1271 {
1272   g_return_val_if_fail (hash_table != NULL, 0);
1273 
1274   return hash_table->nnodes;
1275 }
1276 
1277 /**
1278  * g_hash_table_get_keys:
1279  * @hash_table: a #GHashTable
1280  *
1281  * Retrieves every key inside @hash_table. The returned data is valid
1282  * until @hash_table is modified.
1283  *
1284  * Return value: a #GList containing all the keys inside the hash
1285  *   table. The content of the list is owned by the hash table and
1286  *   should not be modified or freed. Use g_list_free() when done
1287  *   using the list.
1288  *
1289  * Since: 2.14
1290  */
1291 GList *
g_hash_table_get_keys(GHashTable * hash_table)1292 g_hash_table_get_keys (GHashTable *hash_table)
1293 {
1294   gint i;
1295   GList *retval;
1296 
1297   g_return_val_if_fail (hash_table != NULL, NULL);
1298 
1299   retval = NULL;
1300   for (i = 0; i < hash_table->size; i++)
1301     {
1302       GHashNode *node = &hash_table->nodes [i];
1303 
1304       if (node->key_hash > 1)
1305         retval = g_list_prepend (retval, node->key);
1306     }
1307 
1308   return retval;
1309 }
1310 
1311 /**
1312  * g_hash_table_get_values:
1313  * @hash_table: a #GHashTable
1314  *
1315  * Retrieves every value inside @hash_table. The returned data is
1316  * valid until @hash_table is modified.
1317  *
1318  * Return value: a #GList containing all the values inside the hash
1319  *   table. The content of the list is owned by the hash table and
1320  *   should not be modified or freed. Use g_list_free() when done
1321  *   using the list.
1322  *
1323  * Since: 2.14
1324  */
1325 GList *
g_hash_table_get_values(GHashTable * hash_table)1326 g_hash_table_get_values (GHashTable *hash_table)
1327 {
1328   gint i;
1329   GList *retval;
1330 
1331   g_return_val_if_fail (hash_table != NULL, NULL);
1332 
1333   retval = NULL;
1334   for (i = 0; i < hash_table->size; i++)
1335     {
1336       GHashNode *node = &hash_table->nodes [i];
1337 
1338       if (node->key_hash > 1)
1339         retval = g_list_prepend (retval, node->value);
1340     }
1341 
1342   return retval;
1343 }
1344 
1345 #define __G_HASH_C__
1346 #include "galiasdef.c"
1347