Skip to content

Commit

Permalink
CancellationToken support
Browse files Browse the repository at this point in the history
  • Loading branch information
soenneker committed Jul 4, 2024
1 parent 6c482a2 commit 8e37605
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 36 deletions.
8 changes: 7 additions & 1 deletion Soenneker.Utils.MemoryStream.sln.DotSettings
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=15b5b1f1_002D457c_002D4ca6_002Db278_002D5615aedc07d3/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static readonly fields (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="READONLY_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=236f7aa5_002D7b06_002D43ca_002Dbf2a_002D9b31bfcff09a/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Any" AccessRightKinds="Private" Description="Constant fields (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="CONSTANT_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=53eecf85_002Dd821_002D40e8_002Dac97_002Dfdb734542b84/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Instance" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Instance fields (not private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="FIELD" /&gt;&lt;Kind Name="READONLY_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=669e5282_002Dfb4b_002D4e90_002D91e7_002D07d269d04b60/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Any" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Constant fields (not private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="CONSTANT_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=70345118_002D4b40_002D4ece_002D937c_002Dbbeb7a0b2e70/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Static" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Static fields (not private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EPredefinedNamingRulesToUserRulesUpgrade/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Soenneker/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeEditing/SuppressUninitializedWarningFix/Enabled/@EntryValue">False</s:Boolean>
<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/MAX_ARRAY_INITIALIZER_ELEMENTS_ON_LINE/@EntryValue">0</s:Int64>
Expand Down
33 changes: 17 additions & 16 deletions src/Abstract/IMemoryStreamUtil.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Diagnostics.Contracts;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.IO;

Expand All @@ -12,57 +13,57 @@ namespace Soenneker.Utils.MemoryStream.Abstract;
public interface IMemoryStreamUtil
{
/// <summary>
/// Typically not going to be used externally, but available just in case.
/// Typically, not going to be used externally, but available just in case.
/// </summary>
/// <returns></returns>
[Pure]
ValueTask<RecyclableMemoryStreamManager> GetManager();
ValueTask<RecyclableMemoryStreamManager> GetManager(CancellationToken cancellationToken = default);

/// <inheritdoc cref="GetManager"/>
[Pure]
RecyclableMemoryStreamManager GetManagerSync();
RecyclableMemoryStreamManager GetManagerSync(CancellationToken cancellationToken = default);

/// <summary>
/// Retrieves a fresh MemoryStream from the <see cref="RecyclableMemoryStreamManager"/>
/// </summary>
/// <returns></returns>
[Pure]
ValueTask<System.IO.MemoryStream> Get();
ValueTask<System.IO.MemoryStream> Get(CancellationToken cancellationToken = default);

/// <summary>
/// Use async version <see cref="Get()"/> if possible. <para/>
/// <inheritdoc cref="Get()"/>
/// Use async version <see cref="Get(CancellationToken)"/> if possible. <para/>
/// <inheritdoc cref="Get(CancellationToken)"/>
/// </summary>
[Pure]
System.IO.MemoryStream GetSync();
System.IO.MemoryStream GetSync(CancellationToken cancellationToken = default);

[Pure]
ValueTask<System.IO.MemoryStream> Get(byte[] bytes);
ValueTask<System.IO.MemoryStream> Get(byte[] bytes, CancellationToken cancellationToken = default);

/// <summary>
/// Use async version <see cref="Get()"/> if possible. <para/>
/// <inheritdoc cref="Get()"/>
/// Use async version <see cref="Get(CancellationToken)"/> if possible. <para/>
/// <inheritdoc cref="Get(CancellationToken)"/>
/// </summary>
[Pure]
System.IO.MemoryStream GetSync(byte[] bytes);
System.IO.MemoryStream GetSync(byte[] bytes, CancellationToken cancellationToken = default);

/// <summary>
/// Converts to byte array (UTF8) and then converts into a MemoryStream
/// </summary>
[Pure]
ValueTask<System.IO.MemoryStream> Get(string str);
ValueTask<System.IO.MemoryStream> Get(string str, CancellationToken cancellationToken = default);

/// <summary>
/// Use async version <see cref="Get()"/> if possible. <para/>
/// <inheritdoc cref="Get()"/>
/// Use async version <see cref="Get(CancellationToken)"/> if possible. <para/>
/// <inheritdoc cref="Get(CancellationToken)"/>
/// </summary>
[Pure]
System.IO.MemoryStream GetSync(string str);
System.IO.MemoryStream GetSync(string str, CancellationToken cancellationToken = default);

/// <summary>
/// If it's a MemoryStream, simply calls ToArray()... if it's not it copies the stream into a MemoryStream and then converts into a byte array.
/// </summary>
/// <remarks>This will dispose of the incoming stream since it's assumed that usage of it is complete after moving to a byte array.</remarks>
[Pure]
ValueTask<byte[]> GetBytesFromStream(Stream stream);
ValueTask<byte[]> GetBytesFromStream(Stream stream, CancellationToken cancellationToken = default);
}
39 changes: 20 additions & 19 deletions src/MemoryStreamUtil.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.IO;
using Soenneker.Extensions.String;
Expand All @@ -19,53 +20,53 @@ public MemoryStreamUtil()
_manager = new AsyncSingleton<RecyclableMemoryStreamManager>(() => new RecyclableMemoryStreamManager());
}

