Skip to content

Commit bae5d34

Browse files
committed
Merge branch 'master' of https://github.com/oleg-st/ZstdSharp
2 parents 9294851 + 9ab3b90 commit bae5d34

File tree

3 files changed

+59
-8
lines changed

3 files changed

+59
-8
lines changed

src/ZstdSharp.Test/ZstdNetSteamingTests.cs

+27
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,33 @@ public void RoundTrip_StreamingToStreaming_Stress([CombinatorialValues(true, fal
425425
});
426426
}
427427

428+
[Fact]
429+
public void RoundTrip_WrapperStreams()
430+
{
431+
using var compressor = new Compressor();
432+
using var decompressor = new Decompressor();
433+
434+
using var dataStream = DataGenerator.GetLargeStream(DataFill.Sequential);
435+
436+
using var tempStream = new MemoryStream();
437+
using (var compressionStream = new CompressionStream(tempStream, compressor))
438+
dataStream.CopyTo(compressionStream);
439+
440+
var data = DataGenerator.GetLargeBuffer(DataFill.Sequential);
441+
var compressed = compressor.Wrap(data).ToArray();
442+
443+
using var resultStream = new MemoryStream();
444+
using (var decompressionStream = new DecompressionStream(new MemoryStream(compressed), decompressor))
445+
decompressionStream.CopyTo(resultStream);
446+
447+
Assert.True(data.SequenceEqual(resultStream.ToArray()));
448+
449+
var resultBuffer = new byte[dataStream.Length];
450+
Assert.Equal(dataStream.Length, decompressor.Unwrap(tempStream.ToArray(), resultBuffer, 0));
451+
452+
Assert.True(dataStream.ToArray().SequenceEqual(resultBuffer));
453+
}
454+
428455
private static byte[] TrainDict()
429456
{
430457
var trainingData = new byte[100][];

src/ZstdSharp/CompressionStream.cs

+17-5
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,18 @@ public class CompressionStream : Stream
1111
{
1212
private readonly Stream innerStream;
1313
private readonly byte[] outputBuffer;
14+
private readonly bool preserveCompressor;
1415
private Compressor compressor;
1516
private ZSTD_outBuffer_s output;
1617

1718
public CompressionStream(Stream stream, int level = Compressor.DefaultCompressionLevel,
1819
int bufferSize = 0)
20+
: this(stream, new Compressor(level), bufferSize)
21+
{
22+
preserveCompressor = false;
23+
}
24+
25+
public CompressionStream(Stream stream, Compressor compressor, int bufferSize = 0)
1926
{
2027
if (stream == null)
2128
throw new ArgumentNullException(nameof(stream));
@@ -27,7 +34,8 @@ public CompressionStream(Stream stream, int level = Compressor.DefaultCompressio
2734
throw new ArgumentOutOfRangeException(nameof(bufferSize));
2835

2936
innerStream = stream;
30-
compressor = new Compressor(level);
37+
this.compressor = compressor;
38+
preserveCompressor = true;
3139

3240
var outputBufferSize =
3341
bufferSize > 0 ? bufferSize : (int) Methods.ZSTD_CStreamOutSize().EnsureZstdSuccess();
@@ -93,12 +101,16 @@ protected override void Dispose(bool disposing)
93101

94102
private void ReleaseUnmanagedResources()
95103
{
96-
compressor.Dispose();
97-
compressor = null;
104+
if (!preserveCompressor)
105+
{
106+
compressor.Dispose();
107+
compressor = null;
108+
}
109+
98110
ArrayPool<byte>.Shared.Return(outputBuffer);
99111
}
100112

101-
public override void Flush()
113+
public override void Flush()
102114
=> WriteInternal(null, true);
103115

104116
public override async Task FlushAsync(CancellationToken cancellationToken)
@@ -164,7 +176,7 @@ public async ValueTask WriteAsync(ReadOnlyMemory<byte> buffer,
164176
CancellationToken cancellationToken = default)
165177
=> await WriteInternalAsync(buffer, false, cancellationToken).ConfigureAwait(false);
166178
#endif
167-
179+
168180
internal unsafe nuint CompressStream(ref ZSTD_inBuffer_s input, ReadOnlySpan<byte> inputBuffer,
169181
ZSTD_EndDirective directive)
170182
{

src/ZstdSharp/DecompressionStream.cs

+15-3
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,18 @@ public class DecompressionStream : Stream
1212
private readonly Stream innerStream;
1313
private readonly byte[] inputBuffer;
1414
private readonly int inputBufferSize;
15+
private readonly bool preserveDecompressor;
1516
private Decompressor decompressor;
1617
private ZSTD_inBuffer_s input;
1718
private nuint lastDecompressResult = 0;
1819

1920
public DecompressionStream(Stream stream, int bufferSize = 0)
21+
: this(stream, new Decompressor(), bufferSize)
22+
{
23+
preserveDecompressor = false;
24+
}
25+
26+
public DecompressionStream(Stream stream, Decompressor decompressor, int bufferSize = 0)
2027
{
2128
if (stream == null)
2229
throw new ArgumentNullException(nameof(stream));
@@ -28,7 +35,8 @@ public DecompressionStream(Stream stream, int bufferSize = 0)
2835
throw new ArgumentOutOfRangeException(nameof(bufferSize));
2936

3037
innerStream = stream;
31-
decompressor = new Decompressor();
38+
this.decompressor = decompressor;
39+
preserveDecompressor = true;
3240

3341
inputBufferSize = bufferSize > 0 ? bufferSize : (int) Methods.ZSTD_CStreamInSize().EnsureZstdSuccess();
3442
inputBuffer = ArrayPool<byte>.Shared.Rent(inputBufferSize);
@@ -60,8 +68,12 @@ protected override void Dispose(bool disposing)
6068
if (decompressor == null)
6169
return;
6270

63-
decompressor.Dispose();
64-
decompressor = null;
71+
if (!preserveDecompressor)
72+
{
73+
decompressor.Dispose();
74+
decompressor = null;
75+
}
76+
6577
ArrayPool<byte>.Shared.Return(inputBuffer);
6678
}
6779

0 commit comments

Comments
 (0)