* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
*
* This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Library General Public
+ * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
- * Modified by the GLib Team and others 1997-1999. See the AUTHORS
+ * Modified by the GLib Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GLib Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GLib at ftp://ftp.gtk.org/pub/gtk/.
* MT safe
*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
#include <string.h>
+#include <stdlib.h>
#include "glib.h"
g_array_elt_zero ((array), (array)->len, 1); \
}G_STMT_END
-static gint g_nearest_pow (gint num);
+static gint g_nearest_pow (gint num) G_GNUC_CONST;
static void g_array_maybe_expand (GRealArray *array,
gint len);
return (GArray*) array;
}
-void
+gchar*
g_array_free (GArray *array,
gboolean free_segment)
{
+ gchar* segment;
+
+ g_return_val_if_fail (array, NULL);
+
if (free_segment)
- g_free (array->data);
+ {
+ g_free (array->data);
+ segment = NULL;
+ }
+ else
+ segment = array->data;
G_LOCK (array_mem_chunk);
g_mem_chunk_free (array_mem_chunk, array);
G_UNLOCK (array_mem_chunk);
+
+ return segment;
}
GArray*
g_return_val_if_fail (array, NULL);
- g_return_val_if_fail (index >= 0 && index < array->len, NULL);
+ g_return_val_if_fail (index < array->len, NULL);
if (index != array->len - 1)
g_memmove (g_array_elt_pos (array, index),
GArray*
g_array_remove_index_fast (GArray* farray,
- guint index)
+ guint index)
{
GRealArray* array = (GRealArray*) farray;
g_return_val_if_fail (array, NULL);
- g_return_val_if_fail (index >= 0 && index < array->len, NULL);
+ g_return_val_if_fail (index < array->len, NULL);
if (index != array->len - 1)
g_memmove (g_array_elt_pos (array, index),
return farray;
}
+void
+g_array_sort (GArray *farray,
+ GCompareFunc compare_func)
+{
+ GRealArray *array = (GRealArray*) farray;
+
+ g_return_if_fail (array != NULL);
+ g_return_if_fail (array->data != NULL);
+
+ qsort (array->data,
+ array->len,
+ array->elt_size,
+ compare_func);
+}
+
+void
+g_array_sort_with_data (GArray *farray,
+ GCompareFuncData compare_func,
+ gpointer user_data)
+{
+ GRealArray *array = (GRealArray*) farray;
+
+ g_return_if_fail (array != NULL);
+ g_return_if_fail (array->data != NULL);
+
+ g_qsort_with_data (array->data,
+ array->len,
+ array->elt_size,
+ compare_func,
+ user_data);
+}
+
+
static gint
g_nearest_pow (gint num)
{
return (GPtrArray*) array;
}
-void
+gpointer*
g_ptr_array_free (GPtrArray *array,
gboolean free_segment)
{
- g_return_if_fail (array);
+ gpointer* segment;
+
+ g_return_val_if_fail (array, NULL);
if (free_segment)
- g_free (array->pdata);
+ {
+ g_free (array->pdata);
+ segment = NULL;
+ }
+ else
+ segment = array->pdata;
G_LOCK (ptr_array_mem_chunk);
g_mem_chunk_free (ptr_array_mem_chunk, array);
G_UNLOCK (ptr_array_mem_chunk);
+
+ return segment;
}
static void
gpointer
g_ptr_array_remove_index (GPtrArray* farray,
- guint index)
+ guint index)
{
GRealPtrArray* array = (GRealPtrArray*) farray;
gpointer result;
g_return_val_if_fail (array, NULL);
- g_return_val_if_fail (index >= 0 && index < array->len, NULL);
+ g_return_val_if_fail (index < array->len, NULL);
result = array->pdata[index];
gpointer
g_ptr_array_remove_index_fast (GPtrArray* farray,
- guint index)
+ guint index)
{
GRealPtrArray* array = (GRealPtrArray*) farray;
gpointer result;
g_return_val_if_fail (array, NULL);
- g_return_val_if_fail (index >= 0 && index < array->len, NULL);
+ g_return_val_if_fail (index < array->len, NULL);
result = array->pdata[index];
array->pdata[array->len++] = data;
}
+void
+g_ptr_array_sort (GPtrArray *array,
+ GCompareFunc compare_func)
+{
+ g_return_if_fail (array != NULL);
+ g_return_if_fail (array->pdata != NULL);
+
+ qsort (array->pdata,
+ array->len,
+ sizeof (gpointer),
+ compare_func);
+}
+
+void
+g_ptr_array_sort_with_data (GPtrArray *array,
+ GCompareFuncData compare_func,
+ gpointer user_data)
+{
+ g_return_if_fail (array != NULL);
+ g_return_if_fail (array->pdata != NULL);
+
+ g_qsort_with_data (array->pdata,
+ array->len,
+ sizeof (gpointer),
+ compare_func,
+ user_data);
+}
+
/* Byte arrays
*/
return (GByteArray*) g_array_sized_new (FALSE, FALSE, 1, reserved_size);
}
-void g_byte_array_free (GByteArray *array,
+guint8* g_byte_array_free (GByteArray *array,
gboolean free_segment)
{
- g_array_free ((GArray*) array, free_segment);
+ return (guint8*) g_array_free ((GArray*) array, free_segment);
}
GByteArray* g_byte_array_append (GByteArray *array,
}
GByteArray* g_byte_array_remove_index_fast (GByteArray *array,
- guint index)
+ guint index)
{
g_array_remove_index_fast((GArray*) array, index);
return array;
}
+
+void
+g_byte_array_sort (GByteArray *array,
+ GCompareFunc compare_func)
+{
+ g_array_sort ((GArray *) array, compare_func);
+}
+
+void
+g_byte_array_sort_with_data (GByteArray *array,
+ GCompareFuncData compare_func,
+ gpointer user_data)
+{
+ g_array_sort_with_data ((GArray *) array, compare_func, user_data);
+}