51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | 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); | |||
|  |         } | |||
|  |     } | |||
|  | } |