From: andy Date: Sun, 7 Dec 2003 19:53:34 +0000 (+0000) Subject: Bug fixes. The priority queue wasn't handling boundary conditions at X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=755173bd2efd2bdef793857a575050be107bfb69;p=simgear.git Bug fixes. The priority queue wasn't handling boundary conditions at the edge of the table properly. The new code is half the size -- it *has* to be correct, right? --- diff --git a/simgear/structure/event_mgr.cxx b/simgear/structure/event_mgr.cxx index 32c499f9..c7ea2ebd 100644 --- a/simgear/structure/event_mgr.cxx +++ b/simgear/structure/event_mgr.cxx @@ -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; } } diff --git a/simgear/structure/event_mgr.hxx b/simgear/structure/event_mgr.hxx index 07c65d5f..4c8d29bd 100644 --- a/simgear/structure/event_mgr.hxx +++ b/simgear/structure/event_mgr.hxx @@ -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];