96 lines
2.2 KiB
C#
96 lines
2.2 KiB
C#
using System.Collections.Generic;
|
|
|
|
namespace OctoberStudio.Pool
|
|
{
|
|
public abstract class Pool<T>: AbstractPool
|
|
{
|
|
private List<T> entities;
|
|
|
|
protected abstract T CreateEntity();
|
|
protected abstract void InitEntity(T entity);
|
|
protected abstract bool ValidateEntity(T entity);
|
|
protected abstract void DisableEntity(T entity);
|
|
protected abstract void DestroyEntity(T entity);
|
|
|
|
public Pool(string name, int startingSize) : base(name)
|
|
{
|
|
if (startingSize < 1) startingSize = 1;
|
|
|
|
entities = new List<T>(startingSize);
|
|
}
|
|
|
|
protected T AddNewEntity()
|
|
{
|
|
var entity = CreateEntity();
|
|
InitEntity(entity);
|
|
|
|
entities.Add(entity);
|
|
|
|
return entity;
|
|
}
|
|
|
|
public virtual T GetEntity()
|
|
{
|
|
for (int i = 0; i < entities.Count; i++)
|
|
{
|
|
if (CheckForNull(i))
|
|
{
|
|
i--;
|
|
continue;
|
|
}
|
|
|
|
if (ValidateEntity(entities[i]))
|
|
{
|
|
return entities[i];
|
|
}
|
|
}
|
|
|
|
var newEntity = AddNewEntity();
|
|
return newEntity;
|
|
}
|
|
|
|
private bool CheckForNull(int index)
|
|
{
|
|
if (entities[index] == null)
|
|
{
|
|
for (int j = index; j < entities.Count - 1; j++)
|
|
{
|
|
entities[j] = entities[j + 1];
|
|
}
|
|
|
|
entities.RemoveAt(entities.Count - 1);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public void DisableAllEntities()
|
|
{
|
|
for (int i = 0; i < entities.Count; i++)
|
|
{
|
|
if (CheckForNull(i))
|
|
{
|
|
i--;
|
|
continue;
|
|
}
|
|
|
|
DisableEntity(entities[i]);
|
|
}
|
|
}
|
|
|
|
public void Destroy()
|
|
{
|
|
for (int i = 0; i < entities.Count; i++)
|
|
{
|
|
if (entities[i] != null)
|
|
{
|
|
DestroyEntity(entities[i]);
|
|
}
|
|
}
|
|
|
|
entities.Clear();
|
|
}
|
|
}
|
|
} |