]> git.meshlink.io Git - catta/blobdiff - prioq-test.c
fix two memory leaks
[catta] / prioq-test.c
index 56cfbc120f704f63e4ef18e939c361574fdf320f..d8640c16f4a751791255db5dd4f89fd40e713e56 100644 (file)
@@ -4,16 +4,41 @@
 
 #include "prioq.h"
 
-static gint compare(gpointer a, gpointer b) {
+static gint compare_int(gconstpointer a, gconstpointer b) {
     gint i = GPOINTER_TO_INT(a), j = GPOINTER_TO_INT(b);
 
     return i < j ? -1 : (i > j ? 1 : 0);
 }
 
+static int compare_ptr(gconstpointer a, gconstpointer b) {
+    return a < b ? -1 : (a > b ? 1 : 0);
+}
+
 static void rec(flxPrioQueueNode *n) {
     if (!n)
         return;
 
+    if (n->left)
+        g_assert(n->left->parent == n);
+
+    if (n->right)
+        g_assert(n->right->parent == n);
+
+    if (n->parent) {
+        g_assert(n->parent->left == n || n->parent->right == n);
+
+        if (n->parent->left == n)
+            g_assert(n->next == n->parent->right);
+    }
+
+    if (!n->next) {
+        g_assert(n->queue->last == n);
+
+        if (n->parent && n->parent->left == n)
+            g_assert(n->parent->right == NULL);
+    }
+
+    
     if (n->parent) {
         int a = GPOINTER_TO_INT(n->parent->data), b = GPOINTER_TO_INT(n->data);
         if (a > b) {
@@ -27,29 +52,40 @@ static void rec(flxPrioQueueNode *n) {
 }
 
 int main(int argc, char *argv[]) {
-    flxPrioQueue *q;
+    flxPrioQueue *q, *q2;
     gint i, prev;
 
-    q = flx_prio_queue_new(compare);
+    q = flx_prio_queue_new(compare_int);
+    q2 = flx_prio_queue_new(compare_ptr);
 
     srand(time(NULL));
 
-    flx_prio_queue_put(q, GINT_TO_POINTER(255)); 
-    flx_prio_queue_put(q, GINT_TO_POINTER(255)); 
-    
-    for (i = 0; i < 10000; i++) 
-        flx_prio_queue_put(q, GINT_TO_POINTER(random() & 0xFFFF)); 
+    for (i = 0; i < 10000; i++)
+        flx_prio_queue_put(q2, flx_prio_queue_put(q, GINT_TO_POINTER(random() & 0xFFFF)));
 
-    prev = 0;
-    while (q->root) {
-        gint v = GPOINTER_TO_INT(q->root->data);
+    while (q2->root) {
         rec(q->root);
-        printf("%i\n", v);
-        flx_prio_queue_remove(q, q->root);
-        g_assert(v >= prev);
-        prev = v;
+        rec(q2->root);
+
+        g_assert(q->n_nodes == q2->n_nodes);
+
+        printf("%i\n", GPOINTER_TO_INT(((flxPrioQueueNode*)q2->root->data)->data));
+        
+        flx_prio_queue_remove(q, q2->root->data);
+        flx_prio_queue_remove(q2, q2->root);
     }
 
+        
+/*     prev = 0; */
+/*     while (q->root) { */
+/*         gint v = GPOINTER_TO_INT(q->root->data); */
+/*         rec(q->root); */
+/*         printf("%i\n", v); */
+/*         flx_prio_queue_remove(q, q->root); */
+/*         g_assert(v >= prev); */
+/*         prev = v; */
+/*     } */
+
     flx_prio_queue_free(q);
     return 0;
 }