/**
*
* @File : exo_01.cxx
*
* @Authors : M. Laporte
*            D. Mathieu
*
* @Date : 26/02/2001
*
* @Version : V1.0
*
* @Synopsis : Essai de CEtudiant
*
**/

#include <iostream>
#include <fstream>
#include <string>
#include <exception>
#include <vector>
#include <algorithm>

using namespace std;

// Question 1

namespace nsWorking
{
    class CEtudiant
    {
        string         m_Nom;
        unsigned short m_Age;
        char           m_Groupe;
     
      public :
        CEtudiant (const string & Nom = "", const unsigned int Age = 0,
                   const char Groupe  = ' ') throw ();

        // ligne suivante ajouté pour la question 3 // Suite question 3

        bool operator < (const CEtudiant & Etudiant) const throw ();

        friend istream & operator >> (istream & is, CEtudiant & Etudiant)
                                             throw ();
        friend ostream & operator << (ostream & os, const CEtudiant & Etudiant)
                                             throw ();
       
    }; // CEtudiant

} // nsWorking

// Question 2

#define ETUD nsWorking::CEtudiant

inline ETUD::CEtudiant(const string & Nom = "", const unsigned int Age = 0,
                       const char Groupe  = ' ') throw ()
    : m_Nom (Nom), m_Age (Age), m_Groupe (Groupe) {}

// Suite question 3

inline bool ETUD::operator < (const CEtudiant & Etudiant) const throw ()
{
    return m_Nom < Etudiant.m_Nom;

} // operator <

istream & nsWorking::operator >> (istream & is, CEtudiant & Etudiant)
                                             throw ()
{
    char c;
    getline (is, Etudiant.m_Nom);
    is >> Etudiant.m_Age;
    is >> Etudiant.m_Groupe;
    is.get (c);
    is.get (c);
    return is;

} // operator >>

ostream & nsWorking::operator << (ostream & os, const CEtudiant & Etudiant)
                                             throw ()
{
    return os << "Nom : " << Etudiant.m_Nom << " Age : " << Etudiant.m_Age
              << " Groupe : " << Etudiant.m_Groupe;

} // operator <<

using namespace nsWorking;

// Question 4

namespace
{
    void Exo_01 (void)
    {
        typedef vector <CEtudiant> CVEtud;
        CVEtud VectEtud;

        ifstream is ("Donnee");
        ofstream os ("Resultat");

        for (CEtudiant Etudiant; is >> Etudiant; )
            VectEtud.push_back (Etudiant);

        sort (VectEtud.begin (), VectEtud.end ());

        for (CVEtud::iterator i = VectEtud.begin ();
             i < VectEtud.end (); ++i) os << *i << endl;

    } // Exo_01()

} // namespace anonyme

int main (void)
{
    enum {CstNoError = 0, CstException = 254, CstExcInconnue = 255,  };
    try
    {
        Exo_01 ();
        return 0;
    }
    catch (const exception & Exc)
    {
        cerr << "exception : " << Exc.what () << endl;
        return CstException;
    }
    catch (...)
    {
        cerr << "Exception inconnue " << endl;
        return CstExcInconnue;
    }
   
} // main()