File: DataLoadSave\Binary\CompressionKind.cs
Web Access
Project: src\src\Microsoft.ML.Data\Microsoft.ML.Data.csproj (Microsoft.ML.Data)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.IO;
using System.IO.Compression;
using Microsoft.ML.Internal.Utilities;
using Microsoft.ML.Runtime;
 
namespace Microsoft.ML.Data.IO
{
    /// <summary>
    /// A code indicating the kind of compression. It is supposed that each kind of compression is totally
    /// sufficient to describe how a given stream should be decompressed.
    /// </summary>
    internal enum CompressionKind : byte
    {
        None = 0,    // No compression at all.
        Deflate = 1, // DEFLATE algorithm as in zlib's headerless/tailless compression.
        Default = Deflate
    }
 
    internal static class CompressionCodecExtension
    {
        /// <summary>
        /// Generate an appropriate wrapping compressing stream for the codec. This
        /// stream will be closable and disposable, without closing or disposing of
        /// the passed in stream. The scheme for compression is not in any way
        /// parameterizable.
        /// </summary>
        /// <param name="compression">The compression codec</param>
        /// <param name="stream">The stream to which compressed data will be written</param>
        /// <returns>A stream to which the user can write uncompressed data</returns>
        public static Stream CompressStream(this CompressionKind compression, Stream stream)
        {
            switch (compression)
            {
                case CompressionKind.None:
                    return new SubsetStream(stream);
                case CompressionKind.Deflate:
                    return new DeflateStream(stream, CompressionMode.Compress, true);
                default:
                    throw Contracts.Except("unrecognized compression codec {0}", compression);
            }
        }
 
        /// <summary>
        /// Generate an appropriate wrapping decompressing stream for the codec.
        /// </summary>
        /// <param name="compression">The compression codec</param>
        /// <param name="stream">The stream from which compressed data will be written</param>
        /// <returns>A stream from which the user can read uncompressed data</returns>
        public static Stream DecompressStream(this CompressionKind compression, Stream stream)
        {
            switch (compression)
            {
                case CompressionKind.None:
                    return new SubsetStream(stream);
                case CompressionKind.Deflate:
                    return new DeflateStream(stream, CompressionMode.Decompress, true);
                default:
                    throw Contracts.Except("unrecognized compression codec {0}", compression);
            }
        }
    }
}