- Added g_list_insert_sorted_with_data () and
authorMartyn James Russell <mr@src.gnome.org>
Wed, 7 Dec 2005 11:35:27 +0000 (11:35 +0000)
committerMartyn James Russell <mr@src.gnome.org>
Wed, 7 Dec 2005 11:35:27 +0000 (11:35 +0000)
* 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
docs/reference/glib/tmpl/linked_lists_double.sgml
docs/reference/glib/tmpl/linked_lists_single.sgml
glib/glist.c
glib/glist.h
glib/gslist.c
glib/gslist.h

index 53f202341536e809c0a67deaf3e577630fc23a78..efa960e68e6cda4543026a7e6bb9f173a27632a6 100644 (file)
@@ -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
index cf3b935a0716b5586a187837e96b3b6c74615d33..bd3c3ba0822f594d749ae2f3c8aa83ac8cf828e4 100644 (file)
@@ -176,6 +176,22 @@ the sort order.
 @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 ##### -->
 <para>
 Removes an element from a #GList.
index 64b733676aacd75f82a9ec71ef6b86ef03a57298..d9d7a319eb06c06e3fe54d1154db4f95e0f8f335 100644 (file)
@@ -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.
 
+<!-- ##### 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 ##### -->
 <para>
index 9f756b5085c385f83e5afbd665ee597bc688863e..12ebd0b39bc98be9b4007b6af2f948d61bc791b4 100644 (file)
@@ -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__
index fde99e5693ee967a174e748d634b9161b3ab3060..c41387f4c0d16ae44e04dee9919c221ec944e3a8 100644 (file)
@@ -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
 
index ebf034838c63fc7cf0f0827dba778112390eb21d..05525645f385f77da58a212e0df35540febf5b7d 100644 (file)
@@ -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__
index 6df15ddc22a9304f504b2ee9430b11439659f18f..ecef45ac5f6f25ef554c27da3abec7a4b8a1b1f1 100644 (file)
@@ -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