using System.Collections.Generic; using Rokojori.Extensions; namespace Rokojori; public class RingBuffer { protected readonly T[] _buffer; protected int _head; protected int _count; public RingBuffer( int capacity ) { _buffer = new T[capacity]; } public int count => _count; public int capacity => _buffer.Length; public void ForEach( System.Action callback ) { for ( int i = 0; i < _count; i++ ) { callback( this[ i ] ); } } public int CountItems( System.Predicate predicate ) { var num = 0; for ( int i = 0; i < _count; i++ ) { if ( predicate( this[ i ] ) ) { num ++; } } return num; } public void Add( T item ) { int index = (_head + _count) % capacity; _buffer[index] = item; if (_count == capacity) { _head = (_head + 1) % capacity; } else { _count ++; } } public T this[int index] { get { if ( (uint)index >= (uint)_count ) { throw new System.ArgumentOutOfRangeException( nameof( index ) ); } return _buffer[ ( _head + index ) % capacity ]; } } }