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

363 lines
7.5 KiB
C#

using System;
namespace KDTree
{
// Token: 0x02000004 RID: 4
public class IntervalHeap<T>
{
// Token: 0x06000006 RID: 6 RVA: 0x0000211D File Offset: 0x0000031D
public IntervalHeap()
: this(64)
{
}
// Token: 0x06000007 RID: 7 RVA: 0x0000212A File Offset: 0x0000032A
public IntervalHeap(int capacity)
{
this.tData = new T[capacity];
this.tKeys = new double[capacity];
this.Capacity = capacity;
this.Size = 0;
}
// Token: 0x17000001 RID: 1
// (get) Token: 0x06000008 RID: 8 RVA: 0x00002160 File Offset: 0x00000360
// (set) Token: 0x06000009 RID: 9 RVA: 0x00002177 File Offset: 0x00000377
public int Size { get; private set; }
// Token: 0x17000002 RID: 2
// (get) Token: 0x0600000A RID: 10 RVA: 0x00002180 File Offset: 0x00000380
// (set) Token: 0x0600000B RID: 11 RVA: 0x00002197 File Offset: 0x00000397
public int Capacity { get; private set; }
// Token: 0x17000003 RID: 3
// (get) Token: 0x0600000C RID: 12 RVA: 0x000021A0 File Offset: 0x000003A0
public T Min
{
get
{
if (this.Size == 0)
{
throw new Exception();
}
return this.tData[0];
}
}
// Token: 0x17000004 RID: 4
// (get) Token: 0x0600000D RID: 13 RVA: 0x000021D4 File Offset: 0x000003D4
public T Max
{
get
{
if (this.Size == 0)
{
throw new Exception();
}
T t;
if (this.Size == 1)
{
t = this.tData[0];
}
else
{
t = this.tData[1];
}
return t;
}
}
// Token: 0x17000005 RID: 5
// (get) Token: 0x0600000E RID: 14 RVA: 0x0000222C File Offset: 0x0000042C
public double MinKey
{
get
{
if (this.Size == 0)
{
throw new Exception();
}
return this.tKeys[0];
}
}
// Token: 0x17000006 RID: 6
// (get) Token: 0x0600000F RID: 15 RVA: 0x0000225C File Offset: 0x0000045C
public double MaxKey
{
get
{
if (this.Size == 0)
{
throw new Exception();
}
double num;
if (this.Size == 1)
{
num = this.tKeys[0];
}
else
{
num = this.tKeys[1];
}
return num;
}
}
// Token: 0x06000010 RID: 16 RVA: 0x000022AC File Offset: 0x000004AC
public void Insert(double key, T value)
{
if (this.Size >= this.Capacity)
{
this.Capacity *= 2;
T[] array = new T[this.Capacity];
Array.Copy(this.tData, array, this.tData.Length);
this.tData = array;
double[] array2 = new double[this.Capacity];
Array.Copy(this.tKeys, array2, this.tKeys.Length);
this.tKeys = array2;
}
this.Size++;
this.tData[this.Size - 1] = value;
this.tKeys[this.Size - 1] = key;
this.SiftInsertedValueUp();
}
// Token: 0x06000011 RID: 17 RVA: 0x00002368 File Offset: 0x00000568
public void RemoveMin()
{
if (this.Size == 0)
{
throw new Exception();
}
this.Size--;
this.tData[0] = this.tData[this.Size];
this.tKeys[0] = this.tKeys[this.Size];
this.tData[this.Size] = default(T);
this.SiftDownMin(0);
}
// Token: 0x06000012 RID: 18 RVA: 0x000023F0 File Offset: 0x000005F0
public void ReplaceMin(double key, T value)
{
if (this.Size == 0)
{
throw new Exception();
}
this.tData[0] = value;
this.tKeys[0] = key;
if (this.Size > 1)
{
if (this.tKeys[1] < key)
{
this.Swap(0, 1);
}
this.SiftDownMin(0);
}
}
// Token: 0x06000013 RID: 19 RVA: 0x00002460 File Offset: 0x00000660
public void RemoveMax()
{
if (this.Size == 0)
{
throw new Exception();
}
if (this.Size == 1)
{
this.RemoveMin();
}
else
{
this.Size--;
this.tData[1] = this.tData[this.Size];
this.tKeys[1] = this.tKeys[this.Size];
this.tData[this.Size] = default(T);
this.SiftDownMax(1);
}
}
// Token: 0x06000014 RID: 20 RVA: 0x00002504 File Offset: 0x00000704
public void ReplaceMax(double key, T value)
{
if (this.Size == 0)
{
throw new Exception();
}
if (this.Size == 1)
{
this.ReplaceMin(key, value);
}
else
{
this.tData[1] = value;
this.tKeys[1] = key;
if (key < this.tKeys[0])
{
this.Swap(0, 1);
}
this.SiftDownMax(1);
}
}
// Token: 0x06000015 RID: 21 RVA: 0x00002580 File Offset: 0x00000780
private int Swap(int x, int y)
{
T t = this.tData[y];
double num = this.tKeys[y];
this.tData[y] = this.tData[x];
this.tKeys[y] = this.tKeys[x];
this.tData[x] = t;
this.tKeys[x] = num;
return y;
}
// Token: 0x06000016 RID: 22 RVA: 0x000025E8 File Offset: 0x000007E8
private void SiftInsertedValueUp()
{
int num = this.Size - 1;
if (num != 0)
{
if (num == 1)
{
if (this.tKeys[num] < this.tKeys[num - 1])
{
this.Swap(num, num - 1);
}
}
else if (num % 2 == 1)
{
int num2 = (num / 2 - 1) | 1;
if (this.tKeys[num] < this.tKeys[num - 1])
{
num = this.Swap(num, num - 1);
if (this.tKeys[num] < this.tKeys[num2 - 1])
{
num = this.Swap(num, num2 - 1);
this.SiftUpMin(num);
}
}
else if (this.tKeys[num] > this.tKeys[num2])
{
num = this.Swap(num, num2);
this.SiftUpMax(num);
}
}
else
{
int num2 = (num / 2 - 1) | 1;
if (this.tKeys[num] > this.tKeys[num2])
{
num = this.Swap(num, num2);
this.SiftUpMax(num);
}
else if (this.tKeys[num] < this.tKeys[num2 - 1])
{
num = this.Swap(num, num2 - 1);
this.SiftUpMin(num);
}
}
}
}
// Token: 0x06000017 RID: 23 RVA: 0x00002758 File Offset: 0x00000958
private void SiftUpMin(int iChild)
{
int num = (iChild / 2 - 1) & -2;
while (num >= 0 && this.tKeys[iChild] < this.tKeys[num])
{
this.Swap(iChild, num);
iChild = num;
num = (iChild / 2 - 1) & -2;
}
}
// Token: 0x06000018 RID: 24 RVA: 0x000027A8 File Offset: 0x000009A8
private void SiftUpMax(int iChild)
{
int num = (iChild / 2 - 1) | 1;
while (num >= 0 && this.tKeys[iChild] > this.tKeys[num])
{
this.Swap(iChild, num);
iChild = num;
num = (iChild / 2 - 1) | 1;
}
}
// Token: 0x06000019 RID: 25 RVA: 0x000027F4 File Offset: 0x000009F4
private void SiftDownMin(int iParent)
{
for (int i = iParent * 2 + 2; i < this.Size; i = iParent * 2 + 2)
{
if (i + 2 < this.Size && this.tKeys[i + 2] < this.tKeys[i])
{
i += 2;
}
if (this.tKeys[i] >= this.tKeys[iParent])
{
break;
}
this.Swap(iParent, i);
if (i + 1 < this.Size && this.tKeys[i + 1] < this.tKeys[i])
{
this.Swap(i, i + 1);
}
iParent = i;
}
}
// Token: 0x0600001A RID: 26 RVA: 0x000028B8 File Offset: 0x00000AB8
private void SiftDownMax(int iParent)
{
for (int i = iParent * 2 + 1; i <= this.Size; i = iParent * 2 + 1)
{
if (i == this.Size)
{
if (this.tKeys[i - 1] > this.tKeys[iParent])
{
this.Swap(iParent, i - 1);
}
break;
}
if (i + 2 == this.Size)
{
if (this.tKeys[i + 1] > this.tKeys[i])
{
if (this.tKeys[i + 1] > this.tKeys[iParent])
{
this.Swap(iParent, i + 1);
}
break;
}
}
else if (i + 2 < this.Size)
{
if (this.tKeys[i + 2] > this.tKeys[i])
{
i += 2;
}
}
if (this.tKeys[i] <= this.tKeys[iParent])
{
break;
}
this.Swap(iParent, i);
if (this.tKeys[i - 1] > this.tKeys[i])
{
this.Swap(i, i - 1);
}
iParent = i;
}
}
// Token: 0x04000001 RID: 1
private const int DEFAULT_SIZE = 64;
// Token: 0x04000002 RID: 2
private T[] tData;
// Token: 0x04000003 RID: 3
private double[] tKeys;
}
}