From 26400f3476cf4f689e1bea4216c0e33078c69504 Mon Sep 17 00:00:00 2001 From: sveinungf Date: Sat, 8 Feb 2025 22:26:50 +0100 Subject: [PATCH 1/3] Use a pooled array to avoid code duplication for implementations of AddHeaderRow --- SpreadCheetah/Helpers/HeaderNameExtensions.cs | 11 ---------- SpreadCheetah/Spreadsheet.cs | 20 +++---------------- 2 files changed, 3 insertions(+), 28 deletions(-) diff --git a/SpreadCheetah/Helpers/HeaderNameExtensions.cs b/SpreadCheetah/Helpers/HeaderNameExtensions.cs index 72dcdf5..dd37707 100644 --- a/SpreadCheetah/Helpers/HeaderNameExtensions.cs +++ b/SpreadCheetah/Helpers/HeaderNameExtensions.cs @@ -14,15 +14,4 @@ public static void CopyToCells( cells[i] = new StyledCell(headerNames[i], styleId); } } - - public static void CopyToCells( - this IList headerNames, - StyledCell[] cells, - StyleId? styleId) - { - for (var i = 0; i < headerNames.Count; ++i) - { - cells[i] = new StyledCell(headerNames[i], styleId); - } - } } diff --git a/SpreadCheetah/Spreadsheet.cs b/SpreadCheetah/Spreadsheet.cs index e80cbb9..72a3664 100644 --- a/SpreadCheetah/Spreadsheet.cs +++ b/SpreadCheetah/Spreadsheet.cs @@ -351,7 +351,7 @@ public async ValueTask AddHeaderRowAsync(ReadOnlyMemory headerNames, Sty { if (headerNames.Length == 0) { - await AddRowAsync(ReadOnlyMemory.Empty, token).ConfigureAwait(false); + await AddRowAsync([], token).ConfigureAwait(false); return; } @@ -373,22 +373,8 @@ public async ValueTask AddHeaderRowAsync(ReadOnlyMemory headerNames, Sty public async ValueTask AddHeaderRowAsync(IList headerNames, StyleId? styleId = null, CancellationToken token = default) { ArgumentNullException.ThrowIfNull(headerNames); - if (headerNames.Count == 0) - { - await AddRowAsync(ReadOnlyMemory.Empty, token).ConfigureAwait(false); - return; - } - - var cells = ArrayPool.Shared.Rent(headerNames.Count); - try - { - headerNames.CopyToCells(cells, styleId); - await AddRowAsync(cells.AsMemory(0, headerNames.Count), token).ConfigureAwait(false); - } - finally - { - ArrayPool.Shared.Return(cells); - } + using var pooledArray = headerNames.ToPooledArray(); + await AddHeaderRowAsync(pooledArray.Memory, styleId, token).ConfigureAwait(false); } /// From 81e5fff07bc8f13a57b1692f8302c3e49aa1d266 Mon Sep 17 00:00:00 2001 From: sveinungf Date: Sat, 8 Feb 2025 22:29:59 +0100 Subject: [PATCH 2/3] Use collection expression for AddRowAsync --- SpreadCheetah.Test/Tests/SpreadsheetRowTests.cs | 4 ++-- SpreadCheetah/SourceGeneration/EmptyWorksheetRowContext.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/SpreadCheetah.Test/Tests/SpreadsheetRowTests.cs b/SpreadCheetah.Test/Tests/SpreadsheetRowTests.cs index 77f4e09..c85dc22 100644 --- a/SpreadCheetah.Test/Tests/SpreadsheetRowTests.cs +++ b/SpreadCheetah.Test/Tests/SpreadsheetRowTests.cs @@ -27,7 +27,7 @@ public async Task Spreadsheet_AddRow_ThrowsWhenNoWorksheet(bool hasWorksheet) await spreadsheet.StartWorksheetAsync("Sheet"); // Act - var exception = await Record.ExceptionAsync(async () => await spreadsheet.AddRowAsync(Array.Empty())); + var exception = await Record.ExceptionAsync(async () => await spreadsheet.AddRowAsync([])); // Assert Assert.NotEqual(hasWorksheet, exception is SpreadCheetahException); @@ -46,7 +46,7 @@ public async Task Spreadsheet_AddRow_ThrowsWhenAlreadyFinished(bool finished) await spreadsheet.FinishAsync(); // Act - var exception = await Record.ExceptionAsync(async () => await spreadsheet.AddRowAsync(Array.Empty())); + var exception = await Record.ExceptionAsync(async () => await spreadsheet.AddRowAsync([])); // Assert Assert.Equal(finished, exception != null); diff --git a/SpreadCheetah/SourceGeneration/EmptyWorksheetRowContext.cs b/SpreadCheetah/SourceGeneration/EmptyWorksheetRowContext.cs index 03d3e32..8c813e7 100644 --- a/SpreadCheetah/SourceGeneration/EmptyWorksheetRowContext.cs +++ b/SpreadCheetah/SourceGeneration/EmptyWorksheetRowContext.cs @@ -20,13 +20,13 @@ public static class EmptyWorksheetRowContext private static ValueTask AddHeaderRowAsync(Spreadsheet spreadsheet, StyleId? _, CancellationToken token) { - return spreadsheet.AddRowAsync(ReadOnlyMemory.Empty, token); + return spreadsheet.AddRowAsync([], token); } private static ValueTask AddAsRowAsync(Spreadsheet spreadsheet, T _, CancellationToken token) { ArgumentNullException.ThrowIfNull(spreadsheet); - return spreadsheet.AddRowAsync(ReadOnlyMemory.Empty, token); + return spreadsheet.AddRowAsync([], token); } private static ValueTask AddRangeAsRowsAsync(Spreadsheet spreadsheet, IEnumerable objs, CancellationToken token) @@ -40,7 +40,7 @@ private static async ValueTask AddRangeAsEmptyRowsAsync(Spreadsheet spreadshe { foreach (var _ in objs) { - await spreadsheet.AddRowAsync(ReadOnlyMemory.Empty, token).ConfigureAwait(false); + await spreadsheet.AddRowAsync([], token).ConfigureAwait(false); } } } From 476f634112041f94eefad78a6e2e519eac748726 Mon Sep 17 00:00:00 2001 From: sveinungf Date: Sat, 8 Feb 2025 22:31:45 +0100 Subject: [PATCH 3/3] Bump version --- SpreadCheetah/SpreadCheetah.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpreadCheetah/SpreadCheetah.csproj b/SpreadCheetah/SpreadCheetah.csproj index b3c3fea..4b0e29f 100644 --- a/SpreadCheetah/SpreadCheetah.csproj +++ b/SpreadCheetah/SpreadCheetah.csproj @@ -9,7 +9,7 @@ SpreadCheetah - 1.19.0 + 1.20.0 sveinungf SpreadCheetah is a high-performance .NET library for generating spreadsheet (Microsoft Excel XLSX) files. icon-package.png