From 3a97aa0b78f469b0f995fc778199aff6ce9209a6 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Sat, 26 Oct 2013 18:48:42 -0700 Subject: [PATCH] Add g_hash_table_get_key_array() Returns a %NULL-terminated array of the keys of a hashtable. In the case that the hash table has strings for keys, this is actually a gchar**. https://bugzilla.gnome.org/show_bug.cgi?id=710964 --- docs/reference/glib/glib-sections.txt | 1 + glib/ghash.c | 40 +++++++++++++++++++++++++++ glib/ghash.h | 3 ++ 3 files changed, 44 insertions(+) diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index 0414ed99e..2dbaedf07 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -2296,6 +2296,7 @@ g_hash_table_remove_all g_hash_table_steal_all g_hash_table_get_keys g_hash_table_get_values +g_hash_table_get_key_array GHRFunc g_hash_table_freeze g_hash_table_thaw diff --git a/glib/ghash.c b/glib/ghash.c index 9150f3257..f44da3ec5 100644 --- a/glib/ghash.c +++ b/glib/ghash.c @@ -1645,6 +1645,46 @@ g_hash_table_get_keys (GHashTable *hash_table) return retval; } +/** + * g_hash_table_get_key_array: + * @hash_table: a #GHashTable + * @length: (out): the length of the returned array + * + * Retrieves every key inside @hash_table, as an array. + * + * The returned array is %NULL-terminated but may contain %NULL as a + * key. Use @length to determine the true length if it's possible that + * %NULL was used as the value for a key. + * + * Note: in the common case of a string-keyed #GHashTable, the return + * value of this function can be conveniently cast to (gchar **). + * + * Returns: a %NULL-terminated array containing each key from the table. + * + * Since: 2.40 + **/ +gpointer * +g_hash_table_get_key_array (GHashTable *hash_table, + guint *length) +{ + gpointer *result; + guint i, j = 0; + + result = g_new (gpointer, hash_table->nnodes + 1); + for (i = 0; i < hash_table->size; i++) + { + if (HASH_IS_REAL (hash_table->hashes[i])) + result[j++] = hash_table->keys[i]; + } + g_assert_cmpint (j, ==, hash_table->nnodes); + result[j] = NULL; + + if (length) + *length = j; + + return result; +} + /** * g_hash_table_get_values: * @hash_table: a #GHashTable diff --git a/glib/ghash.h b/glib/ghash.h index 19054bb55..6025cc6bd 100644 --- a/glib/ghash.h +++ b/glib/ghash.h @@ -119,6 +119,9 @@ GLIB_AVAILABLE_IN_ALL GList * g_hash_table_get_keys (GHashTable *hash_table); GLIB_AVAILABLE_IN_ALL GList * g_hash_table_get_values (GHashTable *hash_table); +GLIB_AVAILABLE_IN_2_40 +gpointer * g_hash_table_get_key_array (GHashTable *hash_table, + guint *length); GLIB_AVAILABLE_IN_ALL void g_hash_table_iter_init (GHashTableIter *iter,