]> git.puffer.fish Git - mirror/frr.git/commitdiff
* pqueue.[ch]: Introduce "update" function to meet ospf spf needs. It
authorhasso <hasso>
Mon, 21 Feb 2005 18:17:52 +0000 (18:17 +0000)
committerhasso <hasso>
Mon, 21 Feb 2005 18:17:52 +0000 (18:17 +0000)
  will allow to update node when:
  i) a node is inserted into the priority queue;
  ii) a node position is modified in the priority queue;
* pqueue.h: Export trickle_down() function.

lib/ChangeLog
lib/pqueue.c
lib/pqueue.h

index 4573839d82c590a7fd31921adcaa1e67fb825453..6d1a229eda7a78ddf83959c2b159f8539e23caf8 100644 (file)
@@ -1,3 +1,11 @@
+2005-02-21 Vincenzo Eramo <eramo at infocom.ing.uniroma1.it>
+
+       * pqueue.[ch]: Introduce "update" function to meet ospf spf needs. It
+         will allow to update node when:
+         i) a node is inserted into the priority queue;
+         ii) a node position is modified in the priority queue;
+       * pqueue.h: Export trickle_down() function.
+
 2005-02-19 Paul Jakma <paul.jakma@sun.com>
 
        * stream.c: (stream_new) fix dumb mistake.
index 1e41b0924143127fd039c7eadeb3deb9d3caf2e9..870f8a7c37a803c4434617c9f49617fe7f2f96bd 100644 (file)
@@ -56,14 +56,18 @@ trickle_up (int index, struct pqueue *queue)
     {
       /* actually trickle up */
       queue->array[index] = queue->array[PARENT_OF (index)];
+      if (queue->update != NULL)
+       (*queue->update) (queue->array[index], index);
       index = PARENT_OF (index);
     }
 
   /* Restore the tmp node to appropriate place.  */
   queue->array[index] = tmp;
+  if (queue->update != NULL)
+    (*queue->update) (tmp, index);
 }
 
-static void
+void
 trickle_down (int index, struct pqueue *queue)
 {
   void *tmp;
@@ -90,11 +94,15 @@ trickle_down (int index, struct pqueue *queue)
 
       /* Actually trickle down the tmp node.  */
       queue->array[index] = queue->array[which];
+       if (queue->update != NULL)
+        (*queue->update) (queue->array[index], index);
       index = which;
     }
 
   /* Restore the tmp node to appropriate place.  */
   queue->array[index] = tmp;
+  if (queue->update != NULL)
+    (*queue->update) (tmp, index);
 }
 
 struct pqueue *
@@ -110,6 +118,8 @@ pqueue_create ()
   memset (queue->array, 0, DATA_SIZE * PQUEUE_INIT_ARRAYSIZE);
   queue->array_size = PQUEUE_INIT_ARRAYSIZE;
 
+  /* By default we want nothing to happen when a node changes. */
+  queue->update = NULL;
   return queue;
 }
 
@@ -146,6 +156,8 @@ pqueue_enqueue (void *data, struct pqueue *queue)
     return;
 
   queue->array[queue->size] = data;
+  if (queue->update != NULL)
+    (*queue->update) (data, queue->size);
   trickle_up (queue->size, queue);
   queue->size ++;
 }
index 95f79b8c6f0b0294e5b97f86ce424dc47f5bddb5..d19c46de771324ad3b3ae02b001e4dc4314062ea 100644 (file)
@@ -28,6 +28,7 @@ struct pqueue
   int size;
 
   int (*cmp) (void *, void *);
+  void (*update) (void * node, int actual_position);
 };
 
 #define PQUEUE_INIT_ARRAYSIZE  32
@@ -38,4 +39,6 @@ void pqueue_delete (struct pqueue *queue);
 void pqueue_enqueue (void *data, struct pqueue *queue);
 void *pqueue_dequeue (struct pqueue *queue);
 
+void trickle_down (int index, struct pqueue *queue);
+
 #endif /* _ZEBRA_PQUEUE_H */