mirror of
https://github.com/zeek/zeek.git
synced 2025-10-04 15:48:19 +00:00
Initial import of svn+ssh:://svn.icir.org/bro/trunk/bro as of r7088
This commit is contained in:
commit
61757ac78b
1383 changed files with 380824 additions and 0 deletions
99
src/PriorityQueue.h
Normal file
99
src/PriorityQueue.h
Normal file
|
@ -0,0 +1,99 @@
|
|||
// $Id: PriorityQueue.h 6219 2008-10-01 05:39:07Z vern $
|
||||
//
|
||||
// See the file "COPYING" in the main distribution directory for copyright.
|
||||
|
||||
#ifndef __PriorityQueue__
|
||||
#define __PriorityQueue__
|
||||
|
||||
#include <math.h>
|
||||
|
||||
class PriorityQueue;
|
||||
|
||||
class PQ_Element {
|
||||
public:
|
||||
PQ_Element(double t) { time = t; offset = -1; }
|
||||
virtual ~PQ_Element() { }
|
||||
|
||||
double Time() const { return time; }
|
||||
|
||||
int Offset() const { return offset; }
|
||||
void SetOffset(int off) { offset = off; }
|
||||
|
||||
void MinimizeTime() { time = -HUGE_VAL; }
|
||||
|
||||
protected:
|
||||
PQ_Element() { }
|
||||
double time;
|
||||
int offset;
|
||||
};
|
||||
|
||||
class PriorityQueue {
|
||||
public:
|
||||
PriorityQueue(int initial_size = 16);
|
||||
~PriorityQueue();
|
||||
|
||||
// Returns the top of queue, or nil if the queue is empty.
|
||||
PQ_Element* Top() const
|
||||
{
|
||||
if ( heap_size == 0 )
|
||||
return 0;
|
||||
else
|
||||
return heap[0];
|
||||
}
|
||||
|
||||
// Removes (and returns) top of queue. Returns nil if the queue
|
||||
// is empty.
|
||||
PQ_Element* Remove();
|
||||
|
||||
// Removes element e. Returns e, or nil if e wasn't in the queue.
|
||||
// Note that e will be modified via MinimizeTime().
|
||||
PQ_Element* Remove(PQ_Element* e);
|
||||
|
||||
// Add a new element to the queue. Returns 0 on failure (not enough
|
||||
// memory to add the element), 1 on success.
|
||||
int Add(PQ_Element* e);
|
||||
|
||||
int Size() const { return heap_size; }
|
||||
int PeakSize() const { return peak_heap_size; }
|
||||
|
||||
protected:
|
||||
int Resize(int new_size);
|
||||
|
||||
void BubbleUp(int bin);
|
||||
void BubbleDown(int bin);
|
||||
|
||||
int Parent(int bin) const
|
||||
{
|
||||
return bin >> 1;
|
||||
}
|
||||
|
||||
int LeftChild(int bin) const
|
||||
{
|
||||
return bin << 1;
|
||||
}
|
||||
|
||||
int RightChild(int bin) const
|
||||
{
|
||||
return LeftChild(bin) + 1;
|
||||
}
|
||||
|
||||
void SetElement(int bin, PQ_Element* e)
|
||||
{
|
||||
heap[bin] = e;
|
||||
e->SetOffset(bin);
|
||||
}
|
||||
|
||||
void Swap(int bin1, int bin2)
|
||||
{
|
||||
PQ_Element* t = heap[bin1];
|
||||
SetElement(bin1, heap[bin2]);
|
||||
SetElement(bin2, t);
|
||||
}
|
||||
|
||||
PQ_Element** heap;
|
||||
int heap_size;
|
||||
int peak_heap_size;
|
||||
int max_heap_size;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue