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