| 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); | |
| } | |
| } | |
| } |