#ifndef HEAPARRAY_H #define HEAPARRAY_H #include "utils/StringBuffer.h" template class HeapArray final { int length; T* data; public: HeapArray(int length) : length(length), data(new T[length]) { } HeapArray(int length, const T& t) : HeapArray(length) { fill(t); } ~HeapArray() { delete[] data; } HeapArray(const HeapArray& other) = delete; HeapArray& operator=(const HeapArray& other) = delete; HeapArray(HeapArray&& other) : length(other.length), data(other.data) { other.length = 0; other.data = nullptr; } HeapArray& operator=(HeapArray&& other) { if(this != &other) { delete[] data; length = other.length; data = other.data; other.length = 0; other.data = nullptr; } return *this; } void fill(const T& t) { for(int i = 0; i < length; i++) { data[i] = t; } } T& operator[](int index) { return data[index]; } const T& operator[](int index) const { return data[index]; } T* begin() { return data; } T* end() { return data + length; } const T* begin() const { return data; } const T* end() const { return data + length; } int getLength() const { return length; } void grow(int growth, const T& t) { int newLength = length + growth; T* newData = new T[newLength]; for(int i = 0; i < length; i++) { newData[i] = std::move(data[i]); } for(int i = length; i < newLength; i++) { newData[i] = t; } delete[] data; data = newData; length = newLength; } template void toString(StringBuffer& s) const { s.append("["); for(int i = 0; i < length - 1; i++) { s.append(data[i]); s.append(", "); } if(length > 0) { s.append(data[length - 1]); } s.append("]"); } }; #endif