00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: $RCSfile: vtkPriorityQueue.h,v $ 00005 Language: C++ 00006 00007 Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 00008 All rights reserved. 00009 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00010 00011 This software is distributed WITHOUT ANY WARRANTY; without even 00012 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00013 PURPOSE. See the above copyright notice for more information. 00014 00015 =========================================================================*/ 00056 #ifndef __vtkPriorityQueue_h 00057 #define __vtkPriorityQueue_h 00058 00059 #include "vtkObject.h" 00060 00061 #include "vtkIdTypeArray.h" // Needed for inline methods 00062 00063 class VTK_COMMON_EXPORT vtkPriorityQueue : public vtkObject 00064 { 00065 public: 00066 //BTX 00067 class Item 00068 { 00069 public: 00070 float priority; 00071 vtkIdType id; 00072 }; 00073 //ETX 00074 00077 static vtkPriorityQueue *New(); 00078 00079 vtkTypeRevisionMacro(vtkPriorityQueue,vtkObject); 00080 void PrintSelf(ostream& os, vtkIndent indent); 00081 00083 void Allocate(const vtkIdType sz, const vtkIdType ext=1000); 00084 00087 void Insert(float priority, vtkIdType id); 00088 00093 vtkIdType Pop(vtkIdType location, float &priority); 00094 //ETX 00095 00098 vtkIdType Pop(vtkIdType location=0); 00099 00102 vtkIdType Peek(vtkIdType location, float &priority); 00103 //ETX 00104 00107 vtkIdType Peek(vtkIdType location=0); 00108 00111 float DeleteId(vtkIdType id); 00112 00115 float GetPriority(vtkIdType id); 00116 00118 vtkIdType GetNumberOfItems() {return this->MaxId+1;}; 00119 00122 void Reset(); 00123 00124 protected: 00125 vtkPriorityQueue(); 00126 ~vtkPriorityQueue(); 00127 00128 Item *Resize(const vtkIdType sz); 00129 00130 vtkIdTypeArray *ItemLocation; 00131 Item *Array; 00132 vtkIdType Size; 00133 vtkIdType MaxId; 00134 vtkIdType Extend; 00135 private: 00136 vtkPriorityQueue(const vtkPriorityQueue&); // Not implemented. 00137 void operator=(const vtkPriorityQueue&); // Not implemented. 00138 }; 00139 00140 inline float vtkPriorityQueue::DeleteId(vtkIdType id) 00141 { 00142 float priority=VTK_LARGE_FLOAT; 00143 int loc; 00144 00145 if ( id <= this->ItemLocation->GetMaxId() && 00146 (loc=this->ItemLocation->GetValue(id)) != -1 ) 00147 { 00148 this->Pop(loc,priority); 00149 } 00150 return priority; 00151 } 00152 00153 inline float vtkPriorityQueue::GetPriority(vtkIdType id) 00154 { 00155 int loc; 00156 00157 if ( id <= this->ItemLocation->GetMaxId() && 00158 (loc=this->ItemLocation->GetValue(id)) != -1 ) 00159 { 00160 return this->Array[loc].priority; 00161 } 00162 return VTK_LARGE_FLOAT; 00163 } 00164 00165 inline vtkIdType vtkPriorityQueue::Peek(vtkIdType location, float &priority) 00166 { 00167 if ( this->MaxId < 0 ) 00168 { 00169 return -1; 00170 } 00171 else 00172 { 00173 priority = this->Array[location].priority; 00174 return this->Array[location].id; 00175 } 00176 } 00177 00178 inline vtkIdType vtkPriorityQueue::Peek(vtkIdType location) 00179 { 00180 if ( this->MaxId < 0 ) 00181 { 00182 return -1; 00183 } 00184 else 00185 { 00186 return this->Array[location].id; 00187 } 00188 } 00189 00190 #endif