[msvc] Update csproj files
[mono.git] / eglib / src / gptrarray.c
index 4d9b96f7c5078130086dcf1f30e03ac23de61b4c..d3e540733bd1c896a68f42fe372bb27f0e2b49eb 100644 (file)
@@ -3,8 +3,10 @@
  *
  * Author:
  *   Aaron Bockover (abockover@novell.com)
+ *   Gonzalo Paniagua Javier (gonzalo@novell.com)
+ *   Jeffrey Stedfast (fejj@novell.com)
  *
- * (C) 2006 Novell, Inc.
+ * (C) 2006,2011 Novell, Inc.
  *
  * Permission is hereby granted, free of charge, to any person obtaining
  * a copy of this software and associated documentation files (the
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
  
-#define _GNU_SOURCE
 #include <stdlib.h>
 #include <glib.h>
 
-#define MAX(a,b) ((a) > (b) ? (a) : (b))
-
 typedef struct _GPtrArrayPriv {
        gpointer *pdata;
        guint len;
@@ -41,7 +40,7 @@ typedef struct _GPtrArrayPriv {
 static void 
 g_ptr_array_grow(GPtrArrayPriv *array, guint length)
 {
-       gint new_length = array->len + length;
+       guint new_length = array->len + length;
 
        g_return_if_fail(array != NULL);
 
@@ -60,7 +59,7 @@ g_ptr_array_grow(GPtrArrayPriv *array, guint length)
 }
 
 GPtrArray *
-g_ptr_array_new()
+g_ptr_array_new(void)
 {
        return g_ptr_array_sized_new(0);
 }
@@ -99,6 +98,20 @@ g_ptr_array_free(GPtrArray *array, gboolean free_seg)
        return data;
 }
 
+void
+g_ptr_array_set_size(GPtrArray *array, gint length)
+{
+       g_return_if_fail(array != NULL);
+
+       if((size_t)length > array->len) {
+               g_ptr_array_grow((GPtrArrayPriv *)array, length);
+               memset(array->pdata + array->len, 0, (length - array->len) 
+                       * sizeof(gpointer));
+       }
+
+       array->len = length;
+}
+
 void
 g_ptr_array_add(GPtrArray *array, gpointer data)
 {
@@ -107,13 +120,108 @@ g_ptr_array_add(GPtrArray *array, gpointer data)
        array->pdata[array->len++] = data;
 }
 
+gpointer
+g_ptr_array_remove_index(GPtrArray *array, guint index)
+{
+       gpointer removed_node;
+       
+       g_return_val_if_fail(array != NULL, NULL);
+       g_return_val_if_fail(index < array->len, NULL);
+
+       removed_node = array->pdata[index];
+
+       if(index != array->len - 1) {
+               g_memmove(array->pdata + index, array->pdata + index + 1,
+                       (array->len - index - 1) * sizeof(gpointer));
+       }
+       
+       array->len--;
+       array->pdata[array->len] = NULL;
+
+       return removed_node;
+}
+
+gpointer
+g_ptr_array_remove_index_fast(GPtrArray *array, guint index)
+{
+       gpointer removed_node;
+
+       g_return_val_if_fail(array != NULL, NULL);
+       g_return_val_if_fail(index < array->len, NULL);
+
+       removed_node = array->pdata[index];
+
+       if(index != array->len - 1) {
+               g_memmove(array->pdata + index, array->pdata + array->len - 1,
+                       sizeof(gpointer));
+       }
+
+       array->len--;
+       array->pdata[array->len] = NULL;
+
+       return removed_node;
+}
+
+gboolean
+g_ptr_array_remove(GPtrArray *array, gpointer data)
+{
+       guint i;
+
+       g_return_val_if_fail(array != NULL, FALSE);
+
+       for(i = 0; i < array->len; i++) {
+               if(array->pdata[i] == data) {
+                       g_ptr_array_remove_index(array, i);
+                       return TRUE;
+               }
+       }
+
+       return FALSE;
+}
+
+gboolean
+g_ptr_array_remove_fast(GPtrArray *array, gpointer data)
+{
+       guint i;
+
+       g_return_val_if_fail(array != NULL, FALSE);
+
+       for(i = 0; i < array->len; i++) {
+               if(array->pdata[i] == data) {
+                       array->len--;
+                       if (array->len > 0)
+                               array->pdata [i] = array->pdata [array->len];
+                       else
+                               array->pdata [i] = NULL;
+                       return TRUE;
+               }
+       }
+
+       return FALSE;
+}
+
 void 
 g_ptr_array_foreach(GPtrArray *array, GFunc func, gpointer user_data)
 {
-       gint i;
+       guint i;
 
        for(i = 0; i < array->len; i++) {
                func(g_ptr_array_index(array, i), user_data);
        }
 }
 
+void
+g_ptr_array_sort(GPtrArray *array, GCompareFunc compare)
+{
+       g_return_if_fail(array != NULL);
+       qsort(array->pdata, array->len, sizeof(gpointer), compare);
+}
+
+void
+g_ptr_array_sort_with_data (GPtrArray *array, GCompareDataFunc compare, gpointer user_data)
+{
+       g_return_if_fail (array != NULL);
+       
+       g_qsort_with_data (array->pdata, array->len, sizeof (gpointer), compare, user_data);
+}
+