using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace LLama.Common { /// /// A queue with fixed storage size. /// Currently it's only a naive implementation and needs to be further optimized in the future. /// public class FixedSizeQueue: IEnumerable { int _maxSize; List _storage; public int Count => _storage.Count; public int Capacity => _maxSize; public FixedSizeQueue(int size) { _maxSize = size; _storage = new(); } /// /// Fill the quene with the data. Please ensure that data.Count <= size /// /// /// public FixedSizeQueue(int size, IEnumerable data) { #if NETCOREAPP3_0_OR_GREATER // Try an early check on the amount of data supplied (if possible) #if NETSTANDARD2_0 var dataCount = data.Count(); if (data.Count() > size) throw new ArgumentException($"The max size set for the quene is {size}, but got {dataCount} initial values."); #else if (data.TryGetNonEnumeratedCount(out var count) && count > size) throw new ArgumentException($"The max size set for the quene is {size}, but got {count} initial values."); #endif // Size of "data" is unknown, copy it all into a list _maxSize = size; _storage = new List(data); // Now check if that list is a valid size if (_storage.Count > _maxSize) #if NETSTANDARD2_0 throw new ArgumentException($"The max size set for the quene is {size}, but got {dataCount} initial values."); #else throw new ArgumentException($"The max size set for the quene is {size}, but got {count} initial values."); #endif } / /// /// Replace every item in the queue with the given value /// /// The value to replace all items with /// returns this public FixedSizeQueue FillWith(T value) { for(int i = 0; i < Count; i++) { _storage[i] = value; } return this; } /// /// Enquene an element. /// /// public void Enqueue(T item) { _storage.Add(item); if(_storage.Count >= _maxSize) { _storage.RemoveAt(0); } } public T[] ToArray() { return _storage.ToArray(); } public IEnumerator GetEnumerator() { return _storage.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } }