Commit ec3d9481 authored by Jan Tattermusch's avatar Jan Tattermusch Committed by Jie Luo

add System.Memory dependency (#5835)

also add useful Span-based methods for ByteString
parent 68cd8e8b
...@@ -67,15 +67,6 @@ namespace Google.Protobuf ...@@ -67,15 +67,6 @@ namespace Google.Protobuf
{ {
return new ByteString(bytes); return new ByteString(bytes);
} }
/// <summary>
/// Provides direct, unrestricted access to the bytes contained in this instance.
/// You must not modify or resize the byte array returned by this method.
/// </summary>
internal static byte[] GetBuffer(ByteString bytes)
{
return bytes.bytes;
}
} }
/// <summary> /// <summary>
...@@ -119,6 +110,14 @@ namespace Google.Protobuf ...@@ -119,6 +110,14 @@ namespace Google.Protobuf
get { return Length == 0; } get { return Length == 0; }
} }
#if NETSTANDARD2_0
/// <summary>
/// Provides read-only access to the data of this <see cref="ByteString"/>.
/// No data is copied so this is the most efficient way of accessing.
/// </summary>
public ReadOnlySpan<byte> Span => new ReadOnlySpan<byte>(bytes);
#endif
/// <summary> /// <summary>
/// Converts this <see cref="ByteString"/> into a byte array. /// Converts this <see cref="ByteString"/> into a byte array.
/// </summary> /// </summary>
...@@ -161,7 +160,7 @@ namespace Google.Protobuf ...@@ -161,7 +160,7 @@ namespace Google.Protobuf
int capacity = stream.CanSeek ? checked((int) (stream.Length - stream.Position)) : 0; int capacity = stream.CanSeek ? checked((int) (stream.Length - stream.Position)) : 0;
var memoryStream = new MemoryStream(capacity); var memoryStream = new MemoryStream(capacity);
stream.CopyTo(memoryStream); stream.CopyTo(memoryStream);
#if NETSTANDARD1_0 #if NETSTANDARD1_0 || NETSTANDARD2_0
byte[] bytes = memoryStream.ToArray(); byte[] bytes = memoryStream.ToArray();
#else #else
// Avoid an extra copy if we can. // Avoid an extra copy if we can.
...@@ -187,7 +186,7 @@ namespace Google.Protobuf ...@@ -187,7 +186,7 @@ namespace Google.Protobuf
// We have to specify the buffer size here, as there's no overload accepting the cancellation token // We have to specify the buffer size here, as there's no overload accepting the cancellation token
// alone. But it's documented to use 81920 by default if not specified. // alone. But it's documented to use 81920 by default if not specified.
await stream.CopyToAsync(memoryStream, 81920, cancellationToken); await stream.CopyToAsync(memoryStream, 81920, cancellationToken);
#if NETSTANDARD1_0 #if NETSTANDARD1_0 || NETSTANDARD2_0
byte[] bytes = memoryStream.ToArray(); byte[] bytes = memoryStream.ToArray();
#else #else
// Avoid an extra copy if we can. // Avoid an extra copy if we can.
...@@ -219,6 +218,18 @@ namespace Google.Protobuf ...@@ -219,6 +218,18 @@ namespace Google.Protobuf
return new ByteString(portion); return new ByteString(portion);
} }
#if NETSTANDARD2_0
/// <summary>
/// Constructs a <see cref="ByteString" /> from a read only span. The contents
/// are copied, so further modifications to the span will not
/// be reflected in the returned <see cref="ByteString" />.
/// </summary>
public static ByteString CopyFrom(ReadOnlySpan<byte> bytes)
{
return new ByteString(bytes.ToArray());
}
#endif
/// <summary> /// <summary>
/// Creates a new <see cref="ByteString" /> by encoding the specified text with /// Creates a new <see cref="ByteString" /> by encoding the specified text with
/// the given encoding. /// the given encoding.
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<VersionPrefix>3.7.0</VersionPrefix> <VersionPrefix>3.7.0</VersionPrefix>
<LangVersion>6</LangVersion> <LangVersion>6</LangVersion>
<Authors>Google Inc.</Authors> <Authors>Google Inc.</Authors>
<TargetFrameworks>netstandard1.0;net45</TargetFrameworks> <TargetFrameworks>netstandard1.0;netstandard2.0;net45</TargetFrameworks>
<GenerateDocumentationFile>true</GenerateDocumentationFile> <GenerateDocumentationFile>true</GenerateDocumentationFile>
<AssemblyOriginatorKeyFile>../../keys/Google.Protobuf.snk</AssemblyOriginatorKeyFile> <AssemblyOriginatorKeyFile>../../keys/Google.Protobuf.snk</AssemblyOriginatorKeyFile>
<SignAssembly>true</SignAssembly> <SignAssembly>true</SignAssembly>
...@@ -28,9 +28,13 @@ ...@@ -28,9 +28,13 @@
- Visual Studio. - Visual Studio.
--> -->
<PropertyGroup Condition="'$(OS)' != 'Windows_NT'"> <PropertyGroup Condition="'$(OS)' != 'Windows_NT'">
<TargetFrameworks>netstandard1.0</TargetFrameworks> <TargetFrameworks>netstandard1.0;netstandard2.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
<PackageReference Include="System.Memory" Version="4.5.2" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta2-18618-05" PrivateAssets="All" /> <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta2-18618-05" PrivateAssets="All" />
</ItemGroup> </ItemGroup>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment