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();
}
}
}