GPtrArray: Added g_ptr_array_insert()
authorTristan Van Berkom <tristan.van.berkom@gmail.com>
Wed, 27 Nov 2013 05:34:20 +0000 (14:34 +0900)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 15 Dec 2013 04:41:44 +0000 (23:41 -0500)
Speaks for itself, I've found myself on numerous occasions
writing my own version of this, or using a GArray of pointers.

https://bugzilla.gnome.org/show_bug.cgi?id=719395

glib/garray.c
glib/garray.h

index 062d568..a9c99b2 100644 (file)
@@ -1383,6 +1383,42 @@ g_ptr_array_add (GPtrArray *farray,
 }
 
 /**
+ * g_ptr_array_insert:
+ * @array: a #GPtrArray.
+ * @index_: the index to place the new element at, or -1 to append.
+ * @data: the pointer to add.
+ *
+ * Inserts an element into the pointer array at the given index. The 
+ * array will grow in size automatically if necessary.
+ *
+ * Since: 2.40
+ **/
+void
+g_ptr_array_insert (GPtrArray *farray,
+                    gint       index_,
+                    gpointer   data)
+{
+  GRealPtrArray* array = (GRealPtrArray*) farray;
+
+  g_return_if_fail (array);
+  g_return_if_fail (index_ >= -1);
+  g_return_if_fail (index_ <= (gint)array->len);
+
+  g_ptr_array_maybe_expand (array, 1);
+
+  if (index_ < 0)
+    index_ = array->len;
+
+  if (index_ < array->len)
+    memmove (&(array->pdata[index_ + 1]),
+             &(array->pdata[index_]),
+             (array->len - index_) * sizeof (gpointer));
+
+  array->len++;
+  array->pdata[index_] = data;
+}
+
+/**
  * g_ptr_array_sort:
  * @array: a #GPtrArray.
  * @compare_func: comparison function.
index 018436f..7fe8c2f 100644 (file)
@@ -169,6 +169,10 @@ GPtrArray *g_ptr_array_remove_range       (GPtrArray        *array,
 GLIB_AVAILABLE_IN_ALL
 void       g_ptr_array_add                (GPtrArray        *array,
                                           gpointer          data);
+GLIB_AVAILABLE_IN_2_40
+void       g_ptr_array_insert             (GPtrArray        *farray,
+                                           gint              index_,
+                                           gpointer          data);
 GLIB_AVAILABLE_IN_ALL
 void       g_ptr_array_sort               (GPtrArray        *array,
                                           GCompareFunc      compare_func);