#include "matrix.h"
#include<iostream>
#include<cmath>
#include<cstdlib> 

using namespace std;

// allocate the memory for matrix A , B and C 

matrix::matrix(int r, int c)
{

  elements=NULL;
  elements=new double *[r];
  for(int i=0;i<r;i++)
  elements[i]=new double[c];
  generate();
	
}

// generate random values 

void matrix::generate()
{
	int r,c;
  for (int i=0; i<r; i++)
    for (int j=0; j<c; j++)
      {
	elements[i][j]=rand()%2000-1000;
	//	cout << "elements[" << i << "]["<< j <<"]=" <<elements[i][j] << endl;
      }
}

// return the value of the elements

int Matrix::getElement(int r,int c)
{
	return elements[r*2+c];
}

int Matrix::getElement(int n)
{
	return elements[n];
}


void Matrix::setElement(int r, int c, int value)
{
	elements[r*2+c] = value;
}

int* Matrix::getColumn(int c)
{
	int col[c];
	for(int i=0;i<r;i++)
	{
		col[i] = elements[2*i+c-1];
	}
	return col;
}


void Matrix::setColumn(int c , int value[])
{
	for(int i=0;i<r;i++)
	{
		elements[2*i+c-1]=value[i];
	}
}

int* Matrix::getRow(int r)
{
	int row[r];
	for(int i=0;i<c;i++)
	{
		row[i] = elements[i+c-1];
	}
	return row;
}

void Matrix::setRow(int r, int value[])
{
	for(int i=0;i<r;i++)
	{
		elements[i+r-1]=value[i];
	}

}

// SUM

Matrix& Matrix::operator+(Matrix& m)
{
	
	for(int i=0;i<r;i++)
	{	
		elements[i] += m.getElement(i);
		
	}
	return *this;
}

// SUB 

Matrix& Matrix::operator-(Matrix &m)
{
	for(int i=0;i<r;i++)
	{	
		elements[i] -= m.getElement(i);
		
	}
	return *this;
}


Matrix& Matrix::operator=(Matrix &m)
{
	for(int i=0;i<r;i++)
	{	
		elements[i] = m.getElement(i);
		
	}
	return *this;
}

// MULTIPLY 

Matrix& Matrix::operator*(Matrix &m)
{
		int i=0, product[r];
		for(int n=0;n<r;n++)
		{
			product[n]=elements[n];
		}
		/*
		elements[i] = elements[i]*m.getElement(i) + elements[i+1]*m.getElement(i+2);
		elements[i+1] = elements[i]*m.getElement(i+1) + elements[i+1]*m.getElement(i+3);
		elements[i+2] = elements[i+2]*m.getElement(i) + elements[i+3]*m.getElement(i+2);
		elements[i+3] = elements[i+2]*m.getElement(i+1) + elements[i+3]*m.getElement(i+3);
		
		elements[i] = product[i]*m.getElement(i) + product[i+1]*m.getElement(i+2);
		elements[i+1] = product[i]*m.getElement(i+1) + product[i+1]*m.getElement(i+3);
		elements[i+2] = product[i+2]*m.getElement(i) + product[i+3]*m.getElement(i+2);
		elements[i+3] = product[i+2]*m.getElement(i+1) + product[i+3]*m.getElement(i+3);
		*/
		
	return *this;
}

//EQUAL

bool Matrix::operator==(Matrix &m)
{
	int count=0;
	for (int i=0;i<r;i++)
	{	
		if (elements[i] == m.getElement(i))
		count++;
	}
	if (count == r)
	{
		return true;
	}
	else
		return false;
}

// NOT EQUAL

bool Matrix::operator!=(Matrix &m)
{
	int count=0;
	for(int i=0;i<r;i++)
	{	
		if(elements[i] == m.getElement(i))
		count++;
	}
	if(count==r)
	{
		return false;
	}
	else
		return true;
}

