Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Stack.cs
Go to the documentation of this file.
4
6
8[DebuggerTypeProxy(typeof(StackDebugView<>))]
9[DebuggerDisplay("Count = {Count}")]
10[TypeForwardedFrom("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
12{
14 {
15 private readonly Stack<T> _stack;
16
17 private readonly int _version;
18
19 private int _index;
20
21 private T _currentElement;
22
23 public T Current
24 {
25 get
26 {
27 if (_index < 0)
28 {
30 }
31 return _currentElement;
32 }
33 }
34
35 object? IEnumerator.Current => Current;
36
37 internal Enumerator(Stack<T> stack)
38 {
39 _stack = stack;
40 _version = stack._version;
41 _index = -2;
42 _currentElement = default(T);
43 }
44
45 public void Dispose()
46 {
47 _index = -1;
48 }
49
50 public bool MoveNext()
51 {
53 {
55 }
56 bool flag;
57 if (_index == -2)
58 {
59 _index = _stack._size - 1;
60 flag = _index >= 0;
61 if (flag)
62 {
64 }
65 return flag;
66 }
67 if (_index == -1)
68 {
69 return false;
70 }
71 flag = --_index >= 0;
72 if (flag)
73 {
75 }
76 else
77 {
78 _currentElement = default(T);
79 }
80 return flag;
81 }
82
87
89 {
91 {
93 }
94 _index = -2;
95 _currentElement = default(T);
96 }
97 }
98
99 private T[] _array;
100
101 private int _size;
102
103 private int _version;
104
105 public int Count => _size;
106
107 bool ICollection.IsSynchronized => false;
108
109 object ICollection.SyncRoot => this;
110
111 public Stack()
112 {
113 _array = Array.Empty<T>();
114 }
115
116 public Stack(int capacity)
117 {
118 if (capacity < 0)
119 {
121 }
122 _array = new T[capacity];
123 }
124
126 {
127 if (collection == null)
128 {
129 throw new ArgumentNullException("collection");
130 }
132 }
133
134 public void Clear()
135 {
136 if (RuntimeHelpers.IsReferenceOrContainsReferences<T>())
137 {
138 Array.Clear(_array, 0, _size);
139 }
140 _size = 0;
141 _version++;
142 }
143
144 public bool Contains(T item)
145 {
146 if (_size != 0)
147 {
148 return Array.LastIndexOf(_array, item, _size - 1) != -1;
149 }
150 return false;
151 }
152
153 public void CopyTo(T[] array, int arrayIndex)
154 {
155 if (array == null)
156 {
157 throw new ArgumentNullException("array");
158 }
160 {
162 }
163 if (array.Length - arrayIndex < _size)
164 {
166 }
167 int num = 0;
168 int num2 = arrayIndex + _size;
169 while (num < _size)
170 {
171 array[--num2] = _array[num++];
172 }
173 }
174
176 {
177 if (array == null)
178 {
179 throw new ArgumentNullException("array");
180 }
181 if (array.Rank != 1)
182 {
184 }
185 if (array.GetLowerBound(0) != 0)
186 {
188 }
190 {
192 }
193 if (array.Length - arrayIndex < _size)
194 {
196 }
197 try
198 {
201 }
203 {
205 }
206 }
207
209 {
210 return new Enumerator(this);
211 }
212
214 {
215 return new Enumerator(this);
216 }
217
219 {
220 return new Enumerator(this);
221 }
222
223 public void TrimExcess()
224 {
225 int num = (int)((double)_array.Length * 0.9);
226 if (_size < num)
227 {
228 Array.Resize(ref _array, _size);
229 _version++;
230 }
231 }
232
233 public T Peek()
234 {
235 int num = _size - 1;
236 T[] array = _array;
237 if ((uint)num >= (uint)array.Length)
238 {
240 }
241 return array[num];
242 }
243
244 public bool TryPeek([MaybeNullWhen(false)] out T result)
245 {
246 int num = _size - 1;
247 T[] array = _array;
248 if ((uint)num >= (uint)array.Length)
249 {
250 result = default(T);
251 return false;
252 }
253 result = array[num];
254 return true;
255 }
256
257 public T Pop()
258 {
259 int num = _size - 1;
260 T[] array = _array;
261 if ((uint)num >= (uint)array.Length)
262 {
264 }
265 _version++;
266 _size = num;
267 T result = array[num];
268 if (RuntimeHelpers.IsReferenceOrContainsReferences<T>())
269 {
270 array[num] = default(T);
271 }
272 return result;
273 }
274
275 public bool TryPop([MaybeNullWhen(false)] out T result)
276 {
277 int num = _size - 1;
278 T[] array = _array;
279 if ((uint)num >= (uint)array.Length)
280 {
281 result = default(T);
282 return false;
283 }
284 _version++;
285 _size = num;
286 result = array[num];
287 if (RuntimeHelpers.IsReferenceOrContainsReferences<T>())
288 {
289 array[num] = default(T);
290 }
291 return true;
292 }
293
294 public void Push(T item)
295 {
296 int size = _size;
297 T[] array = _array;
298 if ((uint)size < (uint)array.Length)
299 {
300 array[size] = item;
301 _version++;
302 _size = size + 1;
303 }
304 else
305 {
307 }
308 }
309
310 [MethodImpl(MethodImplOptions.NoInlining)]
311 private void PushWithResize(T item)
312 {
313 Grow(_size + 1);
314 _array[_size] = item;
315 _version++;
316 _size++;
317 }
318
319 public int EnsureCapacity(int capacity)
320 {
321 if (capacity < 0)
322 {
324 }
325 if (_array.Length < capacity)
326 {
327 Grow(capacity);
328 _version++;
329 }
330 return _array.Length;
331 }
332
333 private void Grow(int capacity)
334 {
335 int num = ((_array.Length == 0) ? 4 : (2 * _array.Length));
336 if ((uint)num > Array.MaxLength)
337 {
338 num = Array.MaxLength;
339 }
340 if (num < capacity)
341 {
342 num = capacity;
343 }
344 Array.Resize(ref _array, num);
345 }
346
347 public T[] ToArray()
348 {
349 if (_size == 0)
350 {
351 return Array.Empty<T>();
352 }
353 T[] array = new T[_size];
354 for (int i = 0; i < _size; i++)
355 {
356 array[i] = _array[_size - i - 1];
357 }
358 return array;
359 }
360
365}
static void Reverse(Array array)
Definition Array.cs:2207
static int MaxLength
Definition Array.cs:471
static int LastIndexOf(Array array, object? value)
Definition Array.cs:1995
static unsafe void Clear(Array array)
Definition Array.cs:755
static unsafe void Copy(Array sourceArray, Array destinationArray, int length)
Definition Array.cs:624
Stack(IEnumerable< T > collection)
Definition Stack.cs:125
void CopyTo(T[] array, int arrayIndex)
Definition Stack.cs:153
void Grow(int capacity)
Definition Stack.cs:333
int EnsureCapacity(int capacity)
Definition Stack.cs:319
bool TryPeek([MaybeNullWhen(false)] out T result)
Definition Stack.cs:244
bool TryPop([MaybeNullWhen(false)] out T result)
Definition Stack.cs:275
static string ArgumentOutOfRange_Index
Definition SR.cs:30
static string InvalidOperation_EnumNotStarted
Definition SR.cs:46
static string InvalidOperation_EnumEnded
Definition SR.cs:42
static string Argument_InvalidArrayType
Definition SR.cs:54
static string Arg_NonZeroLowerBound
Definition SR.cs:14
static string InvalidOperation_EmptyStack
Definition SR.cs:40
static string InvalidOperation_EnumFailedVersion
Definition SR.cs:44
static string Arg_RankMultiDimNotSupported
Definition SR.cs:18
static string Argument_InvalidOffLen
Definition SR.cs:22
static string ArgumentOutOfRange_NeedNonNegNum
Definition SR.cs:32
Definition SR.cs:7
void CopyTo(T[] array, int arrayIndex)
new IEnumerator< T > GetEnumerator()