#include #include #ifndef WHOOM #define WHOOM template class Matrix; template Matrix operator* (Matrix const& left, Matrix const& right); template Matrix operator+ (Matrix const& left, Matrix const& right); template Matrix&& operator+ (Matrix&& left, Matrix const& right); template Matrix operator- (Matrix const& left, Matrix const& right); template Matrix&& operator- (Matrix&& left, Matrix const& right); template Matrix operator* (Matrix const& left, T const& right); template Matrix&& operator* (Matrix&& left, T const& right); template Matrix operator/ (Matrix const& left, T const& right); template Matrix&& operator/ (Matrix&& left, T const& right); template class Matrix { std::vector data; unsigned int siz; public: Matrix(unsigned int N) { this->data = std::vector(N*N, static_cast(0)); this->siz = N; } Matrix(Matrix const& cpy) { siz = cpy.siz; data = cpy.data; } Matrix(Matrix&& mv) { siz = mv.siz; std::swap(data, mv.data); } Matrix(std::function f, unsigned int N) { data = std::vector(N*N); siz = N; for(unsigned int k=0; k < (N*N); k++) { data[k] = f(k); } } Matrix(std::function f, unsigned int N) { data = std::vector(N*N); siz = N; for(unsigned int k = 0; k < N; k++) { for(unsigned int l = 0; l < N; l++) { data[k + N * l] = f(k, l); } } } Matrix& operator=(Matrix const& cpy); Matrix&& operator=(Matrix&& mv); //~Matrix(); T& operator[](int index) { return data[index]; } T const& operator[](int index) const { return data[index]; } T& operator()(unsigned int x, unsigned int y) { return data[x + this->siz * y]; } T operator()(unsigned int x, unsigned int y) const { return data[x + this->siz * y]; } unsigned int size() const { return siz; } friend Matrix operator* <>(Matrix const& left, Matrix const& right); friend Matrix operator+ <>(Matrix const& left, Matrix const& right); friend Matrix&& operator+ <>(Matrix&& left, Matrix const& right); Matrix& operator+=(const Matrix&); friend Matrix operator- <>(Matrix const& left, Matrix const& right); friend Matrix&& operator- <>(Matrix&& left, Matrix const& right); Matrix& operator-=(const Matrix&); // scalar products friend Matrix operator* <>(Matrix const& left, T const& right); friend Matrix&& operator* <>(Matrix&& left, T const& right); Matrix& operator*=(T const&); friend Matrix operator/ <>(Matrix const& left, T const& right); friend Matrix&& operator/ <>(Matrix&& left, T const& right); Matrix& operator/=(T const&); }; #endif