URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [zlib/] [contrib/] [dotzlib/] [DotZLib/] [CircularBuffer.cs] - Rev 745
Compare with Previous | Blame | View Log
////// Use, modification and distribution are subject to the Boost Software License, Version 1.0.// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//using System;using System.Diagnostics;namespace DotZLib{/// <summary>/// This class implements a circular buffer/// </summary>internal class CircularBuffer{#region Private dataprivate int _capacity;private int _head;private int _tail;private int _size;private byte[] _buffer;#endregionpublic CircularBuffer(int capacity){Debug.Assert( capacity > 0 );_buffer = new byte[capacity];_capacity = capacity;_head = 0;_tail = 0;_size = 0;}public int Size { get { return _size; } }public int Put(byte[] source, int offset, int count){Debug.Assert( count > 0 );int trueCount = Math.Min(count, _capacity - Size);for (int i = 0; i < trueCount; ++i)_buffer[(_tail+i) % _capacity] = source[offset+i];_tail += trueCount;_tail %= _capacity;_size += trueCount;return trueCount;}public bool Put(byte b){if (Size == _capacity) // no roomreturn false;_buffer[_tail++] = b;_tail %= _capacity;++_size;return true;}public int Get(byte[] destination, int offset, int count){int trueCount = Math.Min(count,Size);for (int i = 0; i < trueCount; ++i)destination[offset + i] = _buffer[(_head+i) % _capacity];_head += trueCount;_head %= _capacity;_size -= trueCount;return trueCount;}public int Get(){if (Size == 0)return -1;int result = (int)_buffer[_head++ % _capacity];--_size;return result;}}}
