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/Linq/Concat.Enumerable.cs

93 lines
2.5 KiB

namespace MemoryPools.Collections.Linq
{
internal class ConcatExprEnumerable<T> : IPoolingEnumerable<T>
{
private IPoolingEnumerable<T> _src, _second;
private int _count;
public ConcatExprEnumerable<T> Init(IPoolingEnumerable<T> src, IPoolingEnumerable<T> second)
{
_src = src;
_count = 0;
_second = second;
return this;
}
public IPoolingEnumerator<T> GetEnumerator()
{
_count++;
return Pool<ConcatExprEnumerator>.Get().Init(this, _src.GetEnumerator(), _second.GetEnumerator());
}
private void Dispose()
{
if (_count == 0) return;
_count--;
if (_count == 0)
{
_src = default;
_second = default;
Pool<ConcatExprEnumerable<T>>.Return(this);
}
}
internal class ConcatExprEnumerator : IPoolingEnumerator<T>
{
private ConcatExprEnumerable<T> _parent;
private IPoolingEnumerator<T> _src, _second;
private bool _first;
public ConcatExprEnumerator Init(
ConcatExprEnumerable<T> parent, IPoolingEnumerator<T> src, IPoolingEnumerator<T> second)
{
_parent = parent;
_src = src;
_second = second;
_first = true;
return this;
}
public bool MoveNext()
{
if (_first)
{
if (_src.MoveNext())
{
return true;
}
_first = false;
}
return _second.MoveNext();
}
public void Reset()
{
_first = true;
_src.Reset();
_second.Reset();
}
object IPoolingEnumerator.Current => Current;
public T Current => _first ? _src.Current : _second.Current;
public void Dispose()
{
_parent?.Dispose();
_parent = default;
_src?.Dispose();
_src = default;
_second?.Dispose();
_second = default;
Pool<ConcatExprEnumerator>.Return(this);
}
}
IPoolingEnumerator IPoolingEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}

Powered by TurnKey Linux.