mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-23 10:42:11 +01:00
Make g_array_sort* methods use a stable sort
Also, remove previous comments about sort stability in g_array_sort docs, as the method that was explained does not work. Adds a new comment about this. https://bugzilla.gnome.org/show_bug.cgi?id=672095
This commit is contained in:
parent
839957f275
commit
a43dd7435a
@ -693,11 +693,7 @@ g_array_remove_range (GArray *farray,
|
|||||||
* than second arg, zero for equal, greater zero if first arg is
|
* than second arg, zero for equal, greater zero if first arg is
|
||||||
* greater than second arg).
|
* greater than second arg).
|
||||||
*
|
*
|
||||||
* If two array elements compare equal, their order in the sorted array
|
* This is guaranteed to be a stable sort since version 2.32.
|
||||||
* is undefined. If you want equal elements to keep their order (i.e.
|
|
||||||
* you want a stable sort) you can write a comparison function that,
|
|
||||||
* if two elements would otherwise compare equal, compares them by
|
|
||||||
* their addresses.
|
|
||||||
**/
|
**/
|
||||||
void
|
void
|
||||||
g_array_sort (GArray *farray,
|
g_array_sort (GArray *farray,
|
||||||
@ -707,10 +703,12 @@ g_array_sort (GArray *farray,
|
|||||||
|
|
||||||
g_return_if_fail (array != NULL);
|
g_return_if_fail (array != NULL);
|
||||||
|
|
||||||
qsort (array->data,
|
/* Don't use qsort as we want a guaranteed stable sort */
|
||||||
array->len,
|
g_qsort_with_data (array->data,
|
||||||
array->elt_size,
|
array->len,
|
||||||
compare_func);
|
array->elt_size,
|
||||||
|
(GCompareDataFunc)compare_func,
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -721,6 +719,12 @@ g_array_sort (GArray *farray,
|
|||||||
*
|
*
|
||||||
* Like g_array_sort(), but the comparison function receives an extra
|
* Like g_array_sort(), but the comparison function receives an extra
|
||||||
* user data argument.
|
* user data argument.
|
||||||
|
*
|
||||||
|
* This is guaranteed to be a stable sort since version 2.32.
|
||||||
|
*
|
||||||
|
* There used to be a comment here about making the sort stable by
|
||||||
|
* using the addresses of the elements in the comparison function.
|
||||||
|
* This did not actually work, so any such code should be removed.
|
||||||
**/
|
**/
|
||||||
void
|
void
|
||||||
g_array_sort_with_data (GArray *farray,
|
g_array_sort_with_data (GArray *farray,
|
||||||
@ -1358,15 +1362,11 @@ g_ptr_array_add (GPtrArray *farray,
|
|||||||
* than second arg, zero for equal, greater than zero if irst arg is
|
* than second arg, zero for equal, greater than zero if irst arg is
|
||||||
* greater than second arg).
|
* greater than second arg).
|
||||||
*
|
*
|
||||||
* If two array elements compare equal, their order in the sorted array
|
|
||||||
* is undefined. If you want equal elements to keep their order (i.e.
|
|
||||||
* you want a stable sort) you can write a comparison function that,
|
|
||||||
* if two elements would otherwise compare equal, compares them by
|
|
||||||
* their addresses.
|
|
||||||
*
|
|
||||||
* <note><para>The comparison function for g_ptr_array_sort() doesn't
|
* <note><para>The comparison function for g_ptr_array_sort() doesn't
|
||||||
* take the pointers from the array as arguments, it takes pointers to
|
* take the pointers from the array as arguments, it takes pointers to
|
||||||
* the pointers in the array.</para></note>
|
* the pointers in the array.</para></note>
|
||||||
|
*
|
||||||
|
* This is guaranteed to be a stable sort since version 2.32.
|
||||||
**/
|
**/
|
||||||
void
|
void
|
||||||
g_ptr_array_sort (GPtrArray *array,
|
g_ptr_array_sort (GPtrArray *array,
|
||||||
@ -1374,10 +1374,12 @@ g_ptr_array_sort (GPtrArray *array,
|
|||||||
{
|
{
|
||||||
g_return_if_fail (array != NULL);
|
g_return_if_fail (array != NULL);
|
||||||
|
|
||||||
qsort (array->pdata,
|
/* Don't use qsort as we want a guaranteed stable sort */
|
||||||
array->len,
|
g_qsort_with_data (array->pdata,
|
||||||
sizeof (gpointer),
|
array->len,
|
||||||
compare_func);
|
sizeof (gpointer),
|
||||||
|
(GCompareDataFunc)compare_func,
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1392,6 +1394,8 @@ g_ptr_array_sort (GPtrArray *array,
|
|||||||
* <note><para>The comparison function for g_ptr_array_sort_with_data()
|
* <note><para>The comparison function for g_ptr_array_sort_with_data()
|
||||||
* doesn't take the pointers from the array as arguments, it takes
|
* doesn't take the pointers from the array as arguments, it takes
|
||||||
* pointers to the pointers in the array.</para></note>
|
* pointers to the pointers in the array.</para></note>
|
||||||
|
*
|
||||||
|
* This is guaranteed to be a stable sort since version 2.32.
|
||||||
**/
|
**/
|
||||||
void
|
void
|
||||||
g_ptr_array_sort_with_data (GPtrArray *array,
|
g_ptr_array_sort_with_data (GPtrArray *array,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user