/* Matrix.h derives class Matrix from the STL vector class template.
 * ...
 ****************************************************************/

#ifndef MATRIX
#define MATRIX

#include <vector>     // vector
#include <iostream>   // istream, ostream
using namespace std;

typedef vector<double> OneDimVector;
typedef vector<OneDimVector> TwoDimVector;

class Matrix : public TwoDimVector
{
 public:
   Matrix();
   Matrix(unsigned rows, unsigned columns);
   unsigned rows() const;
   unsigned columns() const;
   void print(ostream& out) const;
   void read(istream& in);
   Matrix operator*(const Matrix& Mat1) const; 
   // ... additional operations omitted ...

 private:
   unsigned myRows,
            myColumns;
};

// default constructor
inline Matrix::Matrix() 
   : TwoDimVector()
{
   myRows = 0;
   myColumns = 0;
}

// constructor
inline Matrix::Matrix(unsigned rows, unsigned columns) 
   : TwoDimVector( rows, OneDimVector(columns) )
{
   myRows = rows;
   myColumns = columns;
}

// Number of rows in a Matrix
inline unsigned Matrix::rows() const
{
   return myRows;
}


// Number of columns in a Matrix
inline unsigned Matrix::columns() const
{
   return myColumns;
}

// output function
inline ostream& operator<<(ostream& out, const Matrix& theMatrix) 
{
   theMatrix.print(out);
   return out;
}

inline istream& operator>>(istream& in, Matrix& theMatrix) 
{
   theMatrix.read(in);
   return in;
}

#endif
