~ubuntu-branches/ubuntu/raring/smplayer/raring

« back to all changes in this revision

Viewing changes to zlib-1.2.6/contrib/dotzlib/DotZLib/CircularBuffer.cs

  • Committer: Package Import Robot
  • Author(s): Alessio Treglia
  • Date: 2013-02-12 03:00:21 UTC
  • mfrom: (20.1.2 experimental)
  • Revision ID: package-import@ubuntu.com-20130212030021-q5mg053fru2u6zl8
Tags: 0.8.3-1
* Team upload.
* New upstream release. (Closes: #698300)

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
 
8
 
using System;
9
 
using System.Diagnostics;
10
 
 
11
 
namespace 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
 
}