Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Stack.cs
Go to the documentation of this file.
3
4namespace System.Collections;
5
7[DebuggerTypeProxy(typeof(StackDebugView))]
8[DebuggerDisplay("Count = {Count}")]
9[TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
11{
12 private sealed class SyncStack : Stack
13 {
14 private readonly Stack _s;
15
16 private readonly object _root;
17
18 public override bool IsSynchronized => true;
19
20 public override object SyncRoot => _root;
21
22 public override int Count
23 {
24 get
25 {
26 lock (_root)
27 {
28 return _s.Count;
29 }
30 }
31 }
32
33 internal SyncStack(Stack stack)
34 {
35 _s = stack;
36 _root = stack.SyncRoot;
37 }
38
39 public override bool Contains(object obj)
40 {
41 lock (_root)
42 {
43 return _s.Contains(obj);
44 }
45 }
46
47 public override object Clone()
48 {
49 lock (_root)
50 {
51 return new SyncStack((Stack)_s.Clone());
52 }
53 }
54
55 public override void Clear()
56 {
57 lock (_root)
58 {
59 _s.Clear();
60 }
61 }
62
63 public override void CopyTo(Array array, int arrayIndex)
64 {
65 lock (_root)
66 {
68 }
69 }
70
71 public override void Push(object value)
72 {
73 lock (_root)
74 {
75 _s.Push(value);
76 }
77 }
78
79 public override object Pop()
80 {
81 lock (_root)
82 {
83 return _s.Pop();
84 }
85 }
86
87 public override IEnumerator GetEnumerator()
88 {
89 lock (_root)
90 {
91 return _s.GetEnumerator();
92 }
93 }
94
95 public override object Peek()
96 {
97 lock (_root)
98 {
99 return _s.Peek();
100 }
101 }
102
103 public override object[] ToArray()
104 {
105 lock (_root)
106 {
107 return _s.ToArray();
108 }
109 }
110 }
111
112 private sealed class StackEnumerator : IEnumerator, ICloneable
113 {
114 private readonly Stack _stack;
115
116 private int _index;
117
118 private readonly int _version;
119
120 private object _currentElement;
121
122 public object Current
123 {
124 get
125 {
126 if (_index == -2)
127 {
129 }
130 if (_index == -1)
131 {
133 }
134 return _currentElement;
135 }
136 }
137
138 internal StackEnumerator(Stack stack)
139 {
140 _stack = stack;
142 _index = -2;
143 _currentElement = null;
144 }
145
146 public object Clone()
147 {
148 return MemberwiseClone();
149 }
150
151 public bool MoveNext()
152 {
153 if (_version != _stack._version)
154 {
156 }
157 bool flag;
158 if (_index == -2)
159 {
160 _index = _stack._size - 1;
161 flag = _index >= 0;
162 if (flag)
163 {
165 }
166 return flag;
167 }
168 if (_index == -1)
169 {
170 return false;
171 }
172 flag = --_index >= 0;
173 if (flag)
174 {
176 }
177 else
178 {
179 _currentElement = null;
180 }
181 return flag;
182 }
183
184 public void Reset()
185 {
186 if (_version != _stack._version)
187 {
189 }
190 _index = -2;
191 _currentElement = null;
192 }
193 }
194
195 internal sealed class StackDebugView
196 {
197 private readonly Stack _stack;
198
199 [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
200 public object[] Items => _stack.ToArray();
201
202 public StackDebugView(Stack stack)
203 {
204 if (stack == null)
205 {
206 throw new ArgumentNullException("stack");
207 }
208 _stack = stack;
209 }
210 }
211
212 private object[] _array;
213
214 private int _size;
215
216 private int _version;
217
218 public virtual int Count => _size;
219
220 public virtual bool IsSynchronized => false;
221
222 public virtual object SyncRoot => this;
223
224 public Stack()
225 {
226 _array = new object[10];
227 _size = 0;
228 _version = 0;
229 }
230
231 public Stack(int initialCapacity)
232 {
233 if (initialCapacity < 0)
234 {
236 }
237 if (initialCapacity < 10)
238 {
239 initialCapacity = 10;
240 }
241 _array = new object[initialCapacity];
242 _size = 0;
243 _version = 0;
244 }
245
246 public Stack(ICollection col)
247 : this(col?.Count ?? 32)
248 {
249 if (col == null)
250 {
251 throw new ArgumentNullException("col");
252 }
253 IEnumerator enumerator = col.GetEnumerator();
254 while (enumerator.MoveNext())
255 {
256 Push(enumerator.Current);
257 }
258 }
259
260 public virtual void Clear()
261 {
262 Array.Clear(_array, 0, _size);
263 _size = 0;
264 _version++;
265 }
266
267 public virtual object Clone()
268 {
269 Stack stack = new Stack(_size);
270 stack._size = _size;
271 Array.Copy(_array, stack._array, _size);
272 stack._version = _version;
273 return stack;
274 }
275
276 public virtual bool Contains(object? obj)
277 {
278 int size = _size;
279 while (size-- > 0)
280 {
281 if (obj == null)
282 {
283 if (_array[size] == null)
284 {
285 return true;
286 }
287 }
288 else if (_array[size] != null && _array[size].Equals(obj))
289 {
290 return true;
291 }
292 }
293 return false;
294 }
295
296 public virtual void CopyTo(Array array, int index)
297 {
298 if (array == null)
299 {
300 throw new ArgumentNullException("array");
301 }
302 if (array.Rank != 1)
303 {
305 }
306 if (index < 0)
307 {
309 }
310 if (array.Length - index < _size)
311 {
313 }
314 int i = 0;
315 if (array is object[] array2)
316 {
317 for (; i < _size; i++)
318 {
319 array2[i + index] = _array[_size - i - 1];
320 }
321 }
322 else
323 {
324 for (; i < _size; i++)
325 {
326 array.SetValue(_array[_size - i - 1], i + index);
327 }
328 }
329 }
330
331 public virtual IEnumerator GetEnumerator()
332 {
333 return new StackEnumerator(this);
334 }
335
336 public virtual object? Peek()
337 {
338 if (_size == 0)
339 {
341 }
342 return _array[_size - 1];
343 }
344
345 public virtual object? Pop()
346 {
347 if (_size == 0)
348 {
350 }
351 _version++;
352 object result = _array[--_size];
353 _array[_size] = null;
354 return result;
355 }
356
357 public virtual void Push(object? obj)
358 {
359 if (_size == _array.Length)
360 {
361 object[] array = new object[2 * _array.Length];
363 _array = array;
364 }
365 _array[_size++] = obj;
366 _version++;
367 }
368
369 public static Stack Synchronized(Stack stack)
370 {
371 if (stack == null)
372 {
373 throw new ArgumentNullException("stack");
374 }
375 return new SyncStack(stack);
376 }
377
378 public virtual object?[] ToArray()
379 {
380 if (_size == 0)
381 {
382 return Array.Empty<object>();
383 }
384 object[] array = new object[_size];
385 for (int i = 0; i < _size; i++)
386 {
387 array[i] = _array[_size - i - 1];
388 }
389 return array;
390 }
391}
static unsafe void Clear(Array array)
Definition Array.cs:755
static unsafe void Copy(Array sourceArray, Array destinationArray, int length)
Definition Array.cs:624
override bool Contains(object obj)
Definition Stack.cs:39
override object Clone()
Definition Stack.cs:47
override void CopyTo(Array array, int arrayIndex)
Definition Stack.cs:63
override IEnumerator GetEnumerator()
Definition Stack.cs:87
override object[] ToArray()
Definition Stack.cs:103
override void Push(object value)
Definition Stack.cs:71
virtual IEnumerator GetEnumerator()
Definition Stack.cs:331
virtual ? object[] ToArray()
Definition Stack.cs:378
virtual ? object Peek()
Definition Stack.cs:336
virtual bool Contains(object? obj)
Definition Stack.cs:276
static Stack Synchronized(Stack stack)
Definition Stack.cs:369
virtual void Push(object? obj)
Definition Stack.cs:357
virtual int Count
Definition Stack.cs:218
virtual object SyncRoot
Definition Stack.cs:222
virtual bool IsSynchronized
Definition Stack.cs:220
virtual ? object Pop()
Definition Stack.cs:345
Stack(ICollection col)
Definition Stack.cs:246
virtual void Clear()
Definition Stack.cs:260
virtual object Clone()
Definition Stack.cs:267
Stack(int initialCapacity)
Definition Stack.cs:231
virtual void CopyTo(Array array, int index)
Definition Stack.cs:296
static string InvalidOperation_EnumNotStarted
Definition SR.cs:46
static string InvalidOperation_EnumEnded
Definition SR.cs:42
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