10Sduke// 212714Sdholmes// � Copyright Henrik Ravn 2004 30Sduke// 40Sduke// Use, modification and distribution are subject to the Boost Software License, Version 1.0. 50Sduke// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 60Sduke// 70Sduke 80Sdukeusing System; 90Sdukeusing System.Diagnostics; 100Sduke 110Sdukenamespace DotZLib 120Sduke{ 130Sduke 140Sduke /// <summary> 150Sduke /// This class implements a circular buffer 160Sduke /// </summary> 170Sduke internal class CircularBuffer 180Sduke { 191472Strims #region Private data 201472Strims private int _capacity; 211472Strims private int _head; 220Sduke private int _tail; 230Sduke private int _size; 240Sduke private byte[] _buffer; 251879Sstefank #endregion 261879Sstefank 271879Sstefank public CircularBuffer(int capacity) 285965Sgoetz { 292208Stonyp Debug.Assert( capacity > 0 ); 301879Sstefank _buffer = new byte[capacity]; 311410Sjcoomes _capacity = capacity; 321410Sjcoomes _head = 0; 331410Sjcoomes _tail = 0; 343536Skvn _size = 0; 353536Skvn } 363536Skvn 373536Skvn public int Size { get { return _size; } } 383536Skvn 399056Sdavid public int Put(byte[] source, int offset, int count) 403536Skvn { 413536Skvn Debug.Assert( count > 0 ); 423536Skvn int trueCount = Math.Min(count, _capacity - Size); 433536Skvn for (int i = 0; i < trueCount; ++i) 443536Skvn _buffer[(_tail+i) % _capacity] = source[offset+i]; 453536Skvn _tail += trueCount; 466412Sdrchase _tail %= _capacity; 473536Skvn _size += trueCount; 483536Skvn return trueCount; 4911200Siignatyev } 5011200Siignatyev 513536Skvn public bool Put(byte b) 529056Sdavid { 533536Skvn if (Size == _capacity) // no room 543064Snever return false; 559056Sdavid _buffer[_tail++] = b; 5611200Siignatyev _tail %= _capacity; 5711200Siignatyev ++_size; 586412Sdrchase return true; 596412Sdrchase } 606412Sdrchase 611410Sjcoomes public int Get(byte[] destination, int offset, int count) 623064Snever { 633064Snever int trueCount = Math.Min(count,Size); 643064Snever for (int i = 0; i < trueCount; ++i) 653064Snever destination[offset + i] = _buffer[(_head+i) % _capacity]; 661410Sjcoomes _head += trueCount; 673536Skvn _head %= _capacity; 681410Sjcoomes _size -= trueCount; 693064Snever return trueCount; 703064Snever } 711410Sjcoomes 721410Sjcoomes public int Get() 731410Sjcoomes { 743536Skvn if (Size == 0) 751410Sjcoomes return -1; 761410Sjcoomes 772208Stonyp int result = (int)_buffer[_head++ % _capacity]; 781410Sjcoomes --_size; 791410Sjcoomes return result; 801410Sjcoomes } 812037Stonyp 8211200Siignatyev } 8311200Siignatyev} 8411200Siignatyev