diff --git a/Xledger.Collections.Test/TestMemoryOwner.cs b/Xledger.Collections.Test/TestMemoryOwner.cs index 3ec256c..c3ea828 100644 --- a/Xledger.Collections.Test/TestMemoryOwner.cs +++ b/Xledger.Collections.Test/TestMemoryOwner.cs @@ -1,4 +1,6 @@ using System.Buffers; +using System.IO; +using System.Threading.Tasks; using Xledger.Collections.Memory; namespace Xledger.Collections.Test; @@ -20,4 +22,22 @@ public void TestSlice() { IMemoryOwner sliced2 = sliced.Slice(1, 4); Assert.Equal(array.AsMemory().Slice(3).Slice(1, 4), sliced2.Memory); } + +#if NET + [Fact] + public void TestStream_ToMemoryOwner() { + byte[] array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + var ms = new MemoryStream(array); + using var memoryOwner = ms.ToOwnedMemory(); + Assert.Equal(array.AsMemory(), memoryOwner.Memory); + } + + [Fact] + public async Task TestStream_ToMemoryOwnerAsync() { + byte[] array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + var ms = new MemoryStream(array); + using var memoryOwner = await ms.ToOwnedMemoryAsync(); + Assert.Equal(array.AsMemory(), memoryOwner.Memory); + } +#endif } diff --git a/Xledger.Collections.Test/Xledger.Collections.Test.csproj b/Xledger.Collections.Test/Xledger.Collections.Test.csproj index 649b7be..7ef5883 100644 --- a/Xledger.Collections.Test/Xledger.Collections.Test.csproj +++ b/Xledger.Collections.Test/Xledger.Collections.Test.csproj @@ -23,8 +23,8 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Xledger.Collections/Memory/Extensions.cs b/Xledger.Collections/Memory/Extensions.cs index 0c32be5..a196b4d 100644 --- a/Xledger.Collections/Memory/Extensions.cs +++ b/Xledger.Collections/Memory/Extensions.cs @@ -38,9 +38,7 @@ public static IMemoryOwner ToOwnedMemory(this Stream source, bool leaveOpe try { while (true) { - var dest = currentBuffer.Slice(totalBytesRead); - - int bytesRead = source.Read(dest.Span); + int bytesRead = source.Read(currentBuffer.Span); if (bytesRead == 0) { break; @@ -68,7 +66,7 @@ public static IMemoryOwner ToOwnedMemory(this Stream source, bool leaveOpe var newOwner = MemoryPool.Shared.Rent((int)newCapacity); var newBuffer = newOwner.Memory; - currentBuffer.Slice(0, totalBytesRead).CopyTo(newBuffer); + currentBuffer.CopyTo(newBuffer); currentOwner.Dispose(); currentOwner = newOwner; currentBuffer = newBuffer; @@ -82,7 +80,7 @@ public static IMemoryOwner ToOwnedMemory(this Stream source, bool leaveOpe } } - return currentOwner.Slice(totalBytesRead); + return currentOwner.Slice(0, totalBytesRead); } static readonly byte[] ASYNC_PROBE = new byte[1]; @@ -102,9 +100,7 @@ public static async Task> ToOwnedMemoryAsync(this Stream sour while (true) { tok.ThrowIfCancellationRequested(); - var dest = currentBuffer.Slice(totalBytesRead); - - int bytesRead = await source.ReadAsync(dest, tok).ConfigureAwait(false); + int bytesRead = await source.ReadAsync(currentBuffer, tok).ConfigureAwait(false); if (bytesRead == 0) { break; @@ -131,7 +127,7 @@ public static async Task> ToOwnedMemoryAsync(this Stream sour var newOwner = MemoryPool.Shared.Rent((int)newCapacity); var newBuffer = newOwner.Memory; - currentBuffer.Slice(0, totalBytesRead).CopyTo(newBuffer); + currentBuffer.CopyTo(newBuffer); currentOwner.Dispose(); currentOwner = newOwner; currentBuffer = newBuffer; @@ -145,7 +141,7 @@ public static async Task> ToOwnedMemoryAsync(this Stream sour } } - return currentOwner.Slice(totalBytesRead); + return currentOwner.Slice(0, totalBytesRead); } // Copied from System.IO.Stream, adapted to be static