#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);
}
