HeapArray.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #ifndef HEAPARRAY_H
  2. #define HEAPARRAY_H
  3. #include "utils/StringBuffer.h"
  4. template<typename T>
  5. class HeapArray final {
  6. int length;
  7. T* data;
  8. public:
  9. HeapArray(int length) : length(length), data(new T[length]) {
  10. }
  11. HeapArray(int length, const T& t) : HeapArray(length) {
  12. fill(t);
  13. }
  14. ~HeapArray() {
  15. delete[] data;
  16. }
  17. HeapArray(const HeapArray& other) = delete;
  18. HeapArray& operator=(const HeapArray& other) = delete;
  19. HeapArray(HeapArray&& other) : length(other.length), data(other.data) {
  20. other.length = 0;
  21. other.data = nullptr;
  22. }
  23. HeapArray& operator=(HeapArray&& other) {
  24. if(this != &other) {
  25. delete[] data;
  26. length = other.length;
  27. data = other.data;
  28. other.length = 0;
  29. other.data = nullptr;
  30. }
  31. return *this;
  32. }
  33. void fill(const T& t) {
  34. for(int i = 0; i < length; i++) {
  35. data[i] = t;
  36. }
  37. }
  38. T& operator[](int index) {
  39. return data[index];
  40. }
  41. const T& operator[](int index) const {
  42. return data[index];
  43. }
  44. T* begin() {
  45. return data;
  46. }
  47. T* end() {
  48. return data + length;
  49. }
  50. const T* begin() const {
  51. return data;
  52. }
  53. const T* end() const {
  54. return data + length;
  55. }
  56. int getLength() const {
  57. return length;
  58. }
  59. void grow(int growth, const T& t) {
  60. int newLength = length + growth;
  61. T* newData = new T[newLength];
  62. for(int i = 0; i < length; i++) {
  63. newData[i] = std::move(data[i]);
  64. }
  65. for(int i = length; i < newLength; i++) {
  66. newData[i] = t;
  67. }
  68. delete[] data;
  69. data = newData;
  70. length = newLength;
  71. }
  72. template<int L>
  73. void toString(StringBuffer<L>& s) const {
  74. s.append("[");
  75. for(int i = 0; i < length - 1; i++) {
  76. s.append(data[i]);
  77. s.append(", ");
  78. }
  79. if(length > 0) {
  80. s.append(data[length - 1]);
  81. }
  82. s.append("]");
  83. }
  84. };
  85. #endif