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:
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
Reference in New Issue
Block a user