diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index e765ef4fa..853c793a0 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -2380,6 +2380,7 @@ GPtrArray g_ptr_array_new g_ptr_array_sized_new g_ptr_array_new_with_free_func +g_ptr_array_new_full g_ptr_array_set_free_func g_ptr_array_ref g_ptr_array_unref diff --git a/glib/garray.c b/glib/garray.c index fa6160b31..07149b0bb 100644 --- a/glib/garray.c +++ b/glib/garray.c @@ -836,6 +836,34 @@ g_ptr_array_new_with_free_func (GDestroyNotify element_free_func) return array; } +/** + * g_ptr_array_new_full: + * @reserved_size: number of pointers preallocated. + * @element_free_func: A function to free elements with destroy @array or %NULL. + * + * Creates a new #GPtrArray with @reserved_size pointers preallocated + * and a reference count of 1. This avoids frequent reallocation, if + * you are going to add many pointers to the array. Note however that + * the size of the array is still 0. It also set @element_free_func + * for freeing each element when the array is destroyed either via + * g_ptr_array_unref(), when g_ptr_array_free() is called with @free_segment + * set to %TRUE or when removing elements. + * + * Returns: A new #GPtrArray. + * + * Since: 2.30 + **/ +GPtrArray * +g_ptr_array_new_full (guint reserved_size, + GDestroyNotify element_free_func) +{ + GPtrArray *array; + + array = g_ptr_array_sized_new (reserved_size); + g_ptr_array_set_free_func (array, element_free_func); + return array; +} + /** * g_ptr_array_set_free_func: * @array: A #GPtrArray. diff --git a/glib/garray.h b/glib/garray.h index 6bc51f797..822180641 100644 --- a/glib/garray.h +++ b/glib/garray.h @@ -112,6 +112,8 @@ void g_array_sort_with_data (GArray *array, GPtrArray* g_ptr_array_new (void); GPtrArray* g_ptr_array_new_with_free_func (GDestroyNotify element_free_func); GPtrArray* g_ptr_array_sized_new (guint reserved_size); +GPtrArray* g_ptr_array_new_full (guint reserved_size, + GDestroyNotify element_free_func); gpointer* g_ptr_array_free (GPtrArray *array, gboolean free_seg); GPtrArray* g_ptr_array_ref (GPtrArray *array);