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