#ifndef ARRAY_HPP #define ARRAY_HPP #include #include #include #include template class Array { public: Array() : size(0), data(nullptr) { } Array(std::size_t size) : size(size), data(size > 0? new T[size]: nullptr) { } Array(const Array& other) : size(other.size), data(other.data? new T[size]: nullptr) { if (data) { std::copy(other.data, other.data + size, data); } } friend void swap(Array& a1, Array& a2) { using std::swap; swap(a1.size, a2.size); swap(a1.data, a2.data); } Array(Array&& other) : Array() { swap(*this, other); } ~Array() { delete[] data; } Array& operator=(Array other) { swap(*this, other); return *this; } std::size_t get_size() const { return size; } T& operator()(std::size_t index) { assert(index < size); return data[index]; } const T& operator()(std::size_t index) const { assert(index < size); return data[index]; } private: std::size_t size; T* data; }; #endif