Terraria 1.4.0.5 Source Code
This commit is contained in:
commit
05205f009e
1059 changed files with 563450 additions and 0 deletions
149
DataStructures/DoubleStack`1.cs
Normal file
149
DataStructures/DoubleStack`1.cs
Normal file
|
@ -0,0 +1,149 @@
|
|||
// Decompiled with JetBrains decompiler
|
||||
// Type: Terraria.DataStructures.DoubleStack`1
|
||||
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
|
||||
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
|
||||
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
|
||||
|
||||
using System;
|
||||
|
||||
namespace Terraria.DataStructures
|
||||
{
|
||||
public class DoubleStack<T1>
|
||||
{
|
||||
private T1[][] _segmentList;
|
||||
private readonly int _segmentSize;
|
||||
private int _segmentCount;
|
||||
private readonly int _segmentShiftPosition;
|
||||
private int _start;
|
||||
private int _end;
|
||||
private int _size;
|
||||
private int _last;
|
||||
|
||||
public DoubleStack(int segmentSize = 1024, int initialSize = 0)
|
||||
{
|
||||
if (segmentSize < 16)
|
||||
segmentSize = 16;
|
||||
this._start = segmentSize / 2;
|
||||
this._end = this._start;
|
||||
this._size = 0;
|
||||
this._segmentShiftPosition = segmentSize + this._start;
|
||||
initialSize += this._start;
|
||||
int length = initialSize / segmentSize + 1;
|
||||
this._segmentList = new T1[length][];
|
||||
for (int index = 0; index < length; ++index)
|
||||
this._segmentList[index] = new T1[segmentSize];
|
||||
this._segmentSize = segmentSize;
|
||||
this._segmentCount = length;
|
||||
this._last = this._segmentSize * this._segmentCount - 1;
|
||||
}
|
||||
|
||||
public void PushFront(T1 front)
|
||||
{
|
||||
if (this._start == 0)
|
||||
{
|
||||
T1[][] objArray = new T1[this._segmentCount + 1][];
|
||||
for (int index = 0; index < this._segmentCount; ++index)
|
||||
objArray[index + 1] = this._segmentList[index];
|
||||
objArray[0] = new T1[this._segmentSize];
|
||||
this._segmentList = objArray;
|
||||
++this._segmentCount;
|
||||
this._start += this._segmentSize;
|
||||
this._end += this._segmentSize;
|
||||
this._last += this._segmentSize;
|
||||
}
|
||||
--this._start;
|
||||
this._segmentList[this._start / this._segmentSize][this._start % this._segmentSize] = front;
|
||||
++this._size;
|
||||
}
|
||||
|
||||
public T1 PopFront()
|
||||
{
|
||||
if (this._size == 0)
|
||||
throw new InvalidOperationException("The DoubleStack is empty.");
|
||||
T1[] segment1 = this._segmentList[this._start / this._segmentSize];
|
||||
int index1 = this._start % this._segmentSize;
|
||||
T1 obj = segment1[index1];
|
||||
segment1[index1] = default (T1);
|
||||
++this._start;
|
||||
--this._size;
|
||||
if (this._start >= this._segmentShiftPosition)
|
||||
{
|
||||
T1[] segment2 = this._segmentList[0];
|
||||
for (int index2 = 0; index2 < this._segmentCount - 1; ++index2)
|
||||
this._segmentList[index2] = this._segmentList[index2 + 1];
|
||||
this._segmentList[this._segmentCount - 1] = segment2;
|
||||
this._start -= this._segmentSize;
|
||||
this._end -= this._segmentSize;
|
||||
}
|
||||
if (this._size == 0)
|
||||
{
|
||||
this._start = this._segmentSize / 2;
|
||||
this._end = this._start;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
public T1 PeekFront()
|
||||
{
|
||||
if (this._size == 0)
|
||||
throw new InvalidOperationException("The DoubleStack is empty.");
|
||||
return this._segmentList[this._start / this._segmentSize][this._start % this._segmentSize];
|
||||
}
|
||||
|
||||
public void PushBack(T1 back)
|
||||
{
|
||||
if (this._end == this._last)
|
||||
{
|
||||
T1[][] objArray = new T1[this._segmentCount + 1][];
|
||||
for (int index = 0; index < this._segmentCount; ++index)
|
||||
objArray[index] = this._segmentList[index];
|
||||
objArray[this._segmentCount] = new T1[this._segmentSize];
|
||||
++this._segmentCount;
|
||||
this._segmentList = objArray;
|
||||
this._last += this._segmentSize;
|
||||
}
|
||||
this._segmentList[this._end / this._segmentSize][this._end % this._segmentSize] = back;
|
||||
++this._end;
|
||||
++this._size;
|
||||
}
|
||||
|
||||
public T1 PopBack()
|
||||
{
|
||||
if (this._size == 0)
|
||||
throw new InvalidOperationException("The DoubleStack is empty.");
|
||||
T1[] segment = this._segmentList[this._end / this._segmentSize];
|
||||
int index = this._end % this._segmentSize;
|
||||
T1 obj = segment[index];
|
||||
segment[index] = default (T1);
|
||||
--this._end;
|
||||
--this._size;
|
||||
if (this._size == 0)
|
||||
{
|
||||
this._start = this._segmentSize / 2;
|
||||
this._end = this._start;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
public T1 PeekBack()
|
||||
{
|
||||
if (this._size == 0)
|
||||
throw new InvalidOperationException("The DoubleStack is empty.");
|
||||
return this._segmentList[this._end / this._segmentSize][this._end % this._segmentSize];
|
||||
}
|
||||
|
||||
public void Clear(bool quickClear = false)
|
||||
{
|
||||
if (!quickClear)
|
||||
{
|
||||
for (int index = 0; index < this._segmentCount; ++index)
|
||||
Array.Clear((Array) this._segmentList[index], 0, this._segmentSize);
|
||||
}
|
||||
this._start = this._segmentSize / 2;
|
||||
this._end = this._start;
|
||||
this._size = 0;
|
||||
}
|
||||
|
||||
public int Count => this._size;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue