annotate src/zlib-1.2.8/contrib/dotzlib/DotZLib/CircularBuffer.cs @ 56:af97cad61ff0

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