118 lines
2.8 KiB
C#
118 lines
2.8 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace BF
|
|
{
|
|
public class BFQueue<T>
|
|
{
|
|
private BFNode<T> head;
|
|
private BFNode<T> tail;
|
|
|
|
private BFStackPool<T> nodePool;
|
|
|
|
private IEqualityComparer<T> comparer;
|
|
|
|
private int count;
|
|
|
|
public int Count { get { return count; } }
|
|
|
|
public BFQueue(IEqualityComparer<T> comparer = null)
|
|
{
|
|
nodePool = new BFStackPool<T>();
|
|
this.comparer = comparer ?? EqualityComparer<T>.Default;
|
|
}
|
|
|
|
public BFNode<T> 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;
|
|
}
|
|
}
|
|
}
|
|
|
|
|