Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ValueStringBuilder.cs
Go to the documentation of this file.
4
5namespace System.Text;
6
7internal ref struct ValueStringBuilder
8{
9 private char[] _arrayToReturnToPool;
10
11 private Span<char> _chars;
12
13 private int _pos;
14
15 public int Length
16 {
17 get
18 {
19 return _pos;
20 }
21 set
22 {
23 _pos = value;
24 }
25 }
26
27 public ref char this[int index] => ref _chars[index];
28
29 public Span<char> RawChars => _chars;
30
31 public ValueStringBuilder(Span<char> initialBuffer)
32 {
34 _chars = initialBuffer;
35 _pos = 0;
36 }
37
38 public ValueStringBuilder(int initialCapacity)
39 {
40 _arrayToReturnToPool = ArrayPool<char>.Shared.Rent(initialCapacity);
42 _pos = 0;
43 }
44
45 public void EnsureCapacity(int capacity)
46 {
47 if ((uint)capacity > (uint)_chars.Length)
48 {
50 }
51 }
52
53 public ref char GetPinnableReference()
54 {
55 return ref MemoryMarshal.GetReference(_chars);
56 }
57
58 public override string ToString()
59 {
60 string result = _chars.Slice(0, _pos).ToString();
61 Dispose();
62 return result;
63 }
64
66 {
67 return _chars.Slice(0, _pos);
68 }
69
71 {
72 return _chars.Slice(start, _pos - start);
73 }
74
76 {
77 return _chars.Slice(start, length);
78 }
79
80 [MethodImpl(MethodImplOptions.AggressiveInlining)]
81 public void Append(char c)
82 {
83 int pos = _pos;
84 if ((uint)pos < (uint)_chars.Length)
85 {
86 _chars[pos] = c;
87 _pos = pos + 1;
88 }
89 else
90 {
92 }
93 }
94
95 [MethodImpl(MethodImplOptions.AggressiveInlining)]
96 public void Append(string s)
97 {
98 if (s != null)
99 {
100 int pos = _pos;
101 if (s.Length == 1 && (uint)pos < (uint)_chars.Length)
102 {
103 _chars[pos] = s[0];
104 _pos = pos + 1;
105 }
106 else
107 {
108 AppendSlow(s);
109 }
110 }
111 }
112
113 private void AppendSlow(string s)
114 {
115 int pos = _pos;
116 if (pos > _chars.Length - s.Length)
117 {
118 Grow(s.Length);
119 }
120 s.CopyTo(_chars.Slice(pos));
121 _pos += s.Length;
122 }
123
124 public unsafe void Append(char* value, int length)
125 {
126 int pos = _pos;
127 if (pos > _chars.Length - length)
128 {
129 Grow(length);
130 }
132 for (int i = 0; i < span.Length; i++)
133 {
134 span[i] = *(value++);
135 }
136 _pos += length;
137 }
138
140 {
141 int pos = _pos;
142 if (pos > _chars.Length - value.Length)
143 {
144 Grow(value.Length);
145 }
146 value.CopyTo(_chars.Slice(_pos));
147 _pos += value.Length;
148 }
149
150 [MethodImpl(MethodImplOptions.AggressiveInlining)]
152 {
153 int pos = _pos;
154 if (pos > _chars.Length - length)
155 {
156 Grow(length);
157 }
158 _pos = pos + length;
159 return _chars.Slice(pos, length);
160 }
161
162 [MethodImpl(MethodImplOptions.NoInlining)]
163 private void GrowAndAppend(char c)
164 {
165 Grow(1);
166 Append(c);
167 }
168
169 [MethodImpl(MethodImplOptions.NoInlining)]
170 private void Grow(int additionalCapacityBeyondPos)
171 {
172 char[] array = ArrayPool<char>.Shared.Rent((int)Math.Max((uint)(_pos + additionalCapacityBeyondPos), (uint)(_chars.Length * 2)));
173 _chars.Slice(0, _pos).CopyTo(array);
174 char[] arrayToReturnToPool = _arrayToReturnToPool;
176 if (arrayToReturnToPool != null)
177 {
178 ArrayPool<char>.Shared.Return(arrayToReturnToPool);
179 }
180 }
181
182 [MethodImpl(MethodImplOptions.AggressiveInlining)]
183 public void Dispose()
184 {
185 char[] arrayToReturnToPool = _arrayToReturnToPool;
186 this = default(System.Text.ValueStringBuilder);
187 if (arrayToReturnToPool != null)
188 {
189 ArrayPool<char>.Shared.Return(arrayToReturnToPool);
190 }
191 }
192
193 [MethodImpl(MethodImplOptions.AggressiveInlining)]
194 public void Append(Rune rune)
195 {
196 int pos = _pos;
198 if ((uint)(pos + 1) < (uint)chars.Length && (uint)pos < (uint)chars.Length)
199 {
200 if (rune.Value <= 65535)
201 {
202 chars[pos] = (char)rune.Value;
203 _pos = pos + 1;
204 }
205 else
206 {
207 chars[pos] = (char)((long)rune.Value + 56557568L >> 10);
208 chars[pos + 1] = (char)(((ulong)rune.Value & 0x3FFuL) + 56320);
209 _pos = pos + 2;
210 }
211 }
212 else
213 {
214 GrowAndAppend(rune);
215 }
216 }
217
218 [MethodImpl(MethodImplOptions.NoInlining)]
219 private void GrowAndAppend(Rune rune)
220 {
221 Grow(2);
222 Append(rune);
223 }
224}
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)
unsafe void Append(char *value, int length)
Span< char > AppendSpan(int length)
ReadOnlySpan< char > AsSpan(int start, int length)
void Append(ReadOnlySpan< char > value)
void Grow(int additionalCapacityBeyondPos)
ReadOnlySpan< char > AsSpan(int start)
ValueStringBuilder(int initialCapacity)