#ifndef POLYNOMIAL_CPP
#define POLYNOMIAL_CPP
#include "polynomial.h"

Polynomial(){
	coeffs.push_back(0);
}

Polynomial(const vector<double>& v){
	coeffs(v){
		normalize();
		}
}

void Polymoial::normalize(){
	while(coeffs.size()>1 && coeffs.back()==0){
		coeffs.pop_back();
		}
		if (coeffs.empty()){
			coeffs.push_back(0);
		}
	}

int Polynomial::getDegree() const {
	return coeffs.size() -1;
}

vector<double> Polynomial::getCoefficients() const {
	return coeffs;

}

double getCoefficient(int i) const {
	if (i<0 || i>getDegree()){
		return 0;
		}
	return coeffs;
}


void Polynomial::setCoefficient(int degree, double value){
	if (degree <0) {
		return;
	}
	if (degree>= coeffs.size()){
		coeffs.resize(degree+1,0);
	}
	coeffs(degree)=value;
	normalize();

}


void Polynomial::clear(){
	coeffs.clear;
	normalize();
}

bool Polynomial::isZero() const{
	return coeffs.size() ==1 && coeffs(0)==0;
}


Polynomial operator+(const Polynomial& p1, const Polynomial& p2){
	int maxSize = max(p1.getDegree(), p2.getDegree())+1;
	vector<double> result(maxSize,0);
	for (int i=0; i<maxSize; i++){
		if (i <= p1.getDegree()){
			result[i] += p1.getCoefficient(i);
		}
		if (i <= p2.getDegree()){
			result[i] += p2.getCoefficient(i);
		}
	}
	return Polynomial(result);
}


Polynomial operator-(Polynomial& p) {
	vector<double> result=p.getCoefficient();
	for (int i=0; i<result.size(); i++){
		result[i]= -1*result[i];
		}
	return Polynomial(result);
	}

}

Polynomial operator-(const Polynomial& p1, const Polynomial& p2){
	int maxSize =max(p1.getDegree(), p2.getDegree())+1;
	vector<double> result(maxSize,0);
	for (int i=0; i<maxSize; i++){
		if (i <= p1.getDegree()){
			result[i] += p1.getCoefficient(i);
			}
		if (i <= p2.getDegree()){
			result[i] -=p2.getCoefficient(i);
			}
		}
		return Polynomial(result);
	}


bool operator==(const Polynomial& p1, const Polynomial& p2){
	return p1.coeffs == p2.coeffs;
}

Polynomial operator* (const Polynomial& p1,const Polynomial& p2){
	vector<double> result(p1.coeffs().size() + p2.coeffs().size() -1,0)
	for (int i=0; i<=p1.coeffs().size(); i++){
		for (j=0; j<=p2.coeffs().size(); j++){
			result[i+j] += p1.getCoefficient()*p2.getCoefficient();
			}
		}
		return Polynomial(result);
	}


ostream& operator<<(ostream& out, const Polynomial& p){
	if (p.isZero()){
		out << "0"
		return;
	}
	bool firstterm = true;
	for (int i=p.coeffs.size()-1; i>=0; i--){
		if (p.coeffs.[i]==0){
			continue;
		out << ((!firstTerm) ? " + ":"")<<p.coeffs[i] << (i>0) ? "x^": "");


	//	if(!firstTerm)
	//		out <<" + ";
	//	out <<p.coeffs[i]

		stTerm = false;
		}
	return out;
}

istream& operator>>(istream& in, Polynomial& p){
	int degree
	cout <<"Enter Degree:";
	cin>> degree;

	if (degree <0){
		cout <<"Invalid Degree.."<<endl;
		p.clear();
		return in;
		}
	p.coeffs.clear();
	p.coeffs.resize(degree+1,0);

	for (int i=0; i<degree; i++){
		cout <<"Coefficient of x: "<< i <<endl;
		in >>p.coeffs[i];
		}
	p.normalize();
	return in;
}

#endif
