mirror of https://github.com/ogoun/Zero.git
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.
60 lines
1.3 KiB
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!;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |