- Call g_queue_insert_sorted() instead of duplicating the code. - Call
authorMartyn James Russell <mr@src.gnome.org>
Wed, 7 Dec 2005 12:09:44 +0000 (12:09 +0000)
committerMartyn James Russell <mr@src.gnome.org>
Wed, 7 Dec 2005 12:09:44 +0000 (12:09 +0000)
* glib/gasyncqueue.c:
- Call g_queue_insert_sorted() instead of duplicating the code.
- Call g_queue_sort() instead of duplicating the code.
- Invert sort function results to make sure the same sort function
gives the same results across glist, gslist, gqueue and
gasyncqueue.

* tests/asyncqueue-test.c:
- Updated the sort function to reflect the example in the
documentation for gasyncqueue.c.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-12
glib/gasyncqueue.c
tests/asyncqueue-test.c

index 4ae4699b02a1e5e646276e49d51e670dadfe021f..d7dfc52bd91e4d118f78ba8abedff83aa9076e88 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2005-12-07  Martyn Russell  <martyn@imendio.com>
+
+       * glib/gasyncqueue.c:
+       - Call g_queue_insert_sorted() instead of duplicating the code.
+       - Call g_queue_sort() instead of duplicating the code.
+       - Invert sort function results to make sure the same sort function
+       gives the same results across glist, gslist, gqueue and
+       gasyncqueue.
+
+       * tests/asyncqueue-test.c:
+       - Updated the sort function to reflect the example in the
+       documentation for gasyncqueue.c.
+
 2005-12-07  Martyn Russell  <martyn@imendio.com>
 
        * docs/reference/glib/glib-sections.txt:
index 4ae4699b02a1e5e646276e49d51e670dadfe021f..d7dfc52bd91e4d118f78ba8abedff83aa9076e88 100644 (file)
@@ -1,3 +1,16 @@
+2005-12-07  Martyn Russell  <martyn@imendio.com>
+
+       * glib/gasyncqueue.c:
+       - Call g_queue_insert_sorted() instead of duplicating the code.
+       - Call g_queue_sort() instead of duplicating the code.
+       - Invert sort function results to make sure the same sort function
+       gives the same results across glist, gslist, gqueue and
+       gasyncqueue.
+
+       * tests/asyncqueue-test.c:
+       - Updated the sort function to reflect the example in the
+       documentation for gasyncqueue.c.
+
 2005-12-07  Martyn Russell  <martyn@imendio.com>
 
        * docs/reference/glib/glib-sections.txt:
index 4ae4699b02a1e5e646276e49d51e670dadfe021f..d7dfc52bd91e4d118f78ba8abedff83aa9076e88 100644 (file)
@@ -1,3 +1,16 @@
+2005-12-07  Martyn Russell  <martyn@imendio.com>
+
+       * glib/gasyncqueue.c:
+       - Call g_queue_insert_sorted() instead of duplicating the code.
+       - Call g_queue_sort() instead of duplicating the code.
+       - Invert sort function results to make sure the same sort function
+       gives the same results across glist, gslist, gqueue and
+       gasyncqueue.
+
+       * tests/asyncqueue-test.c:
+       - Updated the sort function to reflect the example in the
+       documentation for gasyncqueue.c.
+
 2005-12-07  Martyn Russell  <martyn@imendio.com>
 
        * docs/reference/glib/glib-sections.txt:
index 2cd252f920a46219ccd46a445bb9965d4a7b6cc9..b44cd287b1fb8367c166a9a712e9815cd9fb8af1 100644 (file)
@@ -39,6 +39,11 @@ struct _GAsyncQueue
   gint32 ref_count;
 };
 
+typedef struct {
+  GCompareDataFunc func;
+  gpointer         user_data;
+} SortData;
+
 /**
  * g_async_queue_new:
  * 
@@ -255,6 +260,14 @@ g_async_queue_push_sorted (GAsyncQueue      *queue,
   g_mutex_unlock (queue->mutex);
 }
 
+static gint 
+g_async_queue_invert_compare (gpointer  v1, 
+                             gpointer  v2, 
+                             SortData *sd)
+{
+  return -sd->func (v1, v2, sd->user_data);
+}
+
 /**
  * g_async_queue_push_sorted_unlocked:
  * @queue: a #GAsyncQueue
@@ -284,21 +297,17 @@ g_async_queue_push_sorted_unlocked (GAsyncQueue      *queue,
                                    GCompareDataFunc  func,
                                    gpointer          user_data)
 {
-  GQueue *q;
-  GList  *list;
+  SortData sd;
   
   g_return_if_fail (queue != NULL);
 
-  q = queue->queue;
-
-  list = q->head;
-  while (list && func (list->data, data, user_data) < 0)
-    list = list->next;
+  sd.func = func;
+  sd.user_data = user_data;
 
-  if (list)
-    g_queue_insert_before (q, list, data);
-  else
-    g_queue_push_tail (q, data);
+  g_queue_insert_sorted (queue->queue, 
+                        data, 
+                        (GCompareDataFunc)g_async_queue_invert_compare, 
+                        &sd);
 }
 
 static gpointer
@@ -554,13 +563,13 @@ g_async_queue_length_unlocked (GAsyncQueue* queue)
  * If you were sorting a list of priority numbers to make sure the
  * lowest priority would be at the top of the queue, you could use:
  * <informalexample><programlisting> 
- *  gint id1;
- *  gint id2;
+ *  gint32 id1;
+ *  gint32 id2;
  *   
  *  id1 = GPOINTER_TO_INT (element1);
  *  id2 = GPOINTER_TO_INT (element2);
  *   
- *  return (id2 - id1);
+ *  return (id1 > id2 ? +1 : id1 == id2 ? 0 : -1);
  * </programlisting></informalexample>
  *
  * Since: 2.10
@@ -600,17 +609,18 @@ g_async_queue_sort_unlocked (GAsyncQueue      *queue,
                             GCompareDataFunc  func,
                             gpointer          user_data)
 {
-  GQueue *q;
+  SortData sd;
 
   g_return_if_fail (queue != NULL);
   g_return_if_fail (func != NULL);
 
-  q = queue->queue;
+  sd.func = func;
+  sd.user_data = user_data;
 
-  q->head = g_list_sort_with_data (q->head, func, user_data);
-  q->tail = g_list_last (q->head);
+  g_queue_sort (queue->queue, 
+               (GCompareDataFunc)g_async_queue_invert_compare, 
+               &sd);
 }
 
-
 #define __G_ASYNCQUEUE_C__
 #include "galiasdef.c"
index 810705bc2e26e45b934e7bbf9926c809ec728f08..3072994d5d37579c7cdca8ac4780a4f014dd7b46 100644 (file)
@@ -37,16 +37,16 @@ static GAsyncQueue *async_queue = NULL;
 static gint
 sort_compare (gconstpointer p1, gconstpointer p2, gpointer user_data)
 {
-  gint id1;
-  gint id2;
+  gint32 id1;
+  gint32 id2;
 
   id1 = GPOINTER_TO_INT (p1);
   id2 = GPOINTER_TO_INT (p2);
 
   d(g_print ("comparing #1:%d and #2:%d, returning %d\n", 
-            id1, id2, (id2 - id1)));
+            id1, id2, (id1 > id2 ? +1 : id1 == id2 ? 0 : -1)));
 
-  return (id2 - id1);
+  return (id1 > id2 ? +1 : id1 == id2 ? 0 : -1);
 }
 
 static gboolean