#include "Vecteur4.h"
#include "Matrice4.h"

const Vecteur4 VECT4_NULL(0.0,0.0,0.0,0.0);

///////////////////////////////////////////////////
//                                               //
//   Fonctions publiques de la classe Vecteur4   //
//                                               //
///////////////////////////////////////////////////


///Constructeur par défaut de Vecteur4
/**	@param x : coordonnée en x
 * 	@param y : coordonnée en y
 * 	@param z : coordonnée en z
 * 	@param t : coordonnée en t (pas le temps)
*/
Vecteur4::Vecteur4(double x, double y, double z, double t){
	this->initialisationVecteur4(x, y, z, t);
}

///Constructeur de copier de Vecteur4
/**	@param other : Vecteur4 à copier
*/
Vecteur4::Vecteur4(const Vecteur4 & other){
	this->copyVecteur4(other);
}

///Destructeur de Vecteur4
Vecteur4::~Vecteur4(){
	
}

///fonction d'initialisation de Vecteur4
/**	@param x : coordonnée en x
 * 	@param y : coordonnée en y
 * 	@param z : coordonnée en z
 * 	@param t : coordonnée en t (pas le temps)
*/
void Vecteur4::setVecteur4(double x, double y, double z, double t){
	this->initialisationVecteur4(x, y, z, t);
}

///fonction d'initialisation de Vecteur4
/**	@param other : Vecteur4 d'initialisation
*/
void Vecteur4::setVecteur4(const Vecteur4 & other){
	this->copyVecteur4(other);
}

///fonction qui initialise x
/**	@param x : coordonnée en x
*/
void Vecteur4::setX(double x){p_x = x;}

///fonction qui initialise y
/**	@param y : coordonnée en y
*/
void Vecteur4::setY(double y){p_y = y;}

///fonction qui initialise z
/**	@param z : coordonnée en z
*/
void Vecteur4::setZ(double z){p_z = z;}

///fonction qui initialise t
/**	@param t : coordonnée en t (pas le temps)
*/
void Vecteur4::setT(double t){p_t = t;}

///fonction qui renvoie la coordonnée en x
/**	@return coordonnée en x
*/
double Vecteur4::getX() const{return p_x;}

///fonction qui renvoie la coordonnée en y
/**	@return coordonnée en y
*/
double Vecteur4::getY() const{return p_y;}

///fonction qui renvoie la coordonnée en z
/**	@return coordonnée en z
*/
double Vecteur4::getZ() const{return p_z;}

///fonction qui renvoie la coordonnée en t
/**	@return coordonnée en t
*/
double Vecteur4::getT() const{return p_t;}

///////////////////////////////////////////////
//                                           //
//   Les opérateurs de la classe Vecteur4   //
//                                           //
///////////////////////////////////////////////


///Définition de l'opérateur = de Vecteur4
/**	@param other : Vecteur4 à copier
 * 	@return Vecteur4 copiée
*/
Vecteur4 & Vecteur4::operator = (const Vecteur4 & other){
	this->copyVecteur4(other);
	return *this;
}

///Définition de l'opérateur - de la classe Vecteur4
/**	@return -Vecteur4
*/
Vecteur4 Vecteur4::operator - (){
	Vecteur4 vect(-p_x, -p_y, -p_z, -p_t);
	return vect;
}

///Définition de l'opérateur -= de la classe Vecteur4
/**	@param other : Vecteur4
 * 	@return Vecteur4
*/
Vecteur4 & Vecteur4::operator -= (const Vecteur4 & other){
	p_x -= other.p_x;
	p_y -= other.p_y;
	p_z -= other.p_z;
	p_t -= other.p_t;
	return *this;
}

///Définition de l'opérateur += de la classe Vecteur4
/**	@param other : Vecteur4
 * 	@return Vecteur4
*/
Vecteur4 & Vecteur4::operator += (const Vecteur4 & other){
	p_x += other.p_x;
	p_y += other.p_y;
	p_z += other.p_z;
	p_t += other.p_t;
	return *this;
}

///Définition de l'opérateur *= de la classe Vecteur4
/**	@param nb : nombre
 * 	@return Vecteur4
*/
Vecteur4 & Vecteur4::operator *= (double nb){
	p_x *= nb;
	p_y *= nb;
	p_z *= nb;
	p_t *= nb;
	return *this;
}

///Définition de l'opérateur /= de la classe Vecteur4
/**	@param nb : nombre
 * 	@return Vecteur4
*/
Vecteur4 & Vecteur4::operator /= (double nb){
	p_x /= nb;
	p_y /= nb;
	p_z /= nb;
	p_t /= nb;
	return *this;
}

////////////////////////////////////////////////////
//                                                //
//   Les opérateurs amis de la classe Vecteur4   //
//                                                //
////////////////////////////////////////////////////


