#include "matrix_proxy.h" matrix_proxy::matrix_proxy(matrix_expression& src, const range& r, const range& c) : M(src), rows(r), cols(c) { } // cannot do traditional assignment on proxies. Can only do value assignment based on expression matrix_proxy& matrix_proxy::operator=(const matrix_proxy& other) { if (this != &other) { matrix_expression::operator=(other); } return *this; } int matrix_proxy::numRows() const { return rows.size(); } int matrix_proxy::numColumns() const { return cols.size(); } // read-only version of indexing operator double matrix_proxy::operator()(int r, int c) const { int actualRow = rows.start() + r*rows.stride(); int actualCol = cols.start() + c*cols.stride(); return M(actualRow, actualCol); } // write-access version of indexing operator double& matrix_proxy::operator()(int r, int c) { int actualRow = rows.start() + r*rows.stride(); int actualCol = cols.start() + c*cols.stride(); return M(actualRow, actualCol); }