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