Files
firestorm/Gameleap/code/mw4/Tools/TCTb/Terra/Heap.cpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

127 lines
2.3 KiB
C++

#include <assert.h>
#include <iostream.h>
#include "Heap.hpp"
void Heap::swap(int i,int j)
{
heap_node tmp = ref(i);
ref(i) = ref(j);
ref(j) = tmp;
ref(i).obj->token = i;
ref(j).obj->token = j;
}
void Heap::upheap(int i)
{
if( i==0 ) return;
if( ref(i).import*ref(i).factor > ref(parent(i)).import*ref(parent(i)).factor )
{
swap(i,parent(i));
upheap(parent(i));
}
}
void Heap::downheap(int i)
{
if (i>=size) return; // perhaps just extracted the last
int largest = i,
l = left(i),
r = right(i);
if( l<size && ref(l).import*ref(l).factor > ref(largest).import*ref(largest).factor ) largest = l;
if( r<size && ref(r).import*ref(r).factor > ref(largest).import*ref(largest).factor ) largest = r;
if( largest != i )
{
swap(i,largest);
downheap(largest);
}
}
void Heap::insert(Labelled *t, real v, real f)
{
if( size == maxLength() )
{
cerr << "NOTE: Growing heap from " << size << " to " << 2*size << endl;
resize(2*size);
}
int i = size++;
ref(i).obj = t;
ref(i).import = v;
ref(i).factor = f;
ref(i).obj->token = i;
upheap(i);
}
void Heap::update(Labelled *t, real v, real f)
{
int i = t->token;
if( i >= size )
{
cerr << "WARNING: Attempting to update past end of heap!" << endl;
return;
}
else if( i == NOT_IN_HEAP )
{
cerr << "WARNING: Attempting to update object not in heap!" << endl;
return;
}
real old = ref(i).import;
real oldf = ref(i).factor;
ref(i).import = v;
ref(i).factor = f;
if( v*f<old*oldf )
downheap(i);
else
upheap(i);
}
heap_node *Heap::extract()
{
if( size<1 ) return 0;
swap(0,size-1);
size--;
downheap(0);
ref(size).obj->token = NOT_IN_HEAP;
return &ref(size);
}
heap_node *Heap::kill(int i)
{
if( i>=size )
cerr << "WARNING: Attempt to delete invalid heap node." << endl;
swap(i, size-1);
size--;
ref(size).obj->token = NOT_IN_HEAP;
if( ref(i).import*ref(i).factor < ref(size).import*ref(size).factor )
downheap(i);
else
upheap(i);
return &ref(size);
}