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
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
|