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.ValuesCol...

94 lines
2.0 KiB

using System;
using System.Collections;
using System.Collections.Generic;
namespace MemoryPools.Collections.Specialized
{
public partial class PoolingDictionary<TKey, TValue>
{
internal class ValuesCollection : ICollection<TValue>
{
private PoolingDictionary<TKey, TValue> _src;
public ValuesCollection Init(PoolingDictionary<TKey, TValue> src)
{
_src = src;
return this;
}
public IEnumerator<TValue> GetEnumerator()
{
return Pool<Enumerator>.Get().Init(_src);
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
public void Add(TValue item) => throw new NotImplementedException();
public void Clear() => throw new NotImplementedException();
public bool Contains(TValue item)
{
foreach (var entry in _src._entries)
{
if (entry.Equals(item)) return true;
}
return false;
}
public void CopyTo(TValue[] 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.value;
}
}
public bool Remove(TValue item) => throw new NotImplementedException("Removal ops are disallowed.");
public int Count => _src.Count;
public bool IsReadOnly => _src.IsReadOnly;
private class Enumerator : IEnumerator<TValue>
{
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 TValue Current => _src._entries[_pos].value;
7 months ago
object IEnumerator.Current => Current!;
public void Dispose()
{
7 months ago
_src = default!;
Pool<Enumerator>.Return(this);
}
}
}
}
}

Powered by TurnKey Linux.