Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
DoubleStack.cs
Go to the documentation of this file.
1using System;
2
4
5public class DoubleStack<T1>
6{
7 private T1[][] _segmentList;
8
9 private readonly int _segmentSize;
10
11 private int _segmentCount;
12
13 private readonly int _segmentShiftPosition;
14
15 private int _start;
16
17 private int _end;
18
19 private int _size;
20
21 private int _last;
22
23 public int Count => _size;
24
25 public DoubleStack(int segmentSize = 1024, int initialSize = 0)
26 {
27 if (segmentSize < 16)
28 {
29 segmentSize = 16;
30 }
31 _start = segmentSize / 2;
32 _end = _start;
33 _size = 0;
34 _segmentShiftPosition = segmentSize + _start;
35 initialSize += _start;
36 int num = initialSize / segmentSize + 1;
37 _segmentList = new T1[num][];
38 for (int i = 0; i < num; i++)
39 {
40 _segmentList[i] = new T1[segmentSize];
41 }
42 _segmentSize = segmentSize;
43 _segmentCount = num;
45 }
46
47 public void PushFront(T1 front)
48 {
49 if (_start == 0)
50 {
51 T1[][] array = new T1[_segmentCount + 1][];
52 for (int i = 0; i < _segmentCount; i++)
53 {
54 array[i + 1] = _segmentList[i];
55 }
56 array[0] = new T1[_segmentSize];
62 }
63 _start--;
65 int num = _start % _segmentSize;
66 obj[num] = front;
67 _size++;
68 }
69
70 public T1 PopFront()
71 {
72 if (_size == 0)
73 {
74 throw new InvalidOperationException("The DoubleStack is empty.");
75 }
77 int num = _start % _segmentSize;
78 T1 result = obj[num];
79 obj[num] = default(T1);
80 _start++;
81 _size--;
83 {
84 T1[] array = _segmentList[0];
85 for (int i = 0; i < _segmentCount - 1; i++)
86 {
87 _segmentList[i] = _segmentList[i + 1];
88 }
92 }
93 if (_size == 0)
94 {
95 _start = _segmentSize / 2;
96 _end = _start;
97 }
98 return result;
99 }
100
101 public T1 PeekFront()
102 {
103 if (_size == 0)
104 {
105 throw new InvalidOperationException("The DoubleStack is empty.");
106 }
108 int num = _start % _segmentSize;
109 return obj[num];
110 }
111
112 public void PushBack(T1 back)
113 {
114 if (_end == _last)
115 {
116 T1[][] array = new T1[_segmentCount + 1][];
117 for (int i = 0; i < _segmentCount; i++)
118 {
119 array[i] = _segmentList[i];
120 }
125 }
127 int num = _end % _segmentSize;
128 obj[num] = back;
129 _end++;
130 _size++;
131 }
132
133 public T1 PopBack()
134 {
135 if (_size == 0)
136 {
137 throw new InvalidOperationException("The DoubleStack is empty.");
138 }
140 int num = _end % _segmentSize;
141 T1 result = obj[num];
142 obj[num] = default(T1);
143 _end--;
144 _size--;
145 if (_size == 0)
146 {
147 _start = _segmentSize / 2;
148 _end = _start;
149 }
150 return result;
151 }
152
153 public T1 PeekBack()
154 {
155 if (_size == 0)
156 {
157 throw new InvalidOperationException("The DoubleStack is empty.");
158 }
160 int num = _end % _segmentSize;
161 return obj[num];
162 }
163
164 public void Clear(bool quickClear = false)
165 {
166 if (!quickClear)
167 {
168 for (int i = 0; i < _segmentCount; i++)
169 {
171 }
172 }
173 _start = _segmentSize / 2;
174 _end = _start;
175 _size = 0;
176 }
177}
static unsafe void Clear(Array array)
Definition Array.cs:755
void Clear(bool quickClear=false)
DoubleStack(int segmentSize=1024, int initialSize=0)