Page d'accueil Description du projet
/******************************************
 *
 *   Cedric Pradalier   2001
 *   mail : http://cedric.pradalier.free.fr/mail.html
 *
 *****************************************/



#ifndef LIGNES_H
#define LIGNES_H

class CLignes;
/* Le type Sens Trajet : aller retour ou erreur */
typedef enum {s_aller = 0,s_retour=1,nonsens=99} SensTrajet;

#include <stddef.h>
#include "ensemble.h"
#include "objet.h"
#include "bdlignes.h"
#include "arrets.h"
#include "bdarrets.h"
#include "tablehoraire.h"
#include "corresp.h"
#include "date.h"

/****************************************************

  Classe implementant la representation machine des 
  lignes de transport :
  + Liste des arrets
  + horaires de passage (un seul est charge a la fois)

  La fonction a retenir est la fonction de calcul des
  horaires de passage a un arret depart sachant qu'on veut
  etre a l'arrivee avant une limite donnee

****************************************************/
  
class CLignes : public CObjet
{
public:
    char * mName;
    char * mRep;
    int mId,nArrets[2];
    CArrets**  tArrets[2];
    CTableHoraire horaires[2];
    CEnsemble ArretsUniques;
    /* les donnees suivantes permettent de calculer
       une fois pour toute les arrets de reference
       entre lesquels est situe un arret, et les 
       donnees d'interpolation necessaire : 
       Cette variable est partage avec les horaires
       mais sa creation et sa destruction sont la tache
       de la ligne.
     */
    InterPol * DonneesInterpol[2];

    CLignes() 
        {
            mRep = NULL;
            mName = NULL;
            tArrets[s_aller]=NULL;
            tArrets[s_retour]=NULL;
            DonneesInterpol[s_aller] = NULL;
            DonneesInterpol[s_retour] = NULL;
            mId=0;
            nArrets[s_aller]=nArrets[s_retour]=0;
        }
    /* Creation d'une ligne par son nom et son Id */
    CLignes(char * rep,char * name,int i);
    virtual ~CLignes();

    /* Nombre d'arrets sur le trajet , sens s */
    int GetNbArret(SensTrajet s) {return nArrets[s];}
    /* Retourne le i-ieme arret dans le sens s (premier <=> i=0) */
    CArrets * GetArretAt(SensTrajet s,int i) {return tArrets[s][i];}
    /* Retourne l'indice d'un arret sur un sens donne
       -1 si l'arret n'appartient pas a la ligne */
    int Indice(SensTrajet s,CArrets * arret);
    /* Teste si un arret appartient a la ligne */
    bool IsKnown(CArrets * arret);
    /* Test si on peut aller de l'arret From a l'arret Dest 
       sans changement */
    bool IsAccessible(CArrets * From,CArrets * Dest);
    
    
    /* Lit toutes les donnees relatives a la ligne
       dans des fichiers suivant les regles definies 
       dans doc/Regles */
    int Read(CBDArrets * Liste);

    /* Determine l'ensemble des arrets en sens unique 
       La liste des arrets dans les deux sens doit avoir ete
       lue auparavent */
    void FindSensUnique();

    /* Test si un arret n'est desservi que dans un seul sens
       par cette ligne -- Utilisation de l'ensemble des arrets 
       en sens unique */
    bool IsUnique(CArrets * arret);
    

    
    /* Reunit toutes les donnees necessaires aux interpolation */   
    void UpdateInterpol();
    
    /* Affichage standard */
    virtual void Print();
    /* Affichage retreint pour pouvoir completer 
       le fichier "arret" */
    void PrintMin();

    /* Renvoie le type horaire correspondant a une date D */
    TypeHoraire FindTypeHoraire(CDate D);
    /* Charge les horaires correspondant a un type */
    virtual void LoadHoraires(TypeHoraire t,CBDArrets * liste);

    /* Trouve la direction du trajet entre 2 arrets */
    SensTrajet FindDirection(CArrets * depart,CArrets * arrivee);
    /* Fonction d'evaluation de l'horaire de passage en A
       Sachant qu'on veut etre en B avant Limite */
    virtual CHoraire Passage(CArrets * depart,CArrets * arrivee,CHoraire & limite);
    
    /* Quelles sont les lignes accessibles a partir de cette ligne */
    /* L'arret contenu dans OuOnest n'est pas traite */
    void LignesAccessibles(CEnsemble * E,CBDLignes * pBD,CCorresp * OuOnEst);
    

};


#endif // LIGNES_H