- Added g_list_insert_sorted_with_data () and

* docs/reference/glib/glib-sections.txt:
* docs/reference/glib/tmpl/linked_lists_double.sgml:
* docs/reference/glib/tmpl/linked_lists_single.sgml:
* glib/glist.[ch]:
* glib/gslist.[ch]:
- Added g_list_insert_sorted_with_data () and
g_slist_insert_sorted_with_data ().
- Removed the extra check in g_list_sort() and g_slist_sort() for
GCompareDataFunc vs. GCompareFunc.
This commit is contained in:
Martyn James Russell 2005-12-07 11:35:27 +00:00
parent d63b58e8c5
commit a77f5ff0b6
7 changed files with 220 additions and 152 deletions

View File

@ -1620,6 +1620,7 @@ g_list_copy
g_list_reverse g_list_reverse
g_list_sort g_list_sort
GCompareFunc GCompareFunc
g_list_insert_sorted_with_data
g_list_sort_with_data g_list_sort_with_data
GCompareDataFunc GCompareDataFunc
g_list_concat g_list_concat
@ -1670,6 +1671,7 @@ g_slist_free1
g_slist_length g_slist_length
g_slist_copy g_slist_copy
g_slist_reverse g_slist_reverse
g_slist_insert_sorted_with_data
g_slist_sort g_slist_sort
g_slist_sort_with_data g_slist_sort_with_data
g_slist_concat g_slist_concat

View File

@ -176,6 +176,22 @@ the sort order.
@Returns: the new start of the #GList. @Returns: the new start of the #GList.
<!-- ##### FUNCTION g_list_insert_sorted_with_data ##### -->
<para>
Inserts a new element into the list, using the given comparison function
to determine its position.
</para>
@list: a pointer to a #GList.
@data: the data for the new element.
@func: the function to compare elements in the list. It should return a
number > 0 if the first parameter comes after the second parameter in
the sort order.
@user_data: user data to pass to comparison function.
@Returns: the new start of the #GList.
@Since 2.10
<!-- ##### FUNCTION g_list_remove ##### --> <!-- ##### FUNCTION g_list_remove ##### -->
<para> <para>
Removes an element from a #GList. Removes an element from a #GList.

View File

@ -183,6 +183,21 @@ number > 0 if the first parameter comes after the second parameter in
the sort order. the sort order.
@Returns: the new start of the #GSList. @Returns: the new start of the #GSList.
<!-- ##### FUNCTION g_slist_insert_sorted_with_data ##### -->
<para>
Inserts a new element into the list, using the given comparison function
to determine its position.
</para>
@list: a #GSList.
@data: the data for the new element.
@func: the function to compare elements in the list. It should return a
number > 0 if the first parameter comes after the second parameter in
the sort order.
@user_data: data to pass to comparison function.
@Returns: the new start of the #GSList.
@Since 2.10
<!-- ##### FUNCTION g_slist_remove ##### --> <!-- ##### FUNCTION g_slist_remove ##### -->
<para> <para>

View File