public ValueTask<RecyclableMemoryStreamManager> GetManager()
public ValueTask<RecyclableMemoryStreamManager> GetManager(CancellationToken cancellationToken = default)
{
return _manager.Get();
return _manager.Get(cancellationToken);
}

public RecyclableMemoryStreamManager GetManagerSync()
public RecyclableMemoryStreamManager GetManagerSync(CancellationToken cancellationToken = default)
{
return _manager.GetSync();
return _manager.GetSync(cancellationToken);
}

public async ValueTask<System.IO.MemoryStream> Get()
public async ValueTask<System.IO.MemoryStream> Get(CancellationToken cancellationToken = default)
{
System.IO.MemoryStream stream = (await GetManager().NoSync()).GetStream();
System.IO.MemoryStream stream = (await GetManager(cancellationToken).NoSync()).GetStream();
return stream;
}

public System.IO.MemoryStream GetSync()
public System.IO.MemoryStream GetSync(CancellationToken cancellationToken = default)
{
System.IO.MemoryStream stream = GetManagerSync().GetStream();
System.IO.MemoryStream stream = GetManagerSync(cancellationToken).GetStream();
return stream;
}

public async ValueTask<System.IO.MemoryStream> Get(byte[] bytes)
public async ValueTask<System.IO.MemoryStream> Get(byte[] bytes, CancellationToken cancellationToken = default)
{
System.IO.MemoryStream stream = (await GetManager().NoSync()).GetStream(bytes);
System.IO.MemoryStream stream = (await GetManager(cancellationToken).NoSync()).GetStream(bytes);
return stream;
}

public System.IO.MemoryStream GetSync(byte[] bytes)
public System.IO.MemoryStream GetSync(byte[] bytes, CancellationToken cancellationToken = default)
{
System.IO.MemoryStream stream = GetManagerSync().GetStream(bytes);
System.IO.MemoryStream stream = GetManagerSync(cancellationToken).GetStream(bytes);
return stream;
}

public ValueTask<System.IO.MemoryStream> Get(string str)
public ValueTask<System.IO.MemoryStream> Get(string str, CancellationToken cancellationToken = default)
{
byte[] bytes = str.ToBytes();
return Get(bytes);
return Get(bytes, cancellationToken);
}

public System.IO.MemoryStream GetSync(string str)
public System.IO.MemoryStream GetSync(string str, CancellationToken cancellationToken = default)
{
byte[] bytes = str.ToBytes();
return GetSync(bytes);
return GetSync(bytes, cancellationToken);
}

public async ValueTask<byte[]> GetBytesFromStream(Stream stream)
public async ValueTask<byte[]> GetBytesFromStream(Stream stream, CancellationToken cancellationToken = default)
{
byte[] result;

Expand All @@ -76,8 +77,8 @@ public async ValueTask<byte[]> GetBytesFromStream(Stream stream)
return result;
}

System.IO.MemoryStream memoryStream = await Get().NoSync();
await stream.CopyToAsync(memoryStream).NoSync();
System.IO.MemoryStream memoryStream = await Get(cancellationToken).NoSync();
await stream.CopyToAsync(memoryStream, cancellationToken).NoSync();
result = memoryStream.ToArray();
await memoryStream.DisposeAsync().NoSync();

Expand Down

0 comments on commit 8e37605

Please sign in to comment.