PageRenderTime 47ms CodeModel.GetById 31ms app.highlight 11ms RepoModel.GetById 1ms app.codeStats 1ms

/StormLib/stormlib/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs

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