84 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			84 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|   | // | |||
|  | // <20> 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; | |||
|  |         } | |||
|  | 
 | |||
|  |     } | |||
|  | } |