Add options to control compression when writing

This commit is contained in:
Alexander Luzgarev 2018-09-20 18:32:08 +02:00
parent 37f488919b
commit 5116f06c08
4 changed files with 90 additions and 5 deletions

View File

@ -376,13 +376,17 @@ namespace MatFileHandler.Tests
}
}
private void MatCompareWithTestData(string factoryName, string testName, IMatFile actual)
private void CompareTestDataWithWritingOptions(
IMatFile expected,
IMatFile actual,
MatFileWriterOptions? maybeOptions)
{
var expected = GetMatTestData(factoryName)[testName];
byte[] buffer;
using (var stream = new MemoryStream())
{
var writer = new MatFileWriter(stream);
var writer = maybeOptions is MatFileWriterOptions options
? new MatFileWriter(stream, options)
: new MatFileWriter(stream);
writer.Write(actual);
buffer = stream.ToArray();
}
@ -394,6 +398,20 @@ namespace MatFileHandler.Tests
}
}
private void MatCompareWithTestData(string factoryName, string testName, IMatFile actual)
{
var expected = GetMatTestData(factoryName)[testName];
CompareTestDataWithWritingOptions(expected, actual, null);
CompareTestDataWithWritingOptions(
expected,
actual,
new MatFileWriterOptions { UseCompression = CompressionUsage.Always });
CompareTestDataWithWritingOptions(
expected,
actual,
new MatFileWriterOptions { UseCompression = CompressionUsage.Never });
}
private ComplexOf<T>[] CreateComplexLimits<T>(T[] limits)
where T : struct
{

View File

@ -0,0 +1,20 @@
// Copyright 2017 Alexander Luzgarev
namespace MatFileHandler
{
/// <summary>
/// Describes compression usage strategy for writing files.
/// </summary>
public enum CompressionUsage
{
/// <summary>
/// Never use compression.
/// </summary>
Never,
/// <summary>
/// Always use compression.
/// </summary>
Always,
}
}

View File

@ -15,13 +15,27 @@ namespace MatFileHandler
/// </summary>
public class MatFileWriter
{
private readonly MatFileWriterOptions _options;
/// <summary>
/// Initializes a new instance of the <see cref="MatFileWriter"/> class with a stream.
/// Initializes a new instance of the <see cref="MatFileWriter"/> class with a stream and default options.
/// </summary>
/// <param name="stream">Output stream.</param>
public MatFileWriter(Stream stream)
{
Stream = stream;
_options = MatFileWriterOptions.Default;
}
/// <summary>
/// Initializes a new instance of the <see cref="MatFileWriter"/> class with a stream.
/// </summary>
/// <param name="stream">Output stream.</param>
/// <param name="options">Options to use for file writing.</param>
public MatFileWriter(Stream stream, MatFileWriterOptions options)
{
Stream = stream;
_options = options;
}
private Stream Stream { get; }
@ -38,7 +52,17 @@ namespace MatFileHandler
WriteHeader(writer, header);
foreach (var variable in file.Variables)
{
WriteCompressedVariable(writer, variable);
switch (_options.UseCompression)
{
case CompressionUsage.Always:
WriteCompressedVariable(writer, variable);
break;
case CompressionUsage.Never:
WriteVariable(writer, variable);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
}

View File

@ -0,0 +1,23 @@
// Copyright 2017 Alexander Luzgarev
namespace MatFileHandler
{
/// <summary>
/// Options for writing .mat files.
/// </summary>
public struct MatFileWriterOptions
{
/// <summary>
/// Gets default options.
/// </summary>
public static MatFileWriterOptions Default => new MatFileWriterOptions
{
UseCompression = CompressionUsage.Always,
};
/// <summary>
/// Gets or sets a value indicating whether to compress all variables when writing the file.
/// </summary>
public CompressionUsage UseCompression { get; set; }
}
}