ObjectPool.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #ifndef OBJECTPOOL_H
  2. #define OBJECTPOOL_H
  3. #include "utils/UninitializedArray.h"
  4. template<typename T, int N>
  5. class ObjectPool {
  6. int freeIndex;
  7. union Node {
  8. int next;
  9. T t;
  10. template<typename... Args>
  11. Node(Args&&... args) : t(std::forward<Args>(args)...) {
  12. }
  13. ~Node() {
  14. t.~T();
  15. }
  16. };
  17. UninitializedArray<Node, N> data;
  18. public:
  19. ObjectPool() : freeIndex(0) {
  20. for(int i = 0; i < N - 1; i++) {
  21. data[i].next = i + 1;
  22. }
  23. data[N - 1].next = -1;
  24. }
  25. template<typename... Args>
  26. int allocate(Args&&... args) {
  27. if(freeIndex == -1) {
  28. return -1;
  29. }
  30. int index = freeIndex;
  31. freeIndex = data[index].next;
  32. data.init(index, std::forward<Args>(args)...);
  33. return index;
  34. }
  35. void free(int p) {
  36. data.destroy(p);
  37. data[p].next = freeIndex;
  38. freeIndex = p;
  39. }
  40. T& operator[](int index) {
  41. return data[index].t;
  42. }
  43. const T& operator[](int index) const {
  44. return data[index].t;
  45. }
  46. };
  47. #endif