//  Objectif : Définir une classe Date (très, très simplifiée).
//
//  Principe :
//	Une date est définie par un jour, un mois et une année et :
//	- opérations de comparaison

#include <iostream>
using namespace std;

// Définition d'une date.
//
class Date  {
public:

// constructeurs

    Date(short jj, short mm, int aa); 
	// construire une date à partir d'un jour jj, d'un mois mm et
	// d'une année aa.

// destructeur

    ~Date();
	// Destructeur.
	//
	// Dans le cas présent, le définir n'était pas nécessaire.
	// ... sauf pour tracer les destructions de date !

// Requêtes : information sur l'objet (ou la classe)

    short jour() const;
	// le jour de la date

    short mois() const;
	// le mois de la date

    int annee() const;
	// l'année de la date

// Commandes : services rendus par l'objet

    void  set(short jj, short mm, int aa);
	// mettre à jour la date à partir d'un jour jj, d'un mois
	// mm et d'une année aa.

    void afficher(ostream & out = cout) const;
	// afficher une date sur le flôt de sortie out

// Opérations de comparaison entre les dates (définies comme
// fonctions membres)

    bool lt(const Date &d2) const;		// *this <  d2
	// est-ce que la date est strictement antérieure à la date d2

// Opération de comparaison lt définie comme fonction de classe
    
    static bool lt(const Date & d1, const Date & d2);

    bool ge(const Date &d2) const;		// *this >= d2
	// est-ce que la date est postérieure à la date d2

    bool gt(const Date &d2) const;		// *this >  d2
	// est-ce que la date est strictement postérieure à la date d2

    bool le(const Date &d2) const;		// *this <= d2
    bool eq(const Date &d2) const;		// *this == d2
    bool neq(const Date &d2) const;		// *this != d2

	bool operator<(const Date & d2) const;
	bool operator>(const Date & d2) const;
	bool operator<=(const Date & d2) const;
	bool operator>=(const Date & d2) const;
	bool operator==(const Date & d2) const;
	bool operator!=(const Date & d2) const;


private:

    // Nous définissons ici les attributs qui correspondent à
    // l'état d'un objet Date

    short _jour;	// le numéro du jour dans le mois
    short _mois;	// le numéro du mois dans l'année
    int _annee;	// le numéro de l'année
};

// Opération de comparaison lt définie en dehors de la classe
bool lt(const Date & d1, const Date & d2);
ostream& operator<<(ostream & out, const Date & d2);