www.pudn.com > 3dSimplifier.zip > Heap.cpp, change:2000-01-11,size:2058b


#include "StdAfx.h" 
#include <iostream.h> 
#include "Heap.h" 
 
void Heap::swap(int i,int j) 
{ 
    heap_node tmp = ref(i); 
 
    ref(i) = ref(j); 
    ref(j) = tmp; 
 
    ref(i).obj->setHeapPos(i); 
    ref(j).obj->setHeapPos(j); 
} 
 
void Heap::upheap(int i) 
{ 
    if( i==0 ) return; 
 
    if( ref(i).import > ref(parent(i)).import ) { 
        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(largest).import ) largest = l; 
    if( r<size && ref(r).import > ref(largest).import ) largest = r; 
 
    if( largest != i ) { 
        swap(i,largest); 
        downheap(largest); 
    } 
} 
 
void Heap::insert(Heapable *t,float v) 
{ 
    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).obj->setHeapPos(i); 
 
    upheap(i); 
} 
 
void Heap::update(Heapable *t,float v) 
{ 
    int i = t->getHeapPos(); 
 
    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; 
    } 
 
    float old=ref(i).import; 
    ref(i).import = v; 
 
    if( v<old ) 
        downheap(i); 
    else 
        upheap(i); 
} 
 
heap_node *Heap::extract() 
{ 
    if( size<1 ) return 0; 
 
    swap(0,size-1); 
    size--; 
 
    downheap(0); 
 
    ref(size).obj->notInHeap(); 
 
    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->notInHeap(); 
 
    if( ref(i).import  ref(size).import ) 
	downheap(i); 
    else 
	upheap(i); 
 
 
    return &ref(size); 
}