/// <summary> /// Initializes a new instance of the <see cref="LzssStream"/> class by using the specified stream and compression mode, and optionally leaves the stream open. /// </summary> /// <param name="stream">The stream to compress or decompress.</param> /// <param name="mode">One of the enumeration values that indicates whether to compress or decompress the stream.</param> /// <param name="leaveOpen"><c>true</c> to leave the stream open after disposing the DeflateStream object; otherwise, <c>false</c>.</param> /// <exception cref="ArgumentNullException"><paramref name="stream"/> is <c>null</c>.</exception> /// <exception cref="ArgumentException"> /// <paramref name="mode"/> is a valid <see cref="CompressionMode"/> value. /// <para>-or-</para> /// <see cref="CompressionMode"/> is <see cref="CompressionMode.Compress"/> and <see cref="CanWrite"/> is <c>false</c>. /// <para>-or-</para> /// <see cref="CompressionMode"/> is <see cref="CompressionMode.Decompress"/> and <see cref="CanRead"/> is <c>false</c>. /// </exception> public LzssStream(Stream stream, CompressionMode mode, bool leaveOpen) { if (CompressionMode.Compress != mode && CompressionMode.Decompress != mode) { throw new ArgumentException("mode is a valid CompressionMode value.", "mode"); } BaseStream = stream ?? throw new ArgumentNullException("stream"); _mode = mode; _leaveOpen = leaveOpen; switch (_mode) { case CompressionMode.Decompress: if (!BaseStream.CanRead) { throw new ArgumentException("mode is CompressionMode.Decompress and CanRead is false.", "steam"); } break; case CompressionMode.Compress: if (!BaseStream.CanWrite) { throw new ArgumentException("mode is CompressionMode.Compress and CanWrite is false.", "steam"); } break; } _LzssHelper = SaluteToHaruhikoTheOkami.RentInstance(this); }
public static SaluteToHaruhikoTheOkami RentInstance(LzssStream lzssStream) { var lOpion = new LzssOption(lzssStream); var bag = _instancePool.GetOrAdd(lOpion, new ConcurrentBag <SaluteToHaruhikoTheOkami>()); if (!bag.TryTake(out var inst)) { inst = new SaluteToHaruhikoTheOkami(lOpion); } return(inst); }
/// <summary> /// Dispose mode. /// </summary> /// <param name="disposing"></param> protected override void Dispose(bool disposing) { try { if (disposing) { if (_LzssHelper != null) { SaluteToHaruhikoTheOkami.ReturnInstance(_LzssHelper); } if (!_leaveOpen && BaseStream != null) { BaseStream.Dispose(); } } } finally { _LzssHelper = null; BaseStream = null; base.Dispose(disposing); } }
public static void ReturnInstance(SaluteToHaruhikoTheOkami inst) => _instancePool[inst._lzssOption].Add(inst);