Skip to content

Commit 9b78961

Browse files
TheTonttutig
authored andcommitted
StringExtensions.ToString(IEnumerable<Rune>) remove extra rune chars copy
1 parent 2e4e73a commit 9b78961

File tree

1 file changed

+4
-7
lines changed

1 file changed

+4
-7
lines changed

Terminal.Gui/Text/StringExtensions.cs

+4-7
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,8 @@ public static (Rune Rune, int Size) DecodeRune (this string str, int start = 0,
125125
public static string ToString (IEnumerable<Rune> runes)
126126
{
127127
const int maxCharsPerRune = 2;
128-
// Max stackalloc ~2 kB
129-
const int maxStackallocTextBufferSize = 1048;
128+
const int maxStackallocTextBufferSize = 1048; // ~2 kB
130129

131-
Span<char> runeBuffer = stackalloc char[maxCharsPerRune];
132130
// Use stackalloc buffer if rune count is easily available and the count is reasonable.
133131
if (runes.TryGetNonEnumeratedCount (out int count))
134132
{
@@ -144,10 +142,8 @@ public static string ToString (IEnumerable<Rune> runes)
144142
Span<char> remainingBuffer = textBuffer;
145143
foreach (Rune rune in runes)
146144
{
147-
int charsWritten = rune.EncodeToUtf16 (runeBuffer);
148-
ReadOnlySpan<char> runeChars = runeBuffer [..charsWritten];
149-
runeChars.CopyTo (remainingBuffer);
150-
remainingBuffer = remainingBuffer [runeChars.Length..];
145+
int charsWritten = rune.EncodeToUtf16 (remainingBuffer);
146+
remainingBuffer = remainingBuffer [charsWritten..];
151147
}
152148

153149
ReadOnlySpan<char> text = textBuffer[..^remainingBuffer.Length];
@@ -157,6 +153,7 @@ public static string ToString (IEnumerable<Rune> runes)
157153

158154
// Fallback to StringBuilder append.
159155
StringBuilder stringBuilder = new();
156+
Span<char> runeBuffer = stackalloc char[maxCharsPerRune];
160157
foreach (Rune rune in runes)
161158
{
162159
int charsWritten = rune.EncodeToUtf16 (runeBuffer);

0 commit comments

Comments
 (0)