You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel/Services/MemoryPools/Collections/Specialized/PoolingDictionary.KeysColle...

85 lines
1.9 KiB

using System;
using System.Collections;
using System.Collections.Generic;
namespace MemoryPools.Collections.Specialized
{
public partial class PoolingDictionary<TKey, TValue>
{
internal class KeysCollection : ICollection<TKey>
{
private PoolingDictionary<TKey, TValue> _src;
public KeysCollection Init(PoolingDictionary<TKey, TValue> src)
{
_src = src;
return this;
}
public IEnumerator<TKey> GetEnumerator()
{
return Pool<Enumerator>.Get().Init(_src);
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
public void Add(TKey item) => throw new NotImplementedException();
public void Clear() => throw new NotImplementedException();
public bool Contains(TKey item) => _src.FindEntry(item) >= 0;
public void CopyTo(TKey[] array, int arrayIndex)
{
if (array.Length - arrayIndex < _src._entries.Count)
{
throw new IndexOutOfRangeException("Cannot copy keys into array. Target array is too small.");
}
for (var index = 0; index < _src._entries.Count; index++)
{
var entry = _src._entries[index];
array[arrayIndex + index] = entry.key;
}
}
public bool Remove(TKey item) => throw new NotImplementedException("Removal ops are disallowed.");
public int Count => _src.Count;
public bool IsReadOnly => _src.IsReadOnly;
private class Enumerator : IEnumerator<TKey>
{
private PoolingDictionary<TKey, TValue> _src;
private int _pos;
public Enumerator Init(PoolingDictionary<TKey, TValue> src)
{
_pos = -1;
_src = src;
return this;
}
public bool MoveNext()
{
if (_pos >= _src.Count) return false;
_pos++;
return _pos < _src.Count;
}
public void Reset()
{
_pos = -1;
}
public TKey Current => _src._entries[_pos].key;
object IEnumerator.Current => Current!;
public void Dispose()
{
_src = default!;
Pool<Enumerator>.Return(this);
}
}
}
}
}

Powered by TurnKey Linux.