The second post in a little mini-series on new APIs in the GLib 2.62 series, this one’s about Christian Hergert’s g_queue_insert_before_link()
.
This is a new helper function for inserting elements at arbitrary positions in a queue, without needing to allocate a new container element for them. Previously, using g_queue_insert_before()
, a new GList
container would have been allocated. The new function means that elements can be moved from one position in a queue to another, without any allocations; and statically allocated GList
elements can be used in a GQueue
correctly.
The new function comes with friends, too: g_queue_insert_after_link()
and g_list_insert_before_link()
. They behave similarly.
One example of using the new function would be to bump the priority of an element in the middle of a queue:
GList *element_to_bump = g_queue_find (queue, important_data);
GList *old_sibling = element_to_bump->prev;
if (old_sibling != NULL)
{
g_queue_unlink (queue, element_to_bump);
g_queue_insert_before_link (queue, old_sibling, element_to_bump);
}
else
{
g_debug ("Already at the head of the queue");
}
Christian is using it in GNOME Builder to arrange embedded structures in a queue using embedded GList
instances, kernel-style.
Pingback: Array copying and extending in GLib 2.61.2 | drboblog
Pingback: g_array_binary_search in GLib 2.61.2 | drboblog
Pingback: g_assert_finalize_object() in GLib 2.61.2 | drboblog