]> git.mxchange.org Git - simgear.git/commitdiff
Bug fixes. The priority queue wasn't handling boundary conditions at
authorandy <andy>
Sun, 7 Dec 2003 19:53:34 +0000 (19:53 +0000)
committerandy <andy>
Sun, 7 Dec 2003 19:53:34 +0000 (19:53 +0000)
the edge of the table properly.  The new code is half the size -- it
*has* to be correct, right?

simgear/structure/event_mgr.cxx
simgear/structure/event_mgr.hxx

index 32c499f9988961dabc906ee5900cb507a371ad22..c7ea2ebd33a5efb0550e45197525187745088e20 100644 (file)
@@ -73,8 +73,6 @@ void SGTimerQueue::update(double deltaSecs)
 
 void SGTimerQueue::insert(SGTimer* timer, double time)
 {
-    if(time < 0) *(int*)0=0;
-
     if(_numEntries >= _tableSize)
        growArray();
 
@@ -120,21 +118,16 @@ SGTimer* SGTimerQueue::remove()
 
 void SGTimerQueue::siftDown(int n)
 {
-    // While we have a child bigger than us:
-    while(((lchild(n) < (_numEntries-1))
-          && (_table[n].pri < _table[lchild(n)].pri))
-         ||
-         ((rchild(n) < (_numEntries-1))
-          && (_table[n].pri < _table[rchild(n)].pri)))
-    {
-        // Swap us with the biggest child
-        if(_table[lchild(n)].pri > _table[rchild(n)].pri) {
-            swap(n, lchild(n)); 
-            n = lchild(n);
-        } else {
-            swap(n, rchild(n));
-            n = rchild(n);
-        }
+    // While we have children bigger than us, swap us with the biggest
+    // child.
+    while(lchild(n) < _numEntries) {
+        int bigc = lchild(n);
+        if(rchild(n) < _numEntries && pri(rchild(n)) > pri(bigc))
+            bigc = rchild(n);
+        if(pri(bigc) <= pri(n))
+            break;
+        swap(n, bigc);
+        n = bigc;
     }
 }
 
index 07c65d5faa9a739869de487d6bc2895541de6d86..4c8d29bd61d19675847a8069300ea3e7eadf72b3 100644 (file)
@@ -42,6 +42,7 @@ private:
     int parent(int n) { return ((n+1)/2) - 1; }
     int lchild(int n) { return ((n+1)*2) - 1; }
     int rchild(int n) { return ((n+1)*2 + 1) - 1; }
+    double pri(int n) { return _table[n].pri; }
     void swap(int a, int b) {
        HeapEntry tmp = _table[a];
        _table[a] = _table[b];