#ifndef YAGE_MATH_MATRIX_HPP #define YAGE_MATH_MATRIX_HPP #include #include #include #include namespace yage { template class Matrix; namespace detail { template class Row { private: Matrix *parent_; int index_; public: Row(Matrix *parent, int index) : parent_(parent), index_(index) {} Type& operator[](int col) { return parent_->data_[index_*Cols+col]; } const Type& operator[](int col) const { return parent_->data_[index_*Cols+col]; } }; } // detail template class Matrix { friend class detail::Row; protected: std::vector data_; public: Matrix() : data_(Rows*Cols) {} detail::Row operator[](int row) { return detail::Row(this, row); } Matrix& operator=(const Matrix &other) { if(this!=&other) { data_=other.data_; } return *this; } Matrix& operator+=(const Matrix &rhs) { std::vector out; out.reserve(data_.size()); std::transform(data_.begin(), data_.end(), rhs.data_.begin(), std::back_inserter(out), [] (Type a, Type b) { return a+b; }); data_=std::move(out); return *this; } friend Matrix operator+(Matrix lhs, const Matrix &rhs) { lhs+=rhs; return lhs; } Matrix& operator-=(const Matrix &rhs) { std::vector out; out.reserve(data_.size()); std::transform(data_.begin(), data_.end(), rhs.begin(), std::back_inserter(out), [] (Type a, Type b) { return a-b; }); data_=std::move(out); return *this; } friend Matrix operator-(Matrix lhs, const Matrix &rhs) { lhs-=rhs; return lhs; } friend std::ostream& operator<<(std::ostream &os, const Matrix &mat) { os<<'['; for(std::size_t i=0; i class Vector : public Matrix { public: Vector() : Matrix() {} Type& operator[](int col) { return this->data_[col]; } const Type& operator[](int col) const { return this->data_[col]; } }; template class Vector2 : public Vector<2, Type> { public: Vector2() : Vector<2, Type>() {} Type& x() { return this->data_[0]; } const Type& x() const { return this->data_[0]; } Type& y() { return this->data_[1]; } const Type& y() const { return this->data_[1]; } }; typedef Vector2 Vector2d; namespace matrix { template Matrix multiply(const Matrix &m1, const Matrix &m2) { if(N!=P) { throw std::runtime_error("Matrices don't have the right dimensions for multiplication"); } Matrix res; return res; } } // vector } // yage #endif