using System;
using System.Collections.Generic;
namespace AlicizaX.Runtime
{
public static partial class ReferencePool
{
///
/// 引用集合
///
private sealed class ReferenceCollection
{
private readonly Queue _references;
private readonly Type _referenceType;
private int _usingReferenceCount;
private int _acquireReferenceCount;
private int _releaseReferenceCount;
private int _addReferenceCount;
private int _removeReferenceCount;
public ReferenceCollection(Type referenceType)
{
_references = new Queue();
_referenceType = referenceType;
_usingReferenceCount = 0;
_acquireReferenceCount = 0;
_releaseReferenceCount = 0;
_addReferenceCount = 0;
_removeReferenceCount = 0;
}
///
/// 引用类型
///
public Type ReferenceType
{
get { return _referenceType; }
}
///
/// 未使用的引用计数。
///
public int UnusedReferenceCount
{
get { return _references.Count; }
}
///
/// 正在使用的引用计数。
///
public int UsingReferenceCount
{
get { return _usingReferenceCount; }
}
///
/// 获取引用的次数。
///
public int AcquireReferenceCount
{
get { return _acquireReferenceCount; }
}
///
/// 归还引用的次数。
///
public int ReleaseReferenceCount
{
get { return _releaseReferenceCount; }
}
///
/// 添加引用的次数。
///
public int AddReferenceCount
{
get { return _addReferenceCount; }
}
///
/// 移除引用的次数。
///
public int RemoveReferenceCount
{
get { return _removeReferenceCount; }
}
///
/// 从引用池获取引用。
///
/// 引用类型。
/// 引用。
public T Acquire() where T : class, IReference, new()
{
if (typeof(T) != _referenceType)
{
throw new GameFrameworkException("Type is invalid.");
}
_usingReferenceCount++;
_acquireReferenceCount++;
lock (_references)
{
if (_references.Count > 0)
{
return (T)_references.Dequeue();
}
}
_addReferenceCount++;
return new T();
}
///
/// 从引用池获取引用。
///
/// 引用。
public IReference Acquire()
{
_usingReferenceCount++;
_acquireReferenceCount++;
lock (_references)
{
if (_references.Count > 0)
{
return _references.Dequeue();
}
}
_addReferenceCount++;
return (IReference)Activator.CreateInstance(_referenceType);
}
///
/// 释放一个引用对象。
///
/// 要释放的引用对象。
public void Release(IReference reference)
{
reference.Clear();
lock (_references)
{
if (m_EnableStrictCheck && _references.Contains(reference))
{
Log.Error("Reference has been released!=>{0}", reference.GetType().FullName);
return;
}
_references.Enqueue(reference);
}
_releaseReferenceCount++;
_usingReferenceCount--;
}
///
/// 添加指定类型的引用对象到引用池中。
///
/// 要添加的引用对象类型。
/// 要添加的引用对象数量。
/// 类型无效。
public void Add(int count) where T : class, IReference, new()
{
if (typeof(T) != _referenceType)
{
throw new GameFrameworkException("Type is invalid.");
}
lock (_references)
{
_addReferenceCount += count;
while (count-- > 0)
{
_references.Enqueue(new T());
}
}
}
///
/// 向引用池中添加指定数量的引用。
///
/// 要添加的引用数量。
public void Add(int count)
{
lock (_references)
{
_addReferenceCount += count;
while (count-- > 0)
{
_references.Enqueue((IReference)Activator.CreateInstance(_referenceType));
}
}
}
///
/// 从引用池中移除指定数量的引用。
///
/// 要移除的引用数量。
public void Remove(int count)
{
lock (_references)
{
if (count > _references.Count)
{
count = _references.Count;
}
_removeReferenceCount += count;
while (count-- > 0)
{
_references.Dequeue();
}
}
}
///
/// 从引用池中移除所有的引用。
///
public void RemoveAll()
{
lock (_references)
{
_removeReferenceCount += _references.Count;
_references.Clear();
}
}
}
}
}