Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 67ffcf8

Browse files
committed
Add MemoryProvider Stream Write overloads
1 parent b7a1c3c commit 67ffcf8

File tree

5 files changed

+77
-220
lines changed

5 files changed

+77
-220
lines changed

src/ServiceStack.Memory/NetCoreMemory.cs

Lines changed: 0 additions & 208 deletions
This file was deleted.

src/ServiceStack.Memory/ServiceStack.Memory.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,9 @@
88
<ItemGroup>
99
<ProjectReference Include="..\ServiceStack.Text\ServiceStack.Text.csproj" />
1010
</ItemGroup>
11+
<ItemGroup>
12+
<Compile Include="..\ServiceStack.Text\NetCoreMemory.cs">
13+
<Link>NetCoreMemory.cs</Link>
14+
</Compile>
15+
</ItemGroup>
1116
</Project>

src/ServiceStack.Text/DefaultMemory.cs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,8 +422,43 @@ public override Guid ParseGuid(ReadOnlySpan<char> value)
422422
return result;
423423
}
424424

425-
public override Task WriteAsync(Stream stream, ReadOnlySpan<char> value,
426-
CancellationToken token = default(CancellationToken))
425+
public override void Write(Stream stream, ReadOnlyMemory<char> value)
426+
{
427+
var bytes = BufferPool.GetBuffer(Encoding.UTF8.GetMaxByteCount(value.Length));
428+
try
429+
{
430+
var chars = value.ToArray();
431+
int bytesCount = Encoding.UTF8.GetBytes(chars, 0, chars.Length, bytes, 0);
432+
stream.Write(bytes, 0, bytesCount);
433+
}
434+
finally
435+
{
436+
BufferPool.ReleaseBufferToPool(ref bytes);
437+
}
438+
}
439+
440+
public override void Write(Stream stream, ReadOnlyMemory<byte> value)
441+
{
442+
if (MemoryMarshal.TryGetArray(value, out var segment) && segment.Array != null)
443+
{
444+
byte[] bytes = BufferPool.GetBuffer(segment.Count);
445+
try
446+
{
447+
stream.Write(segment.Array, 0, segment.Count);
448+
}
449+
finally
450+
{
451+
BufferPool.ReleaseBufferToPool(ref bytes);
452+
}
453+
}
454+
else
455+
{
456+
var bytes = value.ToArray();
457+
stream.Write(bytes, 0, value.Length);
458+
}
459+
}
460+
461+
public override Task WriteAsync(Stream stream, ReadOnlySpan<char> value, CancellationToken token = default)
427462
{
428463
byte[] bytes = BufferPool.GetBuffer(Encoding.UTF8.GetMaxByteCount(value.Length));
429464
try
@@ -438,6 +473,9 @@ public override Task WriteAsync(Stream stream, ReadOnlySpan<char> value,
438473
}
439474
}
440475

476+
public override Task WriteAsync(Stream stream, ReadOnlyMemory<char> value, CancellationToken token = default) =>
477+
WriteAsync(stream, value.Span, token);
478+
441479
public override Task WriteAsync(Stream stream, ReadOnlyMemory<byte> value, CancellationToken token = default)
442480
{
443481
byte[] bytes = BufferPool.GetBuffer(value.Length);

src/ServiceStack.Text/MemoryProvider.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,14 @@ public abstract class MemoryProvider
5050

5151
public abstract string ToBase64(ReadOnlyMemory<byte> value);
5252

53-
public abstract Task WriteAsync(Stream stream, ReadOnlySpan<char> value, CancellationToken token = default);
53+
public abstract void Write(Stream stream, ReadOnlyMemory<char> value);
54+
public abstract void Write(Stream stream, ReadOnlyMemory<byte> value);
55+
56+
public abstract Task WriteAsync(Stream stream, ReadOnlyMemory<char> value, CancellationToken token = default);
5457
public abstract Task WriteAsync(Stream stream, ReadOnlyMemory<byte> value, CancellationToken token = default);
5558

59+
public abstract Task WriteAsync(Stream stream, ReadOnlySpan<char> value, CancellationToken token = default);
60+
5661
public abstract object Deserialize(Stream stream, Type type, DeserializeStringSpanDelegate deserializer);
5762

5863
public abstract Task<object> DeserializeAsync(Stream stream, Type type,

src/ServiceStack.Text/NetCoreMemory.cs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,26 +95,43 @@ public override string ToBase64(ReadOnlyMemory<byte> value)
9595
return Convert.ToBase64String(value.Span);
9696
}
9797

98-
public override Task WriteAsync(Stream stream, ReadOnlySpan<char> value, CancellationToken token=default)
98+
public override void Write(Stream stream, ReadOnlyMemory<char> value)
9999
{
100-
using (var writer = new BinaryWriter(stream, Encoding.UTF8, leaveOpen:true))
101-
{
102-
writer.Write(value);
103-
}
100+
var utf8 = ToUtf8(value.Span);
101+
if (stream is MemoryStream ms)
102+
ms.Write(utf8.Span);
103+
else
104+
stream.Write(utf8.Span);
105+
}
106+
107+
public override void Write(Stream stream, ReadOnlyMemory<byte> value)
108+
{
109+
if (stream is MemoryStream ms)
110+
ms.Write(value.Span);
111+
else
112+
stream.Write(value.Span);
113+
}
114+
115+
public override Task WriteAsync(Stream stream, ReadOnlyMemory<char> value, CancellationToken token = default) =>
116+
WriteAsync(stream, value.Span, token);
104117

118+
public override Task WriteAsync(Stream stream, ReadOnlySpan<char> value, CancellationToken token=default)
119+
{
120+
var utf8 = ToUtf8(value);
121+
if (stream is MemoryStream ms)
122+
ms.Write(utf8.Span);
123+
else
124+
return Task.FromResult(stream.WriteAsync(utf8, token));
125+
105126
return TypeConstants.EmptyTask;
106127
}
107128

108129
public override async Task WriteAsync(Stream stream, ReadOnlyMemory<byte> value, CancellationToken token = default)
109130
{
110131
if (stream is MemoryStream ms)
111-
{
112132
ms.Write(value.Span);
113-
}
114133
else
115-
{
116134
await stream.WriteAsync(value, token);
117-
}
118135
}
119136

120137
public override object Deserialize(Stream stream, Type type, DeserializeStringSpanDelegate deserializer)

0 commit comments

Comments
 (0)