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 }