using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Runtime.InteropServices; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.VisualStyles; using System.ComponentModel; using System.Drawing.Imaging; using System.Globalization; using static System.Net.Mime.MediaTypeNames; using System.Diagnostics; using System.Net.NetworkInformation; using System.Net; using System.Management; using System.IO.Ports; using System.IO; using System.Security.Cryptography; using System.Windows.Forms.Design; namespace UTIL { #region Циклический буфер public class CircularBuffer { T[] _buffer; Int32 _head; Int32 _tail; Int32 _length; Int32 _bufferSize; Int32 _pos; Object _lock = new object(); public CircularBuffer(Int32 bufferSize) { _buffer = new T[bufferSize]; _bufferSize = bufferSize; _head = bufferSize - 1; _tail = 0; _length = 0; } public Int32 Count { get { return _length; } } public Int32 Head { get { return _head; } } public Int32 Tail { get { return _tail; } } public bool IsEmpty { get { return _length == 0; } } public bool IsFull { get { return _length == _bufferSize; } } public bool IsNoData { get { return _tail + _pos >= _head; } } public T Dequeue() { if (IsEmpty) throw new InvalidOperationException("Queue exhausted"); T dequeued = _buffer[_tail]; _tail = NextPosition(_tail); _length--; return dequeued; } public T Peek(int pos) { _pos = pos; if (IsEmpty) throw new InvalidOperationException("Queue exhausted"); if (_tail + pos > _head) throw new InvalidOperationException("End data"); T dequeued = _buffer[_tail + pos]; return dequeued; } public T Peek() { if (IsEmpty) throw new InvalidOperationException("Queue exhausted"); if (_tail > _head) throw new InvalidOperationException("End data"); T dequeued = _buffer[_tail]; return dequeued; } private int NextPosition(int position) { return (position + 1) % _bufferSize; } public void Enqueue(T toAdd) { _head = NextPosition(_head); _buffer[_head] = toAdd; if (IsFull) _tail = NextPosition(_tail); else _length++; } } public class CircularBuffer2 { T[] _buffer; Int32 _head; Int32 _tail; Int32 _length; Int32 _bufferSize; Int32 _pos; Object _lock = new object(); public CircularBuffer2(Int32 bufferSize) { _buffer = new T[bufferSize]; _bufferSize = bufferSize; _head = bufferSize - 1; _tail = 0; _length = 0; } public T Dequeue() { T dequeued = _buffer[_tail]; _tail = (_tail + 1) % _bufferSize; _length--; return dequeued; } public T Peek() { if (_length == 0) throw new InvalidOperationException("No data"); return _buffer[_tail]; } private int NextPosition(int position) { return (position + 1) % _bufferSize; } public void Enqueue(T toAdd) { _head = (_head + 1) % _bufferSize; _buffer[_head] = toAdd; if (_length == _bufferSize) _tail = (_tail + 1) % _bufferSize; else _length++; } } #endregion }