using System.Buffers;

namespace MemoryPools.Collections.Specialized
{
	internal abstract class PoolingNodeBase<T> : IPoolingNode<T>
	{
		protected IMemoryOwner<T> _buf;

		public int Length => _buf.Memory.Length;

		public virtual T this[int index]
		{
			get => _buf.Memory.Span[index];
			set => _buf.Memory.Span[index] = value;
		}

		public virtual void Dispose()
		{
			_buf.Dispose();
			_buf = null!;
			Next = null!;
		}

		public IPoolingNode<T> Next { get; set; }

		public abstract IPoolingNode<T> Init(int capacity);

		public void Clear()
		{
			_buf.Memory.Span.Clear();
		}
	}
}