protected PoolingQueue() { Count = 0; _enqueueIndex = 0; _dequeueIndex = 0; _enqueueTo = _dequeueFrom = null; }
public T Pop() { if (IsEmpty) { throw new IndexOutOfRangeException(); } _topIndex--; if (_topIndex < 0) { _topIndex = PoolsDefaults.DefaultPoolBucketSize - 1; var oldTop = _top; _top = _top.Next; oldTop.Dispose(); } var obj = _top[_topIndex]; _top[_topIndex] = default; Count--; return(obj); }
public void Clear() { while (_top != null) { var next = _top.Next; _top.Dispose(); _top = next; } }
public void Clear() { while (_enqueueTo != null) { var next = _enqueueTo.Next; _enqueueTo.Dispose(); _enqueueTo = next; } _dequeueFrom = null; }
public void Enqueue(T obj) { if (Count == 0 && _enqueueTo == null) { _enqueueTo = _dequeueFrom = CreateNodeHolder(); } _enqueueTo[_enqueueIndex] = obj; _enqueueIndex++; Count++; if (_enqueueIndex == PoolsDefaults.DefaultPoolBucketSize) { var enqueue = _enqueueTo; _enqueueTo = CreateNodeHolder(); enqueue.Next = _enqueueTo; _enqueueIndex = 0; } }
public void Push(T obj) { if (Count == 0 && _top == null) { _top = CreateNodeHolder(); } _top[_topIndex] = obj; _topIndex++; Count++; if (_topIndex == PoolsDefaults.DefaultPoolBucketSize) { var top = _top; _top = CreateNodeHolder(); _top.Next = top; _topIndex = 0; } }
public T Dequeue() { if (IsEmpty) { throw new IndexOutOfRangeException(); } var obj = _dequeueFrom[_dequeueIndex]; _dequeueFrom[_dequeueIndex] = default; _dequeueIndex++; Count--; if (_dequeueIndex == PoolsDefaults.DefaultPoolBucketSize) { var dequeue = _dequeueFrom; _dequeueFrom = _dequeueFrom.Next; _dequeueIndex = 0; dequeue.Dispose(); } if (Count == 0) { // return back to pool if (_enqueueTo != _dequeueFrom) { var empty = _dequeueFrom; _dequeueFrom = _dequeueFrom.Next; _dequeueIndex = 0; empty.Dispose(); } else // reset to pool start { _enqueueIndex = 0; _dequeueIndex = 0; } } return(obj); }
protected PoolingStackBase() { Count = 0; _topIndex = 0; _top = null; }