mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-10 11:26:16 +01:00
Add g_hash_table_get_keys_as_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
This commit is contained in:
parent
415c6d2e27
commit
2880767702
@ -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
|
||||
|
46
glib/ghash.c
46
glib/ghash.c
@ -1645,6 +1645,52 @@ g_hash_table_get_keys (GHashTable *hash_table)
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user