// ----------------------------------------------------------------------- // // Copyright (c) AillieoTech. All rights reserved. // // ----------------------------------------------------------------------- namespace AillieoUtils { using System; using System.Collections.Generic; public class SimpleObjPool { private readonly Stack stack; private readonly Func ctor; private readonly Action onRecycle; private readonly Action dtor; private int size; private int usedCount; public SimpleObjPool(int max = 5, Action onRecycle = null, Func ctor = null, Action dtor = null) { this.stack = new Stack(max); this.size = max; this.onRecycle = onRecycle; this.ctor = ctor; this.dtor = dtor; } public T Get() { T item; if (this.stack.Count == 0) { if (this.ctor != null) { item = this.ctor(); } else { item = Activator.CreateInstance(); } } else { item = this.stack.Pop(); } this.usedCount++; return item; } public void Recycle(T item) { if (this.onRecycle != null) { this.onRecycle.Invoke(item); } if (this.stack.Count < this.size) { this.stack.Push(item); } else { if (this.dtor != null) { this.dtor.Invoke(item); } } this.usedCount--; } public void Purge() { while (this.stack.Count > 0) { var item = this.stack.Pop(); if (this.dtor != null) { this.dtor.Invoke(item); } } } public override string ToString() { return $"SimpleObjPool: item=[{typeof(T)}], inUse=[{this.usedCount}], restInPool=[{this.stack.Count}/{this.size}] "; } } }