// matrix2.cpp - The implementation of the class matrix.
// Written by Wayne Pollock, Tampa FL, 2000.

#include <iostream>
#include <iomanip>
#include "matrix2.h"

using namespace std;

matrix::matrix ()            // Default constructor.
{  for ( int i = 0; i < dim; ++i )
      for ( int j = 0; j < dim; ++j )
         rep[i][j] = 0;
}

matrix& matrix::operator= ( const matrix& mat )  // overloaded assignment op.
{  for ( int i = 0; i < dim; ++i )
      for ( int j = 0; j < dim; ++j )
         rep[i][j] = mat.rep[i][j];
   return *this;
}

matrix::matrix ( const int m[dim][dim] )    // Conversion consturctor.
{  for ( int i = 0; i < dim; ++i )
      for ( int j = 0; j < dim; ++j )
         rep[i][j] = m[i][j];
}

matrix::matrix ( const matrix& mat )   // Copy constructor.
{  for ( int i = 0; i < dim; ++i )
      for ( int j = 0; j < dim; ++j )
         rep[i][j] = mat.rep[i][j];
}


matrix operator+ ( const matrix& m1, const matrix& m2 )
{   matrix temp = m1;
   for ( int i=0; i<matrix::dim; ++i )
      for ( int j=0; j<matrix::dim; ++j )
         temp.rep[i][j] += m2.rep[i][j];
   return temp;
}

matrix operator* ( const matrix& m1, const matrix& m2 ) // cross product.
{  matrix temp;
   int i, j, k, prod;
   for ( i=0; i<matrix::dim; ++i )
   {  for ( j=0; j<matrix::dim; ++j )
      {  prod = 0;
         for ( k = 0; k<matrix::dim; ++k )
            prod += m1.rep[i][k]* m2.rep[k][j];
            temp.rep[i][j] = prod;
      }
   }
   return temp;
}

ostream& operator<< ( ostream &out, const matrix &m )  // Simple inserter.
{  out << endl << "  {" << endl;
   for ( int i = 0; i < matrix::dim; ++i )
   {  out << "     ";
      for ( int j=0; j<matrix::dim; ++j )
         out << setw(2) << (m.rep)[i][j] << ", ";
      out << endl;
   }
   out << "  }" << endl;
   return out;
}
