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