[glib/wip/gsettings-work: 1/10] Add g_hash_table_get_key_array()
- From: Ryan Lortie <desrt src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/gsettings-work: 1/10] Add g_hash_table_get_key_array()
- Date: Sun, 27 Oct 2013 16:16:54 +0000 (UTC)
commit 3a97aa0b78f469b0f995fc778199aff6ce9209a6
Author: Ryan Lortie <desrt desrt ca>
Date: Sat Oct 26 18:48:42 2013 -0700
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(+), 0 deletions(-)
---
diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt
index 0414ed9..2dbaedf 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 9150f32..f44da3e 100644
--- a/glib/ghash.c
+++ b/glib/ghash.c
@@ -1646,6 +1646,46 @@ g_hash_table_get_keys (GHashTable *hash_table)
}
/**
+ * 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 19054bb..6025cc6 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,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]