Pool.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System;
  2. namespace MonoGame.Extended.Collections
  3. {
  4. public class Pool<T>
  5. where T : class
  6. {
  7. private readonly Func<T> _createItem;
  8. private readonly Action<T> _resetItem;
  9. private readonly Deque<T> _freeItems;
  10. private readonly int _maximum;
  11. public Pool(Func<T> createItem, Action<T> resetItem, int capacity = 16, int maximum = int.MaxValue)
  12. {
  13. _createItem = createItem;
  14. _resetItem = resetItem;
  15. _maximum = maximum;
  16. _freeItems = new Deque<T>(capacity);
  17. }
  18. public Pool(Func<T> createItem, int capacity = 16, int maximum = int.MaxValue)
  19. : this(createItem, _ => { }, capacity, maximum)
  20. {
  21. }
  22. public int AvailableCount => _freeItems.Count;
  23. public T Obtain()
  24. {
  25. if (_freeItems.Count > 0)
  26. return _freeItems.Pop();
  27. return _createItem();
  28. }
  29. public void Free(T item)
  30. {
  31. if (item == null) throw new ArgumentNullException(nameof(item));
  32. if (_freeItems.Count < _maximum)
  33. _freeItems.AddToBack(item);
  34. _resetItem(item);
  35. }
  36. public void Clear()
  37. {
  38. _freeItems.Clear();
  39. }
  40. }
  41. }