///Définition de l'opérateur ami == de la classe Vecteur4
/**	@param other1 : Vecteur4
 * 	@param other2 : Vecteur4
 * 	@return true si other1 et other2 sont égaux, false sinonVecteur4
*/
bool operator == (const Vecteur4 & other1, const Vecteur4 & other2){
	return (other1.p_x == other2.p_x && other1.p_y == other2.p_y && other1.p_z == other2.p_z && other1.p_t == other2.p_t);
}

///Définition de l'opérateur ami != de la classe Vecteur4
/**	@param other1 : Vecteur4
 * 	@param other2 : Vecteur4
 * 	@return false si other1 et other2 sont égaux, true sinon
*/
bool operator != (const Vecteur4 & other1, const Vecteur4 & other2){
	return (other1.p_x != other2.p_x || other1.p_y != other2.p_y || other1.p_z != other2.p_z || other1.p_t != other2.p_t);
}

///Définition de l'opérateur ami + de la classe Vecteur4
/**	@param other1 : Vecteur4
 * 	@param other2 : Vecteur4
 * 	@return Vecteur4
*/
Vecteur4 operator + (const Vecteur4 & other1, const Vecteur4 & other2){
	Vecteur4 vect(other1.p_x + other2.p_x, other1.p_y + other2.p_y, other1.p_z + other2.p_z, other1.p_t + other2.p_t);
	return vect;
}

///Définition de l'opérateur ami - de la classe Vecteur4
/**	@param other1 : Vecteur4
 * 	@param other2 : Vecteur4
 * 	@return Vecteur4
*/
Vecteur4 operator - (const Vecteur4 & other1, const Vecteur4 & other2){
	Vecteur4 vect(other1.p_x - other2.p_x, other1.p_y - other2.p_y, other1.p_z - other2.p_z, other1.p_t - other2.p_t);
	return vect;
}

///Définition de l'opérateur ami * de la classe Vecteur4
/**	@param other1 : Vecteur4
 * 	@param other2 : Vecteur4
 * 	@return Vecteur4
*/
double  operator * (const Vecteur4 & other1, const Vecteur4 & other2){
	return other1.p_x*other2.p_x + other1.p_y*other2.p_y + other1.p_z*other2.p_z + other1.p_t*other2.p_t;
}

///définition de la multiplication à gauche du Vecteur4
/**	@param other1 : Vecteur4
 * 	@param nb : nombre
 * 	@return produit de Vecteur4 et nombre
*/
Vecteur4 operator * (const Vecteur4 & other1, double nb){
	Vecteur4 vect(other1.p_x*nb, other1.p_y*nb, other1.p_z*nb, other1.p_t*nb);
	return vect;
}

///définition de la multiplication à gauche du Vecteur4
/**	@param nb : nombre
 * 	@param other1 : Vecteur4
 * 	@return produit de Vecteur4 et nombre
*/
Vecteur4 operator * (double nb, const Vecteur4 & other1){
	Vecteur4 vect(other1.p_x*nb, other1.p_y*nb, other1.p_z*nb, other1.p_t*nb);
	return vect;
}

///Définition de l'opérateur ami / de la classe Vecteur4
/**	@param other1 : Vecteur4
 * 	@param other2 : Vecteur4
 * 	@return Vecteur4
*/
Vecteur4 operator / (const Vecteur4 & other1, double nb){
	Vecteur4 vect(other1.p_x/nb, other1.p_y/nb, other1.p_z/nb, other1.p_t/nb);
	return vect;
}

///Définition de l'opérateur ami << de la classe Vecteur4
/**	@param out : sortie standart de la console (cout)
 * 	@param other : Vecteur4 à affiche dans la console
 * 	@return sortie standart de la console (cout)
*/
std::ostream & operator << (std::ostream & out, const Vecteur4 & other){
	out << "(" << other.p_x << "," << other.p_y << "," << other.p_z << "," << other.p_t << ")";
	return out;
}

///Définition de l'opérateur ami >> de la classe Vecteur4
/**	@param in : entrée standart de la console (cin)
 * 	@param other : Vecteur4 à initialiser dans la console
 * 	@return entrée standart de la console (cin)
*/
std::istream & operator >> (std::istream & in, Vecteur4 & other){
	in >> other.p_x >> other.p_y >> other.p_z >> other.p_t;
	return in;
}

/////////////////////////////////////////////////
//                                             //
//   Fonctions private de la classe Vecteur4   //
//                                             //
/////////////////////////////////////////////////


///Fonction d'initialisation de la classe Vecteur4
/**	@param x : coordonnée en x
 * 	@param y : coordonnée en y
 * 	@param z : coordonnée en z
 * 	@param t : coordonnée en t (pas le temps)
*/
void Vecteur4::initialisationVecteur4(double x, double y, double z, double t){
	p_x = x;
	p_y = y;
	p_z = z;
	p_t = t;
}

///Fonction de copie de la classe Vecteur4
/**	@param other : Vecteur4 à copier
*/
void Vecteur4::copyVecteur4(const Vecteur4 & other){
	initialisationVecteur4(other.p_x, other.p_y, other.p_z, other.p_t);
}

