using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections;
namespace Lilium.Collections
{ public class CyclicQueue<T>: IEnumerable<T>
{ public CyclicQueue(int length)
{ if (length < 0) throw new InvalidOperationException("Queue length can't be less then zero");
m_Queue = new T[length];
}
public void Enqueue(T item)
{
var length = Queue.Length ; if (length == 0) return;
public T Dequeue()
{ if (Count == 0) throw new InvalidOperationException("Queue is empty");
T local = Queue[Head];
Queue[Head] = default(T);
Head = (Head + 1) % Queue.Length; return local;
}
/// <summary>
/// Returns enumerator which enumerates from queue tail to the head.
/// </summary>
/// <returns></returns> public IEnumerator<T> GetReversedEnumerator()
{
var length = Count; if (length == 0)
yield break;
if (Tail > Head) for (int i = Tail - 1; i >= Head; i--)
yield return Queue[i]; else
{ for (int i = Tail - 1; i >= 0; i--)
yield return Queue[i]; for (int i = length - 1; i >= Head; i--)
yield return Queue[i];
}
}
public int Count
{
get
{ return m_Count;
} private set
{
m_Count = value;
}
}
#endregion
#region IEnumerable<T> Members
public IEnumerator<T> GetEnumerator()
{
var length = Queue.Length; if (length == 0)
yield break;
if (Tail > Head) for (int i = Head; i < Tail; i++)
yield return Queue[i]; else
{ for (int i = Head; i < length; i++)
yield return Queue[i]; for (int i = 0; i < Tail - 1; i++)
yield return Queue[i];
}
}