/******************************************
*
* 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