/* Matrix.h declares class Matrix.
 *  Joel Adams, Fall 1996.
 *************************************************/
 
#include <iostream.h>       // istream, ostream
#include <vector.h>         // vector
#include <assert.h>         // assert()
 
class Matrix : public vector< vector<double> >
{
 public:
  Matrix();
  Matrix(int rows, int cols);
//  Matrix(const Matrix & Original);
 
  void Read(istream & in);
  void Print(ostream & out) const;
 
  int Rows() const;
  int Columns() const;
 
  friend Matrix operator*(const Matrix& M1, const Matrix& M2);
 
 private:
  int myRows, myColumns;
};
 
inline Matrix::Matrix()
     : vector< vector<double> >()
{
  myRows = myColumns = 0;
}
 
inline Matrix::Matrix(int rows, int cols)
     : vector< vector<double> >(rows, vector<double>(cols, 0.0))
{
  assert(rows >= 0 && cols >= 0);
  myRows = rows;
  myColumns = cols;
}
 
/*
inline Matrix::Matrix(const Matrix & original)
     : vector< vector<double> >(original)
     {
  myRows = original.myRows;
  myColumns = original.myColumns;
  }
*/
 
inline int Matrix::Rows() const
{
  return myRows;
}
 
inline int Matrix::Columns() const
{
  return myColumns;
}
 
inline istream & operator>>(istream & in, Matrix & mat)
{
  mat.Read(in);
  return in;
}
 
inline ostream & operator<<(ostream & out, const Matrix & mat)
{
  mat.Print(out);
  return out;
}

