using System.Text;
using BenchmarkDotNet.Attributes;
using Tui = Terminal.Gui;
namespace Terminal.Gui.Benchmarks.Text.TextFormatter;
///
/// Benchmarks for performance fine-tuning.
///
[MemoryDiagnoser]
[BenchmarkCategory (nameof (Tui.TextFormatter))]
public class StripCRLF
{
///
/// Benchmark for previous implementation.
///
///
///
///
[Benchmark]
[ArgumentsSource (nameof (DataSource))]
public string Previous (string str, bool keepNewLine)
{
return RuneListToString (str, keepNewLine);
}
///
/// Benchmark for current implementation with StringBuilder and char span index of search.
///
[Benchmark (Baseline = true)]
[ArgumentsSource (nameof (DataSource))]
public string Current (string str, bool keepNewLine)
{
return Tui.TextFormatter.StripCRLF (str, keepNewLine);
}
///
/// Previous implementation with intermediate rune list.
///
private static string RuneListToString (string str, bool keepNewLine = false)
{
List runes = str.ToRuneList ();
for (var i = 0; i < runes.Count; i++)
{
switch ((char)runes [i].Value)
{
case '\n':
if (!keepNewLine)
{
runes.RemoveAt (i);
}
break;
case '\r':
if (i + 1 < runes.Count && runes [i + 1].Value == '\n')
{
runes.RemoveAt (i);
if (!keepNewLine)
{
runes.RemoveAt (i);
}
i++;
}
else
{
if (!keepNewLine)
{
runes.RemoveAt (i);
}
}
break;
}
}
return StringExtensions.ToString (runes);
}
public IEnumerable