using System.Collections; using System.Collections.Generic; using UnityEngine; namespace BF { public class BFQueue { private BFNode head; private BFNode tail; private BFStackPool nodePool; private IEqualityComparer comparer; private int count; public int Count { get { return count; } } public BFQueue(IEqualityComparer comparer = null) { nodePool = new BFStackPool(); this.comparer = comparer ?? EqualityComparer.Default; } public BFNode Dequeue() { if (count == 0) return null; var temp = head; head = head.next; temp.next = null; temp.Invalidate(); nodePool.Push(temp); --count; return temp; } public void Enqueue(T item) { var newNode = nodePool.SafePop(); newNode.prev = null; newNode.next = null; newNode.item = item; if (count == 0) { head = newNode; tail = newNode; } else { newNode.prev = tail; tail.next = newNode; tail = newNode; } ++count; } public void Remove(T t) { var temp = head; while (temp != null) { if (comparer.Equals(temp.item, t)) { var prev = temp.prev; var next = temp.next; if (prev != null) { prev.next = next; } else { head = next; } if (next != null) { next.prev = prev; } else { tail = prev; } temp.prev = null; temp.next = null; temp.Invalidate(); nodePool.Push(temp); --count; break; } temp = temp.next; } } public void Clear() { var current = head; while (current != null) { var temp = current; current = current.next; temp.prev = null; temp.next = null; temp.Invalidate(); nodePool.Push(temp); } head = null; tail = null; count = 0; } } }