You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.5 KiB
51 lines
1.5 KiB
using System.Collections.Generic; |
|
using UnityEngine; |
|
using UnityEngine.Events; |
|
|
|
|
|
namespace TMPro |
|
{ |
|
|
|
internal class TMP_ObjectPool<T> where T : new() |
|
{ |
|
private readonly Stack<T> m_Stack = new Stack<T>(); |
|
private readonly UnityAction<T> m_ActionOnGet; |
|
private readonly UnityAction<T> m_ActionOnRelease; |
|
|
|
public int countAll { get; private set; } |
|
public int countActive { get { return countAll - countInactive; } } |
|
public int countInactive { get { return m_Stack.Count; } } |
|
|
|
public TMP_ObjectPool(UnityAction<T> actionOnGet, UnityAction<T> actionOnRelease) |
|
{ |
|
m_ActionOnGet = actionOnGet; |
|
m_ActionOnRelease = actionOnRelease; |
|
} |
|
|
|
public T Get() |
|
{ |
|
T element; |
|
if (m_Stack.Count == 0) |
|
{ |
|
element = new T(); |
|
countAll++; |
|
} |
|
else |
|
{ |
|
element = m_Stack.Pop(); |
|
} |
|
if (m_ActionOnGet != null) |
|
m_ActionOnGet(element); |
|
return element; |
|
} |
|
|
|
public void Release(T element) |
|
{ |
|
if (m_Stack.Count > 0 && ReferenceEquals(m_Stack.Peek(), element)) |
|
Debug.LogError("Internal error. Trying to destroy object that is already released to pool."); |
|
if (m_ActionOnRelease != null) |
|
m_ActionOnRelease(element); |
|
m_Stack.Push(element); |
|
} |
|
} |
|
} |