Add g_hash_table_get_keys_as_array()
authorRyan Lortie <desrt@desrt.ca>
Sun, 27 Oct 2013 01:48:42 +0000 (18:48 -0700)
committerRyan Lortie <desrt@desrt.ca>
Sun, 27 Oct 2013 16:26:53 +0000 (09:26 -0700)
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
glib/ghash.c
glib/ghash.h

index 0414ed9..9613a5f 100644 (file)
@@ -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_keys_as_array
 GHRFunc
 g_hash_table_freeze
 g_hash_table_thaw
index 9150f32..9fcdcc7 100644 (file)
@@ -1646,6 +1646,52 @@ g_hash_table_get_keys (GHashTable *hash_table)
 }
 
 /**
+ * g_hash_table_get_keys_as_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 **).
+ *
+ * You should always free the return result with g_free().  In the
+ * above-mentioned case of a string-keyed hash table, it may be
+ * appropriate to use g_strfreev() if you call g_hash_table_steal_all()
+ * first to transfer ownership of the keys.
+ *
+ * Returns: (array length=length) (transfer container): a
+ *   %NULL-terminated array containing each key from the table.
+ *
+ * Since: 2.40
+ **/
+gpointer *
+g_hash_table_get_keys_as_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
  *
index 19054bb..796f744 100644 (file)
@@ -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_keys_as_array (GHashTable     *hash_table,
+                                            guint          *length);
 
 GLIB_AVAILABLE_IN_ALL
 void        g_hash_table_iter_init         (GHashTableIter *iter,