#ifndef ___Vecteur4_H__
#define ___Vecteur4_H__

#include <iostream>

class Matrice4;

/** @brief Classe qui permet de gérer un vecteur à 4 dimensions (pas un évenement, c'est pour OpenGl 3.1)
*/


class Vecteur4{
	public:
		Vecteur4(double x = 0.0, double y = 0.0, double z = 0.0, double t = 0.0);
		Vecteur4(const Vecteur4 & other);
		virtual ~Vecteur4();
		
		void setVecteur4(double x, double y, double z, double t);
		void setVecteur4(const Vecteur4 & other);
		
		void setX(double x);
		void setY(double y);
		void setZ(double z);
		void setT(double t);
		
		double getX() const;
		double getY() const;
		double getZ() const;
		double getT() const;

		//Les opérateurs de la classe Vecteur4
		Vecteur4 & operator = (const Vecteur4 & other);
		Vecteur4 operator - ();
		Vecteur4 & operator -= (const Vecteur4 & other);
		Vecteur4 & operator += (const Vecteur4 & other);
		Vecteur4 & operator *= (double nb);
		Vecteur4 & operator /= (double nb);

		//Les opérateurs amis de la classe Vecteur4
		friend bool operator == (const Vecteur4 & other1, const Vecteur4 & other2);
		friend bool operator != (const Vecteur4 & other1, const Vecteur4 & other2);
		friend Vecteur4 operator + (const Vecteur4 & other1, const Vecteur4 & other2);
		friend Vecteur4 operator - (const Vecteur4 & other1, const Vecteur4 & other2);
		friend double operator * (const Vecteur4 & other1, const Vecteur4 & other2);
		friend Vecteur4 operator * (const Vecteur4 & other1, double nb);
		friend Vecteur4 operator * (double nb, const Vecteur4 & other1);
		friend Vecteur4 operator / (const Vecteur4 & other1, double nb);
		friend std::ostream & operator << (std::ostream & out, const Vecteur4 & other);
		friend std::istream & operator >> (std::istream & in, Vecteur4 & other);
	private:
		void initialisationVecteur4(double x, double y, double z, double t);
		void copyVecteur4(const Vecteur4 & other);
		
		double p_x;
		double p_y;
		double p_z;
		double p_t;
};

///definition d'un Vecteur NULL
extern const Vecteur4 VECT4_NULL;

#endif //classe Vecteur4

