Пример #1
0
        /// <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);
        }
Пример #2
0
            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);
            }
Пример #3
0
 /// <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);
     }
 }
Пример #4
0
 public static void ReturnInstance(SaluteToHaruhikoTheOkami inst) => _instancePool[inst._lzssOption].Add(inst);