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

60 lines
1.3 KiB

namespace MemoryPools.Collections.Specialized
{
public static partial class AsSingleQueryList
{
private class EnumerableTyped<T> : IPoolingEnumerable<T>
{
private PoolingList<T> _src;
public IPoolingEnumerable<T> Init(PoolingList<T> src)
{
_src = src;
return this;
}
public IPoolingEnumerator<T> GetEnumerator()
{
var src = _src;
_src = default;
Pool<EnumerableTyped<T>>.Return(this);
return Pool<EnumeratorVal>.Get().Init(src);
}
IPoolingEnumerator IPoolingEnumerable.GetEnumerator() => GetEnumerator();
private class EnumeratorVal : IPoolingEnumerator<T>
{
private PoolingList<T> _src;
private IPoolingEnumerator<T> _enumerator;
public IPoolingEnumerator<T> Init(PoolingList<T> src)
{
_src = src;
_enumerator = _src.GetEnumerator();
return this;
}
public bool MoveNext() => _enumerator.MoveNext();
public void Reset()
{
_enumerator?.Dispose();
_enumerator = _src.GetEnumerator();
}
public T Current => _enumerator.Current;
object IPoolingEnumerator.Current => Current;
public void Dispose()
{
_enumerator?.Dispose();
_src?.Dispose();
Pool<PoolingList<T>>.Return(_src);
Pool<EnumeratorVal>.Return(this);
_src = default;
}
}
}
}
}

Powered by TurnKey Linux.