source: s10k/CommonLibs/zlib-1.2.8/contrib/dotzlib/DotZLib/CircularBuffer.cs @ 1096

Last change on this file since 1096 was 1096, checked in by s10k, 22 months ago

Added zlib, quazip, basicxmlsyntaxhighlighter, conditionalsemaphore and linenumberdisplay libraries. zlib and quazip are pre-compiled, but you can compile them yourself, just delete the dll files (or equivalent binary files to your OS)

File size: 2.2 KB
Line 
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}
Note: See TracBrowser for help on using the repository browser.