using System;
using UnityEngine;
using System.Collections.Generic;
namespace UnityEngine.ProBuilder
{
///
/// Simple object pool implementation.
///
///
sealed class ObjectPool : IDisposable
{
bool m_IsDisposed;
Queue m_Pool = new Queue();
public int desiredSize;
public Func constructor;
public Action destructor;
public ObjectPool(int initialSize, int desiredSize, Func constructor, Action destructor, bool lazyInitialization = false)
{
if (constructor == null)
throw new ArgumentNullException("constructor");
if (destructor == null)
throw new ArgumentNullException("destructor");
this.constructor = constructor;
this.destructor = destructor;
this.desiredSize = desiredSize;
for (int i = 0; i < initialSize && i < desiredSize && !lazyInitialization; i++)
m_Pool.Enqueue(constructor());
}
public T Dequeue()
{
if (m_Pool.Count > 0)
return m_Pool.Dequeue();
return constructor();
}
public void Enqueue(T obj)
{
if (m_Pool.Count < desiredSize)
m_Pool.Enqueue(obj);
else
destructor(obj);
}
public void Empty()
{
int count = m_Pool.Count;
for (int i = 0; i < count; i++)
destructor(m_Pool.Dequeue());
}
public void Dispose()
{
Dispose(true);
}
void Dispose(bool disposing)
{
if (disposing && !m_IsDisposed)
{
Empty();
m_IsDisposed = true;
}
}
}
}