Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ValueStringBuilder.cs
Go to the documentation of this file.
3
4namespace System.Text;
5
6internal ref struct ValueStringBuilder
7{
8 private char[] _arrayToReturnToPool;
9
10 private Span<char> _chars;
11
12 private int _pos;
13
14 public int Length => _pos;
15
16 public ref char this[int index] => ref _chars[index];
17
18 public ValueStringBuilder(Span<char> initialBuffer)
19 {
21 _chars = initialBuffer;
22 _pos = 0;
23 }
24
25 public ValueStringBuilder(int initialCapacity)
26 {
27 _arrayToReturnToPool = ArrayPool<char>.Shared.Rent(initialCapacity);
29 _pos = 0;
30 }
31
32 public override string ToString()
33 {
34 string result = _chars.Slice(0, _pos).ToString();
35 Dispose();
36 return result;
37 }
38
39 [MethodImpl(MethodImplOptions.AggressiveInlining)]
40 public void Append(char c)
41 {
42 int pos = _pos;
43 if ((uint)pos < (uint)_chars.Length)
44 {
45 _chars[pos] = c;
46 _pos = pos + 1;
47 }
48 else
49 {
51 }
52 }
53
54 [MethodImpl(MethodImplOptions.AggressiveInlining)]
55 public void Append(string s)
56 {
57 if (s != null)
58 {
59 int pos = _pos;
60 if (s.Length == 1 && (uint)pos < (uint)_chars.Length)
61 {
62 _chars[pos] = s[0];
63 _pos = pos + 1;
64 }
65 else
66 {
68 }
69 }
70 }
71
72 private void AppendSlow(string s)
73 {
74 int pos = _pos;
75 if (pos > _chars.Length - s.Length)
76 {
77 Grow(s.Length);
78 }
79 s.CopyTo(_chars.Slice(pos));
80 _pos += s.Length;
81 }
82
84 {
85 int pos = _pos;
86 if (pos > _chars.Length - value.Length)
87 {
88 Grow(value.Length);
89 }
90 value.CopyTo(_chars.Slice(_pos));
91 _pos += value.Length;
92 }
93
94 [MethodImpl(MethodImplOptions.AggressiveInlining)]
96 {
97 int pos = _pos;
98 if (pos > _chars.Length - length)
99 {
100 Grow(length);
101 }
102 _pos = pos + length;
103 return _chars.Slice(pos, length);
104 }
105
106 [MethodImpl(MethodImplOptions.NoInlining)]
107 private void GrowAndAppend(char c)
108 {
109 Grow(1);
110 Append(c);
111 }
112
113 [MethodImpl(MethodImplOptions.NoInlining)]
114 private void Grow(int additionalCapacityBeyondPos)
115 {
116 char[] array = ArrayPool<char>.Shared.Rent((int)Math.Max((uint)(_pos + additionalCapacityBeyondPos), (uint)(_chars.Length * 2)));
117 _chars.Slice(0, _pos).CopyTo(array);
118 char[] arrayToReturnToPool = _arrayToReturnToPool;
120 if (arrayToReturnToPool != null)
121 {
122 ArrayPool<char>.Shared.Return(arrayToReturnToPool);
123 }
124 }
125
126 [MethodImpl(MethodImplOptions.AggressiveInlining)]
127 public void Dispose()
128 {
129 char[] arrayToReturnToPool = _arrayToReturnToPool;
130 this = default(System.Text.ValueStringBuilder);
131 if (arrayToReturnToPool != null)
132 {
133 ArrayPool<char>.Shared.Return(arrayToReturnToPool);
134 }
135 }
136}
static ArrayPool< T > Shared
Definition ArrayPool.cs:7
static byte Max(byte val1, byte val2)
Definition Math.cs:738
Span< T > Slice(int start)
Definition Span.cs:271
int Length
Definition Span.cs:70
ValueStringBuilder(Span< char > initialBuffer)
Span< char > AppendSpan(int length)
void Append(ReadOnlySpan< char > value)
void Grow(int additionalCapacityBeyondPos)
ValueStringBuilder(int initialCapacity)