Cleaned up multiple enumeration in FixedSizeQueue
This commit is contained in:
parent
18b1df6762
commit
bd3d8d3dc4
|
@ -2,7 +2,6 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace LLama.Common
|
||||
{
|
||||
|
@ -10,13 +9,15 @@ 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.
|
||||
/// </summary>
|
||||
public class FixedSizeQueue<T>: IEnumerable<T>
|
||||
public class FixedSizeQueue<T>
|
||||
: IEnumerable<T>
|
||||
{
|
||||
int _maxSize;
|
||||
List<T> _storage;
|
||||
private readonly int _maxSize;
|
||||
private readonly List<T> _storage;
|
||||
|
||||
public int Count => _storage.Count;
|
||||
public int Capacity => _maxSize;
|
||||
|
||||
public FixedSizeQueue(int size)
|
||||
{
|
||||
_maxSize = size;
|
||||
|
@ -30,26 +31,20 @@ namespace LLama.Common
|
|||
/// <param name="data"></param>
|
||||
public FixedSizeQueue(int size, IEnumerable<T> data)
|
||||
{
|
||||
#if NETSTANDARD2_0
|
||||
var dataCount = data.Count();
|
||||
if (data.Count() > size)
|
||||
#if !NETSTANDARD2_0
|
||||
// Try to check the size without enumerating the entire IEnumerable. This may not be able to get the count,
|
||||
// in which case we'll have to check later
|
||||
if (data.TryGetNonEnumeratedCount(out var dataCount) && dataCount > 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<T>(data);
|
||||
|
||||
// Now check if that list is a valid size
|
||||
// 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
|
||||
throw new ArgumentException($"The max size set for the quene is {size}, but got {_storage.Count} initial values.");
|
||||
}
|
||||
/// <summary>
|
||||
/// Replace every item in the queue with the given value
|
||||
|
@ -58,7 +53,7 @@ namespace LLama.Common
|
|||
/// <returns>returns this</returns>
|
||||
public FixedSizeQueue<T> FillWith(T value)
|
||||
{
|
||||
for(int i = 0; i < Count; i++)
|
||||
for(var i = 0; i < Count; i++)
|
||||
{
|
||||
_storage[i] = value;
|
||||
}
|
||||
|
@ -78,16 +73,13 @@ namespace LLama.Common
|
|||
}
|
||||
}
|
||||
|
||||
public T[] ToArray()
|
||||
{
|
||||
return _storage.ToArray();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public IEnumerator<T> GetEnumerator()
|
||||
{
|
||||
return _storage.GetEnumerator();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
return GetEnumerator();
|
||||
|
|
Loading…
Reference in New Issue