1 1.1 christos // 2 1.1 christos // Copyright Henrik Ravn 2004 3 1.1 christos // 4 1.1.1.2 christos // Use, modification and distribution are subject to the Boost Software License, Version 1.0. 5 1.1 christos // (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 1.1 christos // 7 1.1 christos 8 1.1 christos using System; 9 1.1 christos using System.Diagnostics; 10 1.1 christos 11 1.1 christos namespace DotZLib 12 1.1 christos { 13 1.1 christos 14 1.1 christos /// <summary> 15 1.1 christos /// This class implements a circular buffer 16 1.1 christos /// </summary> 17 1.1 christos internal class CircularBuffer 18 1.1 christos { 19 1.1 christos #region Private data 20 1.1 christos private int _capacity; 21 1.1 christos private int _head; 22 1.1 christos private int _tail; 23 1.1 christos private int _size; 24 1.1 christos private byte[] _buffer; 25 1.1 christos #endregion 26 1.1 christos 27 1.1 christos public CircularBuffer(int capacity) 28 1.1.1.2 christos { 29 1.1 christos Debug.Assert( capacity > 0 ); 30 1.1 christos _buffer = new byte[capacity]; 31 1.1 christos _capacity = capacity; 32 1.1 christos _head = 0; 33 1.1 christos _tail = 0; 34 1.1 christos _size = 0; 35 1.1 christos } 36 1.1 christos 37 1.1 christos public int Size { get { return _size; } } 38 1.1 christos 39 1.1 christos public int Put(byte[] source, int offset, int count) 40 1.1 christos { 41 1.1 christos Debug.Assert( count > 0 ); 42 1.1 christos int trueCount = Math.Min(count, _capacity - Size); 43 1.1 christos for (int i = 0; i < trueCount; ++i) 44 1.1 christos _buffer[(_tail+i) % _capacity] = source[offset+i]; 45 1.1 christos _tail += trueCount; 46 1.1 christos _tail %= _capacity; 47 1.1 christos _size += trueCount; 48 1.1 christos return trueCount; 49 1.1 christos } 50 1.1 christos 51 1.1 christos public bool Put(byte b) 52 1.1 christos { 53 1.1 christos if (Size == _capacity) // no room 54 1.1 christos return false; 55 1.1 christos _buffer[_tail++] = b; 56 1.1 christos _tail %= _capacity; 57 1.1 christos ++_size; 58 1.1 christos return true; 59 1.1 christos } 60 1.1 christos 61 1.1 christos public int Get(byte[] destination, int offset, int count) 62 1.1 christos { 63 1.1 christos int trueCount = Math.Min(count,Size); 64 1.1 christos for (int i = 0; i < trueCount; ++i) 65 1.1 christos destination[offset + i] = _buffer[(_head+i) % _capacity]; 66 1.1 christos _head += trueCount; 67 1.1 christos _head %= _capacity; 68 1.1 christos _size -= trueCount; 69 1.1 christos return trueCount; 70 1.1 christos } 71 1.1 christos 72 1.1 christos public int Get() 73 1.1 christos { 74 1.1 christos if (Size == 0) 75 1.1 christos return -1; 76 1.1 christos 77 1.1 christos int result = (int)_buffer[_head++ % _capacity]; 78 1.1 christos --_size; 79 1.1 christos return result; 80 1.1 christos } 81 1.1 christos 82 1.1 christos } 83 1.1 christos } 84