StackAllocator.h 1.7 KB

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