@ -494,11 +494,11 @@ g_list_foreach (GList *list,
} }
} }
static GList*
GList* g_list_insert_sorted_real (GList *list,
g_list_insert_sorted (GList *list, gpointer data,
gpointer data, GFunc func,
GCompareFunc func) gpointer user_data)
{ {
GList *tmp_list = list; GList *tmp_list = list;
GList *new_list; GList *new_list;
@ -513,12 +513,13 @@ g_list_insert_sorted (GList *list,
return new_list; return new_list;
} }
cmp = (*func) (data, tmp_list->data); cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data);
while ((tmp_list->next) && (cmp > 0)) while ((tmp_list->next) && (cmp > 0))
{ {
tmp_list = tmp_list->next; tmp_list = tmp_list->next;
cmp = (*func) (data, tmp_list->data);
cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data);
} }
new_list = _g_list_alloc0 (); new_list = _g_list_alloc0 ();
@ -545,11 +546,27 @@ g_list_insert_sorted (GList *list,
return list; return list;
} }
GList*
g_list_insert_sorted (GList *list,
gpointer data,
GCompareFunc func)
{
return g_list_insert_sorted_real (list, data, (GFunc) func, NULL);
}
GList*
g_list_insert_sorted_with_data (GList *list,
gpointer data,
GCompareDataFunc func,
gpointer user_data)
{
return g_list_insert_sorted_real (list, data, (GFunc) func, user_data);
}
static GList * static GList *
g_list_sort_merge (GList *l1, g_list_sort_merge (GList *l1,
GList *l2, GList *l2,
GFunc compare_func, GFunc compare_func,
gboolean use_data,
gpointer user_data) gpointer user_data)
{ {
GList list, *l, *lprev; GList list, *l, *lprev;
@ -560,10 +577,7 @@ g_list_sort_merge (GList *l1,
while (l1 && l2) while (l1 && l2)
{ {
if (use_data) cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data);
cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data);
else
cmp = ((GCompareFunc) compare_func) (l1->data, l2->data);
if (cmp <= 0) if (cmp <= 0)
{ {
@ -588,7 +602,6 @@ g_list_sort_merge (GList *l1,
static GList* static GList*
g_list_sort_real (GList *list, g_list_sort_real (GList *list,
GFunc compare_func, GFunc compare_func,
gboolean use_data,
gpointer user_data) gpointer user_data)
{ {
GList *l1, *l2; GList *l1, *l2;
@ -610,10 +623,9 @@ g_list_sort_real (GList *list,
l2 = l1->next; l2 = l1->next;
l1->next = NULL; l1->next = NULL;
return g_list_sort_merge (g_list_sort_real (list, compare_func, use_data, user_data), return g_list_sort_merge (g_list_sort_real (list, compare_func, user_data),
g_list_sort_real (l2, compare_func, use_data, user_data), g_list_sort_real (l2, compare_func, user_data),
compare_func, compare_func,
use_data,
user_data); user_data);
} }
@ -621,7 +633,7 @@ GList *
g_list_sort (GList *list, g_list_sort (GList *list,
GCompareFunc compare_func) GCompareFunc compare_func)
{ {
return g_list_sort_real (list, (GFunc) compare_func, FALSE, NULL); return g_list_sort_real (list, (GFunc) compare_func, NULL);
} }
@ -630,7 +642,7 @@ g_list_sort_with_data (GList *list,
GCompareDataFunc compare_func, GCompareDataFunc compare_func,
gpointer user_data) gpointer user_data)
{ {
return g_list_sort_real (list, (GFunc) compare_func, TRUE, user_data); return g_list_sort_real (list, (GFunc) compare_func, user_data);
} }
#define __G_LIST_C__ #define __G_LIST_C__

View File

@ -31,7 +31,7 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GList GList; typedef struct _GList GList;
struct _GList struct _GList
{ {
@ -42,68 +42,73 @@ struct _GList
/* Doubly linked lists /* Doubly linked lists
*/ */
GList* g_list_alloc (void); GList* g_list_alloc (void);
void g_list_free (GList *list); void g_list_free (GList *list);
void g_list_free_1 (GList *list); void g_list_free_1 (GList *list);
#define g_list_free1 g_list_free_1 #define g_list_free1 g_list_free_1
GList* g_list_append (GList *list, GList* g_list_append (GList *list,
gpointer data); gpointer data);
GList* g_list_prepend (GList *list, GList* g_list_prepend (GList *list,
gpointer data); gpointer data);
GList* g_list_insert (GList *list, GList* g_list_insert (GList *list,
gpointer data, gpointer data,
gint position); gint position);
GList* g_list_insert_sorted (GList *list, GList* g_list_insert_sorted (GList *list,
gpointer data, gpointer data,
GCompareFunc func); GCompareFunc func);
GList* g_list_insert_before (GList *list, GList* g_list_insert_sorted_with_data (GList *list,
GList *sibling, gpointer data,
gpointer data); GCompareDataFunc func,
GList* g_list_concat (GList *list1, gpointer user_data);
GList *list2); GList* g_list_insert_before (GList *list,
GList* g_list_remove (GList *list, GList *sibling,
gconstpointer data); gpointer data);
GList* g_list_remove_all (GList *list, GList* g_list_concat (GList *list1,
gconstpointer data); GList *list2);
GList* g_list_remove_link (GList *list, GList* g_list_remove (GList *list,
GList *llink); gconstpointer data);
GList* g_list_delete_link (GList *list, GList* g_list_remove_all (GList *list,
GList *link_); gconstpointer data);
GList* g_list_reverse (GList *list); GList* g_list_remove_link (GList *list,
GList* g_list_copy (GList *list); GList *llink);
GList* g_list_nth (GList *list, GList* g_list_delete_link (GList *list,
guint n); GList *link_);
GList* g_list_nth_prev (GList *list, GList* g_list_reverse (GList *list);
guint n); GList* g_list_copy (GList *list);
GList* g_list_find (GList *list, GList* g_list_nth (GList *list,
gconstpointer data); guint n);
GList* g_list_find_custom (GList *list, GList* g_list_nth_prev (GList *list,
gconstpointer data, guint n);
GCompareFunc func); GList* g_list_find (GList *list,
gint g_list_position (GList *list, gconstpointer data);
GList *llink); GList* g_list_find_custom (GList *list,
gint g_list_index (GList *list, gconstpointer data,
gconstpointer data); GCompareFunc func);
GList* g_list_last (GList *list); gint g_list_position (GList *list,
GList* g_list_first (GList *list); GList *llink);
guint g_list_length (GList *list); gint g_list_index (GList *list,
void g_list_foreach (GList *list, gconstpointer data);
GFunc func, GList* g_list_last (GList *list);
gpointer user_data); GList* g_list_first (GList *list);
GList* g_list_sort (GList *list, guint g_list_length (GList *list);
GCompareFunc compare_func); void g_list_foreach (GList *list,
GList* g_list_sort_with_data (GList *list, GFunc func,
GCompareDataFunc compare_func, gpointer user_data);
gpointer user_data); GList* g_list_sort (GList *list,
gpointer g_list_nth_data (GList *list, GCompareFunc compare_func);
guint n); GList* g_list_sort_with_data (GList *list,
GCompareDataFunc compare_func,
gpointer user_data);
gpointer g_list_nth_data (GList *list,
guint n);
#define g_list_previous(list) ((list) ? (((GList *)(list))->prev) : NULL)
#define g_list_next(list) ((list) ? (((GList *)(list))->next) : NULL) #define g_list_previous(list) ((list) ? (((GList *)(list))->prev) : NULL)
#define g_list_next(list) ((list) ? (((GList *)(list))->next) : NULL)
#ifndef G_DISABLE_DEPRECATED #ifndef G_DISABLE_DEPRECATED
void g_list_push_allocator (gpointer allocator); void g_list_push_allocator (gpointer allocator);
void g_list_pop_allocator (void); void g_list_pop_allocator (void);
#endif #endif
G_END_DECLS G_END_DECLS

View File

@ -463,10 +463,11 @@ g_slist_foreach (GSList *list,
} }
} }
GSList* static GSList*
g_slist_insert_sorted (GSList *list, g_slist_insert_sorted_real (GSList *list,
gpointer data, gpointer data,
GCompareFunc func) GFunc func,
gpointer user_data)
{ {
GSList *tmp_list = list; GSList *tmp_list = list;
GSList *prev_list = NULL; GSList *prev_list = NULL;
@ -482,13 +483,14 @@ g_slist_insert_sorted (GSList *list,
return new_list; return new_list;
} }
cmp = (*func) (data, tmp_list->data); cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data);
while ((tmp_list->next) && (cmp > 0)) while ((tmp_list->next) && (cmp > 0))
{ {
prev_list = tmp_list; prev_list = tmp_list;
tmp_list = tmp_list->next; tmp_list = tmp_list->next;
cmp = (*func) (data, tmp_list->data);
cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data);
} }
new_list = _g_slist_alloc0 (); new_list = _g_slist_alloc0 ();
@ -513,11 +515,27 @@ g_slist_insert_sorted (GSList *list,
} }
} }
GSList*
g_slist_insert_sorted (GSList *list,
gpointer data,
GCompareFunc func)
{
return g_slist_insert_sorted_real (list, data, (GFunc) func, NULL);
}
GSList*
g_slist_insert_sorted_with_data (GSList *list,
gpointer data,
GCompareDataFunc func,
gpointer user_data)
{
return g_slist_insert_sorted_real (list, data, (GFunc) func, user_data);
}
static GSList * static GSList *
g_slist_sort_merge (GSList *l1, g_slist_sort_merge (GSList *l1,
GSList *l2, GSList *l2,
GFunc compare_func, GFunc compare_func,
gboolean use_data,
gpointer user_data) gpointer user_data)
{ {
GSList list, *l; GSList list, *l;
@ -527,10 +545,7 @@ g_slist_sort_merge (GSList *l1,
while (l1 && l2) while (l1 && l2)
{ {
if (use_data) cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data);
cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data);
else
cmp = ((GCompareFunc) compare_func) (l1->data, l2->data);
if (cmp <= 0) if (cmp <= 0)
{ {
@ -551,7 +566,6 @@ g_slist_sort_merge (GSList *l1,
static GSList * static GSList *
g_slist_sort_real (GSList *list, g_slist_sort_real (GSList *list,
GFunc compare_func, GFunc compare_func,
gboolean use_data,
gpointer user_data) gpointer user_data)
{ {
GSList *l1, *l2; GSList *l1, *l2;
@ -573,10 +587,9 @@ g_slist_sort_real (GSList *list,
l2 = l1->next; l2 = l1->next;
l1->next = NULL; l1->next = NULL;
return g_slist_sort_merge (g_slist_sort_real (list, compare_func, use_data, user_data), return g_slist_sort_merge (g_slist_sort_real (list, compare_func, user_data),
g_slist_sort_real (l2, compare_func, use_data, user_data), g_slist_sort_real (l2, compare_func, user_data),
compare_func, compare_func,
use_data,
user_data); user_data);
} }
@ -584,7 +597,7 @@ GSList *
g_slist_sort (GSList *list, g_slist_sort (GSList *list,
GCompareFunc compare_func) GCompareFunc compare_func)
{ {
return g_slist_sort_real (list, (GFunc) compare_func, FALSE, NULL); return g_slist_sort_real (list, (GFunc) compare_func, NULL);
} }
GSList * GSList *
@ -592,7 +605,7 @@ g_slist_sort_with_data (GSList *list,
GCompareDataFunc compare_func, GCompareDataFunc compare_func,
gpointer user_data) gpointer user_data)
{ {
return g_slist_sort_real (list, (GFunc) compare_func, TRUE, user_data); return g_slist_sort_real (list, (GFunc) compare_func, user_data);
} }
#define __G_SLIST_C__ #define __G_SLIST_C__

View File

@ -31,7 +31,7 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GSList GSList; typedef struct _GSList GSList;
struct _GSList struct _GSList
{ {
@ -41,63 +41,68 @@ struct _GSList
/* Singly linked lists /* Singly linked lists
*/ */
GSList* g_slist_alloc (void); GSList* g_slist_alloc (void);
void g_slist_free (GSList *list); void g_slist_free (GSList *list);
void g_slist_free_1 (GSList *list); void g_slist_free_1 (GSList *list);
#define g_slist_free1 g_slist_free_1 #define g_slist_free1 g_slist_free_1
GSList* g_slist_append (GSList *list, GSList* g_slist_append (GSList *list,
gpointer data); gpointer data);
GSList* g_slist_prepend (GSList *list, GSList* g_slist_prepend (GSList *list,
gpointer data); gpointer data);
GSList* g_slist_insert (GSList *list, GSList* g_slist_insert (GSList *list,
gpointer data, gpointer data,
gint position); gint position);
GSList* g_slist_insert_sorted (GSList *list, GSList* g_slist_insert_sorted (GSList *list,
gpointer data, gpointer data,
GCompareFunc func); GCompareFunc func);
GSList* g_slist_insert_before (GSList *slist, GSList* g_slist_insert_sorted_with_data (GSList *list,
GSList *sibling, gpointer data,
gpointer data); GCompareDataFunc func,
GSList* g_slist_concat (GSList *list1, gpointer user_data);
GSList *list2); GSList* g_slist_insert_before (GSList *slist,
GSList* g_slist_remove (GSList *list, GSList *sibling,
gconstpointer data); gpointer data);
GSList* g_slist_remove_all (GSList *list, GSList* g_slist_concat (GSList *list1,
gconstpointer data); GSList *list2);
GSList* g_slist_remove_link (GSList *list, GSList* g_slist_remove (GSList *list,
GSList *link_); gconstpointer data);
GSList* g_slist_delete_link (GSList *list, GSList* g_slist_remove_all (GSList *list,
GSList *link_); gconstpointer data);
GSList* g_slist_reverse (GSList *list); GSList* g_slist_remove_link (GSList *list,
GSList* g_slist_copy (GSList *list); GSList *link_);
GSList* g_slist_nth (GSList *list, GSList* g_slist_delete_link (GSList *list,
guint n); GSList *link_);
GSList* g_slist_find (GSList *list, GSList* g_slist_reverse (GSList *list);
gconstpointer data); GSList* g_slist_copy (GSList *list);
GSList* g_slist_find_custom (GSList *list, GSList* g_slist_nth (GSList *list,
gconstpointer data, guint n);
GCompareFunc func); GSList* g_slist_find (GSList *list,
gint g_slist_position (GSList *list, gconstpointer data);
GSList *llink); GSList* g_slist_find_custom (GSList *list,
gint g_slist_index (GSList *list, gconstpointer data,
gconstpointer data); GCompareFunc func);
GSList* g_slist_last (GSList *list); gint g_slist_position (GSList *list,
guint g_slist_length (GSList *list); GSList *llink);
void g_slist_foreach (GSList *list, gint g_slist_index (GSList *list,
GFunc func, gconstpointer data);
gpointer user_data); GSList* g_slist_last (GSList *list);
GSList* g_slist_sort (GSList *list, guint g_slist_length (GSList *list);
GCompareFunc compare_func); void g_slist_foreach (GSList *list,
GSList* g_slist_sort_with_data (GSList *list, GFunc func,
GCompareDataFunc compare_func, gpointer user_data);
gpointer user_data); GSList* g_slist_sort (GSList *list,
gpointer g_slist_nth_data (GSList *list, GCompareFunc compare_func);
guint n); GSList* g_slist_sort_with_data (GSList *list,
#define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL) GCompareDataFunc compare_func,
gpointer user_data);
gpointer g_slist_nth_data (GSList *list,
guint n);
#define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL)
#ifndef G_DISABLE_DEPRECATED #ifndef G_DISABLE_DEPRECATED
void g_slist_push_allocator (gpointer dummy); void g_slist_push_allocator (gpointer dummy);
void g_slist_pop_allocator (void); void g_slist_pop_allocator (void);
#endif #endif
G_END_DECLS G_END_DECLS