holopy3/Assets/UniGLTF/DepthFirstScheduler/LockQueue.cs

96 lines
2.1 KiB
C#
Raw Normal View History

2021-01-28 12:07:52 +00:00
using System.Collections;
using System.Collections.Generic;
namespace DepthFirstScheduler
{
public class LockQueue<T> where T : class
{
List<T> m_queue = new List<T>();
public int Count
{
get
{
lock (((ICollection)m_queue).SyncRoot)
{
return m_queue.Count;
}
}
}
public void Enqueue(T t)
{
lock (((ICollection)m_queue).SyncRoot)
{
m_queue.Add(t);
}
}
public T Dequeue(out int remain)
{
lock (((ICollection)m_queue).SyncRoot)
{
if (m_queue.Count == 0)
{
remain = 0;
return null;
}
var item = m_queue[0];
m_queue.RemoveAt(0);
remain = m_queue.Count;
return item;
}
}
public T Dequeue()
{
lock (((ICollection)m_queue).SyncRoot)
{
if (m_queue.Count == 0) return null;
var item = m_queue[0];
m_queue.RemoveAt(0);
return item;
}
}
}
public class LockQueueForValue<T> where T : struct
{
List<T> m_queue = new List<T>();
public int Count
{
get
{
lock (((ICollection)m_queue).SyncRoot)
{
return m_queue.Count;
}
}
}
public void Enqueue(T t)
{
lock (((ICollection)m_queue).SyncRoot)
{
m_queue.Add(t);
}
}
public bool TryDequeue(out T t)
{
lock (((ICollection)m_queue).SyncRoot)
{
if (m_queue.Count == 0)
{
t = default(T);
return false;
}
t = m_queue[0];
m_queue.RemoveAt(0);
return true;
}
}
}
}