gpointer removed_node;
g_return_val_if_fail(array != NULL, NULL);
- g_return_val_if_fail(index >= 0 || index < array->len, NULL);
+ g_return_val_if_fail(index < array->len, NULL);
removed_node = array->pdata[index];
gpointer removed_node;
g_return_val_if_fail(array != NULL, NULL);
- g_return_val_if_fail(index >= 0 || index < array->len, NULL);
+ g_return_val_if_fail(index < array->len, NULL);
removed_node = array->pdata[index];
qsort(array->pdata, array->len, sizeof(gpointer), compare);
}
-static void
-g_qsort_swap (char *a, char *b, size_t n)
-{
- char *an = a + n;
- char tmp;
-
- do {
- tmp = *a;
- *a++ = *b;
- *b++ = tmp;
- } while (a < an);
-}
-
-static char *
-g_qsort_median (char *a, char *b, char *c, GCompareDataFunc compare, gpointer user_data)
-{
- if (compare (a, b, user_data) < 0) {
- /* a < b < c */
- if (compare (b, c, user_data) < 0)
- return b;
-
- /* a < c < b */
- if (compare (a, c, user_data) < 0)
- return c;
-
- /* c < a < b */
- return a;
- } else {
- /* b < a < c */
- if (compare (a, c, user_data) < 0)
- return a;
-
- /* b < c < a */
- if (compare (b, c, user_data) < 0)
- return c;
-
- /* c < b < a */
- return b;
- }
-}
-
-void
-g_qsort_with_data (gpointer base, size_t nmemb, size_t size, GCompareDataFunc compare, gpointer user_data)
-{
- char *middle = ((char *) base) + (nmemb / 2) * size;
- char *last = ((char *) base) + (nmemb - 1) * size;
- char *first = (char *) base;
- register char *i = first + size;
- register char *k = last;
- register char *pivot;
-
- if (nmemb <= 1)
- return;
-
- /* determine which element contains the median value */
- pivot = g_qsort_median (first, middle, last, compare, user_data);
-
- if (pivot != first) {
- /* swap pivot value into first element (so the location stays constant) */
- g_qsort_swap (first, pivot, size);
- pivot = first;
- }
-
- do {
- /* find the first element with a value > pivot value */
- while (i < k && compare (i, pivot, user_data) <= 0)
- i += size;
-
- /* find the last element with a value <= pivot value */
- while (k>= i && compare (k, pivot, user_data) > 0)
- k -= size;
-
- if (k <= i)
- break;
-
- g_qsort_swap (i, k, size);
- } while (1);
-
- if (k != pivot) {
- /* swap the pivot with the last element in the first partition */
- g_qsort_swap (pivot, k, size);
- }
-
- /* sort the first partition */
- g_qsort_with_data (first, (k - first) / size, size, compare, user_data);
-
- /* sort the second partition */
- g_qsort_with_data (k + size, (last - k) / size, size, compare, user_data);
-}
-
void
g_ptr_array_sort_with_data (GPtrArray *array, GCompareDataFunc compare, gpointer user_data)
{