2023-04-03 11:04:31 +08:00

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;
}
}
}