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?
This commit is contained in:
andy
2003-12-07 19:53:34 +00:00
parent 27477402c9
commit 755173bd2e
2 changed files with 11 additions and 17 deletions
+10 -17
View File
@@ -73,8 +73,6 @@ void SGTimerQueue::update(double deltaSecs)
void SGTimerQueue::insert(SGTimer* timer, double time) void SGTimerQueue::insert(SGTimer* timer, double time)
{ {
if(time < 0) *(int*)0=0;
if(_numEntries >= _tableSize) if(_numEntries >= _tableSize)
growArray(); growArray();
@@ -120,21 +118,16 @@ SGTimer* SGTimerQueue::remove()
void SGTimerQueue::siftDown(int n) void SGTimerQueue::siftDown(int n)
{ {
// While we have a child bigger than us: // While we have children bigger than us, swap us with the biggest
while(((lchild(n) < (_numEntries-1)) // child.
&& (_table[n].pri < _table[lchild(n)].pri)) while(lchild(n) < _numEntries) {
|| int bigc = lchild(n);
((rchild(n) < (_numEntries-1)) if(rchild(n) < _numEntries && pri(rchild(n)) > pri(bigc))
&& (_table[n].pri < _table[rchild(n)].pri))) bigc = rchild(n);
{ if(pri(bigc) <= pri(n))
// Swap us with the biggest child break;
if(_table[lchild(n)].pri > _table[rchild(n)].pri) { swap(n, bigc);
swap(n, lchild(n)); n = bigc;
n = lchild(n);
} else {
swap(n, rchild(n));
n = rchild(n);
}
} }
} }
+1
View File
@@ -42,6 +42,7 @@ private:
int parent(int n) { return ((n+1)/2) - 1; } int parent(int n) { return ((n+1)/2) - 1; }
int lchild(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; } int rchild(int n) { return ((n+1)*2 + 1) - 1; }
double pri(int n) { return _table[n].pri; }
void swap(int a, int b) { void swap(int a, int b) {
HeapEntry tmp = _table[a]; HeapEntry tmp = _table[a];
_table[a] = _table[b]; _table[a] = _table[b];