Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
5.1 KiB

2 years ago
/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkPriorityQueue.h,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// .NAME vtkPriorityQueue - an list of ids arranged in priority order
// .SECTION Description
// vtkPriorityQueue is a general object for creating and manipulating lists
// of object ids (e.g., point or cell ids). Object ids are sorted according
// to a user-specified priority, where entries at the top of the queue have
// the smallest values.
//
// This implementation provides a feature beyond the usual ability to insert
// and retrieve (or pop) values from the queue. It is also possible to
// pop any item in the queue given its id number. This allows you to delete
// entries in the queue which can useful for reinserting an item into the
// queue.
//
// .SECTION Caveats
// This implementation is a variation of the priority queue described in
// "Data Structures & Algorithms" by Aho, Hopcroft, Ullman. It creates
// a balanced, partially ordered binary tree implemented as an ordered
// array. This avoids the overhead associated with parent/child pointers,
// and frequent memory allocation and deallocation.
#ifndef __vtkPriorityQueue_h
#define __vtkPriorityQueue_h
#include "vtkObject.h"
#include "vtkIdTypeArray.h" // Needed for inline methods
class VTK_COMMON_EXPORT vtkPriorityQueue : public vtkObject
{
public:
//BTX
class Item
{
public:
double priority;
vtkIdType id;
};
//ETX
// Description:
// Instantiate priority queue with default size and extension size of 1000.
static vtkPriorityQueue *New();
vtkTypeRevisionMacro(vtkPriorityQueue,vtkObject);
void PrintSelf(ostream& os, vtkIndent indent);
// Description:
// Allocate initial space for priority queue.
void Allocate(const vtkIdType sz, const vtkIdType ext=1000);
// Description:
// Insert id with priority specified. The id is generally an
// index like a point id or cell id.
void Insert(double priority, vtkIdType id);
// Description:
// Removes item at specified location from tree; then reorders and
// balances tree. The location == 0 is the root of the tree. If queue
// is exhausted, then a value < 0 is returned. (Note: the location
// is not the same as deleting an id; id is mapped to location.)
//BTX
vtkIdType Pop(vtkIdType location, double &priority);
//ETX
// Description:
// Same as above but simplified for easier wrapping into interpreted
// languages.
vtkIdType Pop(vtkIdType location=0);
// Description:
// Peek into the queue without actually removing anything. Returns the
// id and the priority.
//BTX
vtkIdType Peek(vtkIdType location, double &priority);
//ETX
// Description:
// Peek into the queue without actually removing anything. Returns the
// id.
vtkIdType Peek(vtkIdType location=0);
// Description:
// Delete entry in queue with specified id. Returns priority value
// associated with that id; or VTK_DOUBLE_MAX if not in queue.
double DeleteId(vtkIdType id);
// Description:
// Get the priority of an entry in the queue with specified id. Returns
// priority value of that id or VTK_DOUBLE_MAX if not in queue.
double GetPriority(vtkIdType id);
// Description:
// Return the number of items in this queue.
vtkIdType GetNumberOfItems() {return this->MaxId+1;};
// Description:
// Empty the queue but without releasing memory. This avoids the
// overhead of memory allocation/deletion.
void Reset();
protected:
vtkPriorityQueue();
~vtkPriorityQueue();
Item *Resize(const vtkIdType sz);
vtkIdTypeArray *ItemLocation;
Item *Array;
vtkIdType Size;
vtkIdType MaxId;
vtkIdType Extend;
private:
vtkPriorityQueue(const vtkPriorityQueue&); // Not implemented.
void operator=(const vtkPriorityQueue&); // Not implemented.
};
inline double vtkPriorityQueue::DeleteId(vtkIdType id)
{
double priority=VTK_DOUBLE_MAX;
int loc;
if ( id <= this->ItemLocation->GetMaxId() &&
(loc=this->ItemLocation->GetValue(id)) != -1 )
{
this->Pop(loc,priority);
}
return priority;
}
inline double vtkPriorityQueue::GetPriority(vtkIdType id)
{
int loc;
if ( id <= this->ItemLocation->GetMaxId() &&
(loc=this->ItemLocation->GetValue(id)) != -1 )
{
return this->Array[loc].priority;
}
return VTK_DOUBLE_MAX;
}
inline vtkIdType vtkPriorityQueue::Peek(vtkIdType location, double &priority)
{
if ( this->MaxId < 0 )
{
return -1;
}
else
{
priority = this->Array[location].priority;
return this->Array[location].id;
}
}
inline vtkIdType vtkPriorityQueue::Peek(vtkIdType location)
{
if ( this->MaxId < 0 )
{
return -1;
}
else
{
return this->Array[location].id;
}
}
#endif