Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
TagList.cs
Go to the documentation of this file.
3
4namespace System.Diagnostics;
5
6public struct TagList : IList<KeyValuePair<string, object?>>, ICollection<KeyValuePair<string, object?>>, IEnumerable<KeyValuePair<string, object?>>, IEnumerable, IReadOnlyList<KeyValuePair<string, object?>>, IReadOnlyCollection<KeyValuePair<string, object?>>
7{
8 public struct Enumerator : IEnumerator<KeyValuePair<string, object?>>, IEnumerator, IDisposable
9 {
11
12 private int _index;
13
15
16 object IEnumerator.Current => _tagList[_index];
17
19 {
20 _index = -1;
22 }
23
24 public void Dispose()
25 {
27 }
28
29 public bool MoveNext()
30 {
31 _index++;
32 return _index < _tagList.Count;
33 }
34
35 public void Reset()
36 {
37 _index = -1;
38 }
39 }
40
42
44
46
48
50
52
54
56
57 private int _tagsCount;
58
60
61 public readonly int Count => _tagsCount;
62
63 public readonly bool IsReadOnly => false;
64
66 {
67 readonly get
68 {
69 if ((uint)index >= (uint)_tagsCount)
70 {
71 throw new ArgumentOutOfRangeException("index");
72 }
73 if (_overflowTags != null)
74 {
75 return _overflowTags[index];
76 }
77 return index switch
78 {
79 0 => Tag1,
80 1 => Tag2,
81 2 => Tag3,
82 3 => Tag4,
83 4 => Tag5,
84 5 => Tag6,
85 6 => Tag7,
86 7 => Tag8,
88 };
89 }
90 set
91 {
92 if ((uint)index >= (uint)_tagsCount)
93 {
94 throw new ArgumentOutOfRangeException("index");
95 }
96 if (_overflowTags != null)
97 {
99 return;
100 }
101 switch (index)
102 {
103 case 0:
104 Tag1 = value;
105 break;
106 case 1:
107 Tag2 = value;
108 break;
109 case 2:
110 Tag3 = value;
111 break;
112 case 3:
113 Tag4 = value;
114 break;
115 case 4:
116 Tag5 = value;
117 break;
118 case 5:
119 Tag6 = value;
120 break;
121 case 6:
122 Tag7 = value;
123 break;
124 case 7:
125 Tag8 = value;
126 break;
127 }
128 }
129 }
130
132
134 {
135 this = default(TagList);
136 _tagsCount = tagList.Length;
137 switch (_tagsCount)
138 {
139 case 8:
140 Tag8 = tagList[7];
141 goto case 7;
142 case 7:
143 Tag7 = tagList[6];
144 goto case 6;
145 case 6:
146 Tag6 = tagList[5];
147 goto case 5;
148 case 5:
149 Tag5 = tagList[4];
150 goto case 4;
151 case 4:
152 Tag4 = tagList[3];
153 goto case 3;
154 case 3:
155 Tag3 = tagList[2];
156 goto case 2;
157 case 2:
158 Tag2 = tagList[1];
159 goto case 1;
160 case 1:
161 Tag1 = tagList[0];
162 break;
163 case 0:
164 break;
165 default:
168 break;
169 }
170 }
171
172 public void Add(string key, object? value)
173 {
175 }
176
178 {
179 if (_overflowTags != null)
180 {
181 if (_tagsCount == _overflowTags.Length)
182 {
183 Array.Resize(ref _overflowTags, _tagsCount + 8);
184 }
185 _overflowTags[_tagsCount++] = tag;
186 return;
187 }
188 switch (_tagsCount)
189 {
190 default:
191 return;
192 case 0:
193 Tag1 = tag;
194 break;
195 case 1:
196 Tag2 = tag;
197 break;
198 case 2:
199 Tag3 = tag;
200 break;
201 case 3:
202 Tag4 = tag;
203 break;
204 case 4:
205 Tag5 = tag;
206 break;
207 case 5:
208 Tag6 = tag;
209 break;
210 case 6:
211 Tag7 = tag;
212 break;
213 case 7:
214 Tag8 = tag;
215 break;
216 case 8:
218 _overflowTags[8] = tag;
219 break;
220 }
221 _tagsCount++;
222 }
223
224 public readonly void CopyTo(Span<KeyValuePair<string, object?>> tags)
225 {
226 if (tags.Length < _tagsCount)
227 {
229 }
230 if (_overflowTags != null)
231 {
233 span = span.Slice(0, _tagsCount);
234 span.CopyTo(tags);
235 return;
236 }
237 switch (_tagsCount)
238 {
239 default:
240 return;
241 case 8:
242 tags[7] = Tag8;
243 goto case 7;
244 case 7:
245 tags[6] = Tag7;
246 goto case 6;
247 case 6:
248 tags[5] = Tag6;
249 goto case 5;
250 case 5:
251 tags[4] = Tag5;
252 goto case 4;
253 case 4:
254 tags[3] = Tag4;
255 goto case 3;
256 case 3:
257 tags[2] = Tag3;
258 goto case 2;
259 case 2:
260 tags[1] = Tag2;
261 break;
262 case 1:
263 break;
264 case 0:
265 return;
266 }
267 tags[0] = Tag1;
268 }
269
271 {
272 if (array == null)
273 {
274 throw new ArgumentNullException("array");
275 }
276 if ((uint)arrayIndex >= array.Length)
277 {
278 throw new ArgumentOutOfRangeException("arrayIndex");
279 }
280 CopyTo(array.AsSpan().Slice(arrayIndex));
281 }
282
284 {
285 if ((uint)index > (uint)_tagsCount)
286 {
287 throw new ArgumentOutOfRangeException("index");
288 }
289 if (index == _tagsCount)
290 {
291 Add(item);
292 return;
293 }
294 if (_tagsCount == 8 && _overflowTags == null)
295 {
297 }
298 if (_overflowTags != null)
299 {
300 if (_tagsCount == _overflowTags.Length)
301 {
302 Array.Resize(ref _overflowTags, _tagsCount + 8);
303 }
304 for (int num = _tagsCount; num > index; num--)
305 {
306 _overflowTags[num] = _overflowTags[num - 1];
307 }
309 _tagsCount++;
310 return;
311 }
312 switch (index)
313 {
314 default:
315 return;
316 case 0:
317 Tag8 = Tag7;
318 Tag7 = Tag6;
319 Tag6 = Tag5;
320 Tag5 = Tag4;
321 Tag4 = Tag3;
322 Tag3 = Tag2;
323 Tag2 = Tag1;
324 Tag1 = item;
325 break;
326 case 1:
327 Tag8 = Tag7;
328 Tag7 = Tag6;
329 Tag6 = Tag5;
330 Tag5 = Tag4;
331 Tag4 = Tag3;
332 Tag3 = Tag2;
333 Tag2 = item;
334 break;
335 case 2:
336 Tag8 = Tag7;
337 Tag7 = Tag6;
338 Tag6 = Tag5;
339 Tag5 = Tag4;
340 Tag4 = Tag3;
341 Tag3 = item;
342 break;
343 case 3:
344 Tag8 = Tag7;
345 Tag7 = Tag6;
346 Tag6 = Tag5;
347 Tag5 = Tag4;
348 Tag4 = item;
349 break;
350 case 4:
351 Tag8 = Tag7;
352 Tag7 = Tag6;
353 Tag6 = Tag5;
354 Tag5 = item;
355 break;
356 case 5:
357 Tag8 = Tag7;
358 Tag7 = Tag6;
359 Tag6 = item;
360 break;
361 case 6:
362 Tag8 = Tag7;
363 Tag7 = item;
364 break;
365 }
366 _tagsCount++;
367 }
368
369 public void RemoveAt(int index)
370 {
371 if ((uint)index >= (uint)_tagsCount)
372 {
373 throw new ArgumentOutOfRangeException("index");
374 }
375 if (_overflowTags != null)
376 {
377 for (int i = index; i < _tagsCount - 1; i++)
378 {
379 _overflowTags[i] = _overflowTags[i + 1];
380 }
381 _tagsCount--;
382 return;
383 }
384 switch (index)
385 {
386 case 0:
387 Tag1 = Tag2;
388 goto case 1;
389 case 1:
390 Tag2 = Tag3;
391 goto case 2;
392 case 2:
393 Tag3 = Tag4;
394 goto case 3;
395 case 3:
396 Tag4 = Tag5;
397 goto case 4;
398 case 4:
399 Tag5 = Tag6;
400 goto case 5;
401 case 5:
402 Tag6 = Tag7;
403 goto case 6;
404 case 6:
405 Tag7 = Tag8;
406 break;
407 }
408 _tagsCount--;
409 }
410
411 public void Clear()
412 {
413 _tagsCount = 0;
414 }
415
417 {
418 return IndexOf(item) >= 0;
419 }
420
422 {
423 int num = IndexOf(item);
424 if (num >= 0)
425 {
426 RemoveAt(num);
427 return true;
428 }
429 return false;
430 }
431
433 {
434 return new Enumerator(in this);
435 }
436
438 {
439 return new Enumerator(in this);
440 }
441
443 {
444 if (_overflowTags != null)
445 {
446 for (int i = 0; i < _tagsCount; i++)
447 {
449 {
450 return i;
451 }
452 }
453 return -1;
454 }
455 switch (_tagsCount)
456 {
457 case 1:
458 if (TagsEqual(Tag1, item))
459 {
460 return 0;
461 }
462 break;
463 case 2:
464 if (TagsEqual(Tag1, item))
465 {
466 return 0;
467 }
468 if (TagsEqual(Tag2, item))
469 {
470 return 1;
471 }
472 break;
473 case 3:
474 if (TagsEqual(Tag1, item))
475 {
476 return 0;
477 }
478 if (TagsEqual(Tag2, item))
479 {
480 return 1;
481 }
482 if (TagsEqual(Tag3, item))
483 {
484 return 2;
485 }
486 break;
487 case 4:
488 if (TagsEqual(Tag1, item))
489 {
490 return 0;
491 }
492 if (TagsEqual(Tag2, item))
493 {
494 return 1;
495 }
496 if (TagsEqual(Tag3, item))
497 {
498 return 2;
499 }
500 if (TagsEqual(Tag4, item))
501 {
502 return 3;
503 }
504 break;
505 case 5:
506 if (TagsEqual(Tag1, item))
507 {
508 return 0;
509 }
510 if (TagsEqual(Tag2, item))
511 {
512 return 1;
513 }
514 if (TagsEqual(Tag3, item))
515 {
516 return 2;
517 }
518 if (TagsEqual(Tag4, item))
519 {
520 return 3;
521 }
522 if (TagsEqual(Tag5, item))
523 {
524 return 4;
525 }
526 break;
527 case 6:
528 if (TagsEqual(Tag1, item))
529 {
530 return 0;
531 }
532 if (TagsEqual(Tag2, item))
533 {
534 return 1;
535 }
536 if (TagsEqual(Tag3, item))
537 {
538 return 2;
539 }
540 if (TagsEqual(Tag4, item))
541 {
542 return 3;
543 }
544 if (TagsEqual(Tag5, item))
545 {
546 return 4;
547 }
548 if (TagsEqual(Tag6, item))
549 {
550 return 5;
551 }
552 break;
553 case 7:
554 if (TagsEqual(Tag1, item))
555 {
556 return 0;
557 }
558 if (TagsEqual(Tag2, item))
559 {
560 return 1;
561 }
562 if (TagsEqual(Tag3, item))
563 {
564 return 2;
565 }
566 if (TagsEqual(Tag4, item))
567 {
568 return 3;
569 }
570 if (TagsEqual(Tag5, item))
571 {
572 return 4;
573 }
574 if (TagsEqual(Tag6, item))
575 {
576 return 5;
577 }
578 if (TagsEqual(Tag7, item))
579 {
580 return 6;
581 }
582 break;
583 case 8:
584 if (TagsEqual(Tag1, item))
585 {
586 return 0;
587 }
588 if (TagsEqual(Tag2, item))
589 {
590 return 1;
591 }
592 if (TagsEqual(Tag3, item))
593 {
594 return 2;
595 }
596 if (TagsEqual(Tag4, item))
597 {
598 return 3;
599 }
600 if (TagsEqual(Tag5, item))
601 {
602 return 4;
603 }
604 if (TagsEqual(Tag6, item))
605 {
606 return 5;
607 }
608 if (TagsEqual(Tag7, item))
609 {
610 return 6;
611 }
612 if (TagsEqual(Tag8, item))
613 {
614 return 7;
615 }
616 break;
617 }
618 return -1;
619 }
620
622 {
623 if (tag1.Key != tag2.Key)
624 {
625 return false;
626 }
627 if (tag1.Value == null)
628 {
629 if (tag2.Value != null)
630 {
631 return false;
632 }
633 }
634 else if (!tag1.Value.Equals(tag2.Value))
635 {
636 return false;
637 }
638 return true;
639 }
640
641 private void MoveTagsToTheArray()
642 {
644 _overflowTags[0] = Tag1;
645 _overflowTags[1] = Tag2;
646 _overflowTags[2] = Tag3;
647 _overflowTags[3] = Tag4;
648 _overflowTags[4] = Tag5;
649 _overflowTags[5] = Tag6;
650 _overflowTags[6] = Tag7;
651 _overflowTags[7] = Tag8;
652 }
653}
void CopyTo(KeyValuePair< TKey, TValue >[] array, int index)
static string Arg_BufferTooSmall
Definition SR.cs:42
Definition SR.cs:7
new IEnumerator< T > GetEnumerator()
Enumerator(in TagList tagList)
Definition TagList.cs:18
KeyValuePair< string, object?> Current
Definition TagList.cs:14
void RemoveAt(int index)
Definition TagList.cs:369
void Insert(int index, KeyValuePair< string, object?> item)
Definition TagList.cs:283
readonly int IndexOf(KeyValuePair< string, object?> item)
Definition TagList.cs:442
void Add(KeyValuePair< string, object?> tag)
Definition TagList.cs:177
readonly bool IsReadOnly
Definition TagList.cs:63
KeyValuePair< string, object >[] _overflowTags
Definition TagList.cs:59
TagList(ReadOnlySpan< KeyValuePair< string, object?> > tagList)
Definition TagList.cs:133
KeyValuePair< string, object > Tag5
Definition TagList.cs:49
void Add(string key, object? value)
Definition TagList.cs:172
bool Remove(KeyValuePair< string, object?> item)
Definition TagList.cs:421
KeyValuePair< string, object > Tag8
Definition TagList.cs:55
KeyValuePair< string, object > Tag4
Definition TagList.cs:47
readonly void CopyTo(Span< KeyValuePair< string, object?> > tags)
Definition TagList.cs:224
static bool TagsEqual(KeyValuePair< string, object > tag1, KeyValuePair< string, object > tag2)
Definition TagList.cs:621
KeyValuePair< string, object > Tag7
Definition TagList.cs:53
readonly? KeyValuePair< string, object?>[] Tags
Definition TagList.cs:131
KeyValuePair< string, object > Tag2
Definition TagList.cs:43
KeyValuePair< string, object > Tag6
Definition TagList.cs:51
KeyValuePair< string, object > Tag1
Definition TagList.cs:41
readonly void CopyTo(KeyValuePair< string, object?>[] array, int arrayIndex)
Definition TagList.cs:270
readonly IEnumerator< KeyValuePair< string, object?> > GetEnumerator()
Definition TagList.cs:432
KeyValuePair< string, object > Tag3
Definition TagList.cs:45
readonly bool Contains(KeyValuePair< string, object?> item)
Definition TagList.cs:416