diff --git a/MatFileHandler.Tests/MatFileWriterTests.cs b/MatFileHandler.Tests/MatFileWriterTests.cs index 94ee281..63905ed 100755 --- a/MatFileHandler.Tests/MatFileWriterTests.cs +++ b/MatFileHandler.Tests/MatFileWriterTests.cs @@ -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[] CreateComplexLimits(T[] limits) where T : struct { diff --git a/MatFileHandler/CompressionUsage.cs b/MatFileHandler/CompressionUsage.cs new file mode 100644 index 0000000..2d0fd93 --- /dev/null +++ b/MatFileHandler/CompressionUsage.cs @@ -0,0 +1,20 @@ +// Copyright 2017 Alexander Luzgarev + +namespace MatFileHandler +{ + /// + /// Describes compression usage strategy for writing files. + /// + public enum CompressionUsage + { + /// + /// Never use compression. + /// + Never, + + /// + /// Always use compression. + /// + Always, + } +} diff --git a/MatFileHandler/MatFileWriter.cs b/MatFileHandler/MatFileWriter.cs index 8d586c1..33fe176 100755 --- a/MatFileHandler/MatFileWriter.cs +++ b/MatFileHandler/MatFileWriter.cs @@ -15,13 +15,27 @@ namespace MatFileHandler /// public class MatFileWriter { + private readonly MatFileWriterOptions _options; + /// - /// Initializes a new instance of the class with a stream. + /// Initializes a new instance of the class with a stream and default options. /// /// Output stream. public MatFileWriter(Stream stream) { Stream = stream; + _options = MatFileWriterOptions.Default; + } + + /// + /// Initializes a new instance of the class with a stream. + /// + /// Output stream. + /// Options to use for file writing. + 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(); + } } } } diff --git a/MatFileHandler/MatFileWriterOptions.cs b/MatFileHandler/MatFileWriterOptions.cs new file mode 100644 index 0000000..ee35d81 --- /dev/null +++ b/MatFileHandler/MatFileWriterOptions.cs @@ -0,0 +1,23 @@ +// Copyright 2017 Alexander Luzgarev + +namespace MatFileHandler +{ + /// + /// Options for writing .mat files. + /// + public struct MatFileWriterOptions + { + /// + /// Gets default options. + /// + public static MatFileWriterOptions Default => new MatFileWriterOptions + { + UseCompression = CompressionUsage.Always, + }; + + /// + /// Gets or sets a value indicating whether to compress all variables when writing the file. + /// + public CompressionUsage UseCompression { get; set; } + } +} \ No newline at end of file