From 9b78961a037d239cdf64197a7da31a65ab381a7a Mon Sep 17 00:00:00 2001 From: Tonttu <15074459+TheTonttu@users.noreply.github.com> Date: Sun, 16 Mar 2025 00:37:59 +0200 Subject: [PATCH] StringExtensions.ToString(IEnumerable) remove extra rune chars copy --- Terminal.Gui/Text/StringExtensions.cs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Terminal.Gui/Text/StringExtensions.cs b/Terminal.Gui/Text/StringExtensions.cs index a40143af8..3167bcf30 100644 --- a/Terminal.Gui/Text/StringExtensions.cs +++ b/Terminal.Gui/Text/StringExtensions.cs @@ -125,10 +125,8 @@ public static class StringExtensions public static string ToString (IEnumerable runes) { const int maxCharsPerRune = 2; - // Max stackalloc ~2 kB - const int maxStackallocTextBufferSize = 1048; + const int maxStackallocTextBufferSize = 1048; // ~2 kB - Span runeBuffer = stackalloc char[maxCharsPerRune]; // Use stackalloc buffer if rune count is easily available and the count is reasonable. if (runes.TryGetNonEnumeratedCount (out int count)) { @@ -144,10 +142,8 @@ public static class StringExtensions Span remainingBuffer = textBuffer; foreach (Rune rune in runes) { - int charsWritten = rune.EncodeToUtf16 (runeBuffer); - ReadOnlySpan runeChars = runeBuffer [..charsWritten]; - runeChars.CopyTo (remainingBuffer); - remainingBuffer = remainingBuffer [runeChars.Length..]; + int charsWritten = rune.EncodeToUtf16 (remainingBuffer); + remainingBuffer = remainingBuffer [charsWritten..]; } ReadOnlySpan text = textBuffer[..^remainingBuffer.Length]; @@ -157,6 +153,7 @@ public static class StringExtensions // Fallback to StringBuilder append. StringBuilder stringBuilder = new(); + Span runeBuffer = stackalloc char[maxCharsPerRune]; foreach (Rune rune in runes) { int charsWritten = rune.EncodeToUtf16 (runeBuffer);