Counter Strike : Global Offensive Source Code
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//
// � Copyright Henrik Ravn 2004
//
// 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 data
private int _capacity; private int _head; private int _tail; private int _size; private byte[] _buffer; #endregion
public 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 room
return 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; }
} }
|