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/AsSingleQueryList.Enumerabl...

70 lines
1.5 KiB

namespace MemoryPools.Collections.Specialized
{
public static partial class AsSingleQueryList
{
private class EnumerableShared<T> : IPoolingEnumerable<T> where T : class
{
private PoolingListCanon<T> _src;
private int _count;
public IPoolingEnumerable<T> Init(PoolingListCanon<T> src)
{
_src = src;
_count = 0;
return this;
}
public IPoolingEnumerator<T> GetEnumerator()
{
_count++;
return Pool<EnumeratorRef>.Get().Init(this, _src);
}
IPoolingEnumerator IPoolingEnumerable.GetEnumerator() => GetEnumerator();
private void Dispose()
{
if (_count == 0) return;
_count--;
if (_count == 0)
{
_src?.Dispose();
_src = default;
Pool<EnumerableShared<T>>.Return(this);
}
}
private class EnumeratorRef : IPoolingEnumerator<T>
{
private IPoolingEnumerator<T> _enumerator;
private EnumerableShared<T> _parent;
public IPoolingEnumerator<T> Init(EnumerableShared<T> parent, IPoolingEnumerable<T> src)
{
_parent = parent;
_enumerator = src.GetEnumerator();
return this;
}
public bool MoveNext() => _enumerator.MoveNext();
public void Reset() => _enumerator.Reset();
public T Current => _enumerator.Current;
object IPoolingEnumerator.Current => Current;
public void Dispose()
{
_enumerator?.Dispose();
_enumerator = default;
_parent?.Dispose();
_parent = default;
Pool<EnumeratorRef>.Return(this);
}
}
}
}
}

Powered by TurnKey Linux.