annotate src/zlib-1.2.7/contrib/dotzlib/DotZLib/CircularBuffer.cs @ 169:223a55898ab9 tip default

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