StackAllocator.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #ifndef STACKALLOCATOR_H
  2. #define STACKALLOCATOR_H
  3. namespace StackAllocator {
  4. struct Pointer {
  5. int lastPointer;
  6. int pointer;
  7. };
  8. Pointer allocate(int bytesPerElement, int& elements);
  9. void free(const Pointer& p);
  10. int grow(const Pointer& p, int bytesPerElement, int elements);
  11. void* get(const Pointer& p);
  12. template<typename T>
  13. class Array final {
  14. int length;
  15. Pointer dataPointer;
  16. public:
  17. Array(int n) : length(n), dataPointer(StackAllocator::allocate(sizeof (T), length)) {
  18. for(int i = 0; i < length; i++) {
  19. new (&(*this)[i]) T();
  20. }
  21. }
  22. ~Array() {
  23. for(int i = 0; i < length; i++) {
  24. (*this)[i].~T();
  25. }
  26. StackAllocator::free(dataPointer);
  27. }
  28. Array(const Array&) = delete;
  29. Array& operator=(const Array&) = delete;
  30. Array(Array&&) = delete;
  31. Array& operator=(Array&&) = delete;
  32. int getLength() const {
  33. return length;
  34. }
  35. int grow(int n) {
  36. int add = StackAllocator::grow(dataPointer, sizeof (T), n);
  37. for(int i = length; i < length + add; i++) {
  38. new (&(*this)[i]) T();
  39. }
  40. length += add;
  41. return add;
  42. }
  43. T& operator[](int index) {
  44. return static_cast<T*> (StackAllocator::get(dataPointer))[index];
  45. }
  46. const T& operator[](int index) const {
  47. return static_cast<T*> (StackAllocator::get(dataPointer))[index];
  48. }
  49. };
  50. }
  51. #endif