Arena.h 855 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #ifndef MANDEL_ARENA_H
  2. #define MANDEL_ARENA_H
  3. #include <array>
  4. #include <utility>
  5. #include <memory>
  6. namespace mnd
  7. {
  8. namespace util
  9. {
  10. template <typename T, int chunkSize = 32>
  11. class Arena
  12. {
  13. struct Chunk
  14. {
  15. std::array<T, chunkSize> data;
  16. int used = 0;
  17. bool full(void) const { return used = chunkSize; }
  18. T* allocate() { return data[used++]; }
  19. };
  20. std::vector<std::unique_ptr<Chunk>> chunks;
  21. public:
  22. T* allocate(void)
  23. {
  24. if (chunks.empty() || chunks[chunks.size() - 1].full()) {
  25. chunks.push_back(Chunk{});
  26. }
  27. return chunks[chunks.size() - 1].allocate();
  28. }
  29. };
  30. }
  31. }
  32. #endif // MANDEL_ARENA_H