From a77f5ff0b6179726b76168da895a9b2064aaa2aa Mon Sep 17 00:00:00 2001 From: Martyn James Russell Date: Wed, 7 Dec 2005 11:35:27 +0000 Subject: [PATCH] - 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. --- docs/reference/glib/glib-sections.txt | 2 + .../glib/tmpl/linked_lists_double.sgml | 16 +++ .../glib/tmpl/linked_lists_single.sgml | 15 +++ glib/glist.c | 50 ++++--- glib/glist.h | 125 +++++++++--------- glib/gslist.c | 47 ++++--- glib/gslist.h | 117 ++++++++-------- 7 files changed, 220 insertions(+), 152 deletions(-) diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index 53f20234..efa960e6 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -1620,6 +1620,7 @@ g_list_copy g_list_reverse g_list_sort GCompareFunc +g_list_insert_sorted_with_data g_list_sort_with_data GCompareDataFunc g_list_concat @@ -1670,6 +1671,7 @@ g_slist_free1 g_slist_length g_slist_copy g_slist_reverse +g_slist_insert_sorted_with_data g_slist_sort g_slist_sort_with_data g_slist_concat diff --git a/docs/reference/glib/tmpl/linked_lists_double.sgml b/docs/reference/glib/tmpl/linked_lists_double.sgml index cf3b935a..bd3c3ba0 100644 --- a/docs/reference/glib/tmpl/linked_lists_double.sgml +++ b/docs/reference/glib/tmpl/linked_lists_double.sgml @@ -176,6 +176,22 @@ the sort order. @Returns: the new start of the #GList. + + +Inserts a new element into the list, using the given comparison function +to determine its position. + + +@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 + + Removes an element from a #GList. diff --git a/docs/reference/glib/tmpl/linked_lists_single.sgml b/docs/reference/glib/tmpl/linked_lists_single.sgml index 64b73367..d9d7a319 100644 --- a/docs/reference/glib/tmpl/linked_lists_single.sgml +++ b/docs/reference/glib/tmpl/linked_lists_single.sgml @@ -183,6 +183,21 @@ number > 0 if the first parameter comes after the second parameter in the sort order. @Returns: the new start of the #GSList. + + +Inserts a new element into the list, using the given comparison function +to determine its position. + + +@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 + diff --git a/glib/glist.c b/glib/glist.c index 9f756b50..12ebd0b3 100644 --- a/glib/glist.c +++ b/glib/glist.c @@ -494,11 +494,11 @@ g_list_foreach (GList *list, } } - -GList* -g_list_insert_sorted (GList *list, - gpointer data, - GCompareFunc func) +static GList* +g_list_insert_sorted_real (GList *list, + gpointer data, + GFunc func, + gpointer user_data) { GList *tmp_list = list; GList *new_list; @@ -513,12 +513,13 @@ g_list_insert_sorted (GList *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)) { 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 (); @@ -545,11 +546,27 @@ g_list_insert_sorted (GList *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 * g_list_sort_merge (GList *l1, GList *l2, GFunc compare_func, - gboolean use_data, gpointer user_data) { GList list, *l, *lprev; @@ -560,10 +577,7 @@ g_list_sort_merge (GList *l1, while (l1 && l2) { - if (use_data) - cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); - else - cmp = ((GCompareFunc) compare_func) (l1->data, l2->data); + cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); if (cmp <= 0) { @@ -588,7 +602,6 @@ g_list_sort_merge (GList *l1, static GList* g_list_sort_real (GList *list, GFunc compare_func, - gboolean use_data, gpointer user_data) { GList *l1, *l2; @@ -610,10 +623,9 @@ g_list_sort_real (GList *list, l2 = l1->next; l1->next = NULL; - return g_list_sort_merge (g_list_sort_real (list, compare_func, use_data, user_data), - g_list_sort_real (l2, 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, user_data), compare_func, - use_data, user_data); } @@ -621,7 +633,7 @@ GList * g_list_sort (GList *list, 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, 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__ diff --git a/glib/glist.h b/glib/glist.h index fde99e56..c41387f4 100644 --- a/glib/glist.h +++ b/glib/glist.h @@ -31,7 +31,7 @@ G_BEGIN_DECLS -typedef struct _GList GList; +typedef struct _GList GList; struct _GList { @@ -42,68 +42,73 @@ struct _GList /* Doubly linked lists */ -GList* g_list_alloc (void); -void g_list_free (GList *list); -void g_list_free_1 (GList *list); -#define g_list_free1 g_list_free_1 -GList* g_list_append (GList *list, - gpointer data); -GList* g_list_prepend (GList *list, - gpointer data); -GList* g_list_insert (GList *list, - gpointer data, - gint position); -GList* g_list_insert_sorted (GList *list, - gpointer data, - GCompareFunc func); -GList* g_list_insert_before (GList *list, - GList *sibling, - gpointer data); -GList* g_list_concat (GList *list1, - GList *list2); -GList* g_list_remove (GList *list, - gconstpointer data); -GList* g_list_remove_all (GList *list, - gconstpointer data); -GList* g_list_remove_link (GList *list, - GList *llink); -GList* g_list_delete_link (GList *list, - GList *link_); -GList* g_list_reverse (GList *list); -GList* g_list_copy (GList *list); -GList* g_list_nth (GList *list, - guint n); -GList* g_list_nth_prev (GList *list, - guint n); -GList* g_list_find (GList *list, - gconstpointer data); -GList* g_list_find_custom (GList *list, - gconstpointer data, - GCompareFunc func); -gint g_list_position (GList *list, - GList *llink); -gint g_list_index (GList *list, - gconstpointer data); -GList* g_list_last (GList *list); -GList* g_list_first (GList *list); -guint g_list_length (GList *list); -void g_list_foreach (GList *list, - GFunc func, - gpointer user_data); -GList* g_list_sort (GList *list, - GCompareFunc compare_func); -GList* g_list_sort_with_data (GList *list, - GCompareDataFunc compare_func, - gpointer user_data); -gpointer g_list_nth_data (GList *list, - guint n); +GList* g_list_alloc (void); +void g_list_free (GList *list); +void g_list_free_1 (GList *list); +#define g_list_free1 g_list_free_1 +GList* g_list_append (GList *list, + gpointer data); +GList* g_list_prepend (GList *list, + gpointer data); +GList* g_list_insert (GList *list, + gpointer data, + gint position); +GList* g_list_insert_sorted (GList *list, + gpointer data, + GCompareFunc func); +GList* g_list_insert_sorted_with_data (GList *list, + gpointer data, + GCompareDataFunc func, + gpointer user_data); +GList* g_list_insert_before (GList *list, + GList *sibling, + gpointer data); +GList* g_list_concat (GList *list1, + GList *list2); +GList* g_list_remove (GList *list, + gconstpointer data); +GList* g_list_remove_all (GList *list, + gconstpointer data); +GList* g_list_remove_link (GList *list, + GList *llink); +GList* g_list_delete_link (GList *list, + GList *link_); +GList* g_list_reverse (GList *list); +GList* g_list_copy (GList *list); +GList* g_list_nth (GList *list, + guint n); +GList* g_list_nth_prev (GList *list, + guint n); +GList* g_list_find (GList *list, + gconstpointer data); +GList* g_list_find_custom (GList *list, + gconstpointer data, + GCompareFunc func); +gint g_list_position (GList *list, + GList *llink); +gint g_list_index (GList *list, + gconstpointer data); +GList* g_list_last (GList *list); +GList* g_list_first (GList *list); +guint g_list_length (GList *list); +void g_list_foreach (GList *list, + GFunc func, + gpointer user_data); +GList* g_list_sort (GList *list, + GCompareFunc compare_func); +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 -void g_list_push_allocator (gpointer allocator); -void g_list_pop_allocator (void); +void g_list_push_allocator (gpointer allocator); +void g_list_pop_allocator (void); #endif G_END_DECLS diff --git a/glib/gslist.c b/glib/gslist.c index ebf03483..05525645 100644 --- a/glib/gslist.c +++ b/glib/gslist.c @@ -463,10 +463,11 @@ g_slist_foreach (GSList *list, } } -GSList* -g_slist_insert_sorted (GSList *list, - gpointer data, - GCompareFunc func) +static GSList* +g_slist_insert_sorted_real (GSList *list, + gpointer data, + GFunc func, + gpointer user_data) { GSList *tmp_list = list; GSList *prev_list = NULL; @@ -482,13 +483,14 @@ g_slist_insert_sorted (GSList *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)) { prev_list = tmp_list; 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 (); @@ -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 * g_slist_sort_merge (GSList *l1, GSList *l2, GFunc compare_func, - gboolean use_data, gpointer user_data) { GSList list, *l; @@ -527,10 +545,7 @@ g_slist_sort_merge (GSList *l1, while (l1 && l2) { - if (use_data) - cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); - else - cmp = ((GCompareFunc) compare_func) (l1->data, l2->data); + cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); if (cmp <= 0) { @@ -551,7 +566,6 @@ g_slist_sort_merge (GSList *l1, static GSList * g_slist_sort_real (GSList *list, GFunc compare_func, - gboolean use_data, gpointer user_data) { GSList *l1, *l2; @@ -573,10 +587,9 @@ g_slist_sort_real (GSList *list, l2 = l1->next; l1->next = NULL; - return g_slist_sort_merge (g_slist_sort_real (list, compare_func, use_data, user_data), - g_slist_sort_real (l2, 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, user_data), compare_func, - use_data, user_data); } @@ -584,7 +597,7 @@ GSList * g_slist_sort (GSList *list, 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 * @@ -592,7 +605,7 @@ g_slist_sort_with_data (GSList *list, GCompareDataFunc compare_func, 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__ diff --git a/glib/gslist.h b/glib/gslist.h index 6df15ddc..ecef45ac 100644 --- a/glib/gslist.h +++ b/glib/gslist.h @@ -31,7 +31,7 @@ G_BEGIN_DECLS -typedef struct _GSList GSList; +typedef struct _GSList GSList; struct _GSList { @@ -41,63 +41,68 @@ struct _GSList /* Singly linked lists */ -GSList* g_slist_alloc (void); -void g_slist_free (GSList *list); -void g_slist_free_1 (GSList *list); -#define g_slist_free1 g_slist_free_1 -GSList* g_slist_append (GSList *list, - gpointer data); -GSList* g_slist_prepend (GSList *list, - gpointer data); -GSList* g_slist_insert (GSList *list, - gpointer data, - gint position); -GSList* g_slist_insert_sorted (GSList *list, - gpointer data, - GCompareFunc func); -GSList* g_slist_insert_before (GSList *slist, - GSList *sibling, - gpointer data); -GSList* g_slist_concat (GSList *list1, - GSList *list2); -GSList* g_slist_remove (GSList *list, - gconstpointer data); -GSList* g_slist_remove_all (GSList *list, - gconstpointer data); -GSList* g_slist_remove_link (GSList *list, - GSList *link_); -GSList* g_slist_delete_link (GSList *list, - GSList *link_); -GSList* g_slist_reverse (GSList *list); -GSList* g_slist_copy (GSList *list); -GSList* g_slist_nth (GSList *list, - guint n); -GSList* g_slist_find (GSList *list, - gconstpointer data); -GSList* g_slist_find_custom (GSList *list, - gconstpointer data, - GCompareFunc func); -gint g_slist_position (GSList *list, - GSList *llink); -gint g_slist_index (GSList *list, - gconstpointer data); -GSList* g_slist_last (GSList *list); -guint g_slist_length (GSList *list); -void g_slist_foreach (GSList *list, - GFunc func, - gpointer user_data); -GSList* g_slist_sort (GSList *list, - GCompareFunc compare_func); -GSList* g_slist_sort_with_data (GSList *list, - 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) +GSList* g_slist_alloc (void); +void g_slist_free (GSList *list); +void g_slist_free_1 (GSList *list); +#define g_slist_free1 g_slist_free_1 +GSList* g_slist_append (GSList *list, + gpointer data); +GSList* g_slist_prepend (GSList *list, + gpointer data); +GSList* g_slist_insert (GSList *list, + gpointer data, + gint position); +GSList* g_slist_insert_sorted (GSList *list, + gpointer data, + GCompareFunc func); +GSList* g_slist_insert_sorted_with_data (GSList *list, + gpointer data, + GCompareDataFunc func, + gpointer user_data); +GSList* g_slist_insert_before (GSList *slist, + GSList *sibling, + gpointer data); +GSList* g_slist_concat (GSList *list1, + GSList *list2); +GSList* g_slist_remove (GSList *list, + gconstpointer data); +GSList* g_slist_remove_all (GSList *list, + gconstpointer data); +GSList* g_slist_remove_link (GSList *list, + GSList *link_); +GSList* g_slist_delete_link (GSList *list, + GSList *link_); +GSList* g_slist_reverse (GSList *list); +GSList* g_slist_copy (GSList *list); +GSList* g_slist_nth (GSList *list, + guint n); +GSList* g_slist_find (GSList *list, + gconstpointer data); +GSList* g_slist_find_custom (GSList *list, + gconstpointer data, + GCompareFunc func); +gint g_slist_position (GSList *list, + GSList *llink); +gint g_slist_index (GSList *list, + gconstpointer data); +GSList* g_slist_last (GSList *list); +guint g_slist_length (GSList *list); +void g_slist_foreach (GSList *list, + GFunc func, + gpointer user_data); +GSList* g_slist_sort (GSList *list, + GCompareFunc compare_func); +GSList* g_slist_sort_with_data (GSList *list, + 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 -void g_slist_push_allocator (gpointer dummy); -void g_slist_pop_allocator (void); +void g_slist_push_allocator (gpointer dummy); +void g_slist_pop_allocator (void); #endif G_END_DECLS -- 2.34.1