Files
Dec2017-Script-Dump/KdTreeLib/PriorityQueue.cs
T
2026-06-04 11:42:34 +02:00

125 lines
3.1 KiB
C#

using System;
namespace KdTree
{
// Token: 0x0200000D RID: 13
public class PriorityQueue<TItem, TPriority> : IPriorityQueue<TItem, TPriority>
{
// Token: 0x06000054 RID: 84 RVA: 0x00002DB2 File Offset: 0x00000FB2
public PriorityQueue(int capacity, ITypeMath<TPriority> priorityMath)
{
if (capacity <= 0)
{
throw new ArgumentException("Capacity must be greater than zero");
}
this.capacity = capacity;
this.queue = new ItemPriority<TItem, TPriority>[capacity];
this.priorityMath = priorityMath;
}
// Token: 0x17000013 RID: 19
// (get) Token: 0x06000055 RID: 85 RVA: 0x00002DE3 File Offset: 0x00000FE3
public int Count
{
get
{
return this.count;
}
}
// Token: 0x06000056 RID: 86 RVA: 0x00002DEC File Offset: 0x00000FEC
private void ExpandCapacity()
{
this.capacity *= 2;
ItemPriority<TItem, TPriority>[] array = new ItemPriority<TItem, TPriority>[this.capacity];
Array.Copy(this.queue, array, this.queue.Length);
this.queue = array;
}
// Token: 0x06000057 RID: 87 RVA: 0x00002E30 File Offset: 0x00001030
public void Enqueue(TItem item, TPriority priority)
{
int num = this.count + 1;
this.count = num;
if (num > this.capacity)
{
this.ExpandCapacity();
}
int num2 = this.count - 1;
this.queue[num2] = new ItemPriority<TItem, TPriority>
{
Item = item,
Priority = priority
};
this.ReorderItem(num2, -1);
}
// Token: 0x06000058 RID: 88 RVA: 0x00002E94 File Offset: 0x00001094
public TItem Dequeue()
{
TItem item = this.queue[0].Item;
this.queue[0].Item = default(TItem);
this.queue[0].Priority = this.priorityMath.MinValue;
this.ReorderItem(0, 1);
this.count--;
return item;
}
// Token: 0x06000059 RID: 89 RVA: 0x00002EFC File Offset: 0x000010FC
private void ReorderItem(int index, int direction)
{
if (direction != -1 && direction != 1)
{
throw new ArgumentException("Invalid Direction");
}
ItemPriority<TItem, TPriority> itemPriority = this.queue[index];
int num = index + direction;
while (num >= 0 && num < this.count)
{
ItemPriority<TItem, TPriority> itemPriority2 = this.queue[num];
int num2 = this.priorityMath.Compare(itemPriority.Priority, itemPriority2.Priority);
if ((direction != -1 || num2 <= 0) && (direction != 1 || num2 >= 0))
{
break;
}
this.queue[index] = itemPriority2;
this.queue[num] = itemPriority;
index += direction;
num += direction;
}
}
// Token: 0x0600005A RID: 90 RVA: 0x00002F94 File Offset: 0x00001194
public TItem GetHighest()
{
if (this.count == 0)
{
throw new Exception("Queue is empty");
}
return this.queue[0].Item;
}
// Token: 0x0600005B RID: 91 RVA: 0x00002FBA File Offset: 0x000011BA
public TPriority GetHighestPriority()
{
if (this.count == 0)
{
throw new Exception("Queue is empty");
}
return this.queue[0].Priority;
}
// Token: 0x04000017 RID: 23
private ITypeMath<TPriority> priorityMath;
// Token: 0x04000018 RID: 24
private ItemPriority<TItem, TPriority>[] queue;
// Token: 0x04000019 RID: 25
private int capacity;
// Token: 0x0400001A RID: 26
private int count;
}
}