summaryrefslogtreecommitdiff
path: root/src/main/Parser.h
blob: 12ff5a580088ac20b4c73990de8663df9f2922ce (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
/*
 * Parser.h
 *
 *  Created on: 11 mai 2011
 *      Author: christian
 */
#ifndef PARSER_H_
#define PARSER_H_

#include <iostream>
#include <string>
#include <fstream>
#include <math.h>
#include "Vector3D.h"
#include "Accelerator.h"
#include "Dipole.h"
#include "FODO.h"
#include "Quadrupole.h"
#include "StraightElement.h"
#include "Particle.h"
#include "exceptions.h"

using namespace std;

typedef string tag;

namespace vhc {

/** Classe permettant l'extraction d'un Accelerator depuis un fichier .xml.
 * Cette classe contient une méthode <code>extract()<\code> chargée de créer et renvoyer un pointeur
 * 	sur l'accélérateur contenu dans le .xml. <b>ATTENTION<\b>: cette méthode est une "factory method",
 * 	donc il faut soi-même ajouter les <code>delete<\code> après appel à <code>extract()<\code> !
 * 	Sont à supprimer : les pointeurs sur chaque Particle, Element ou Accelerateur contenu dans le .xml
 */

class Parser {
public:

	/** Constructeur d'un Parseur.
	 * @param file chemin d'accès du fichier à lire */
	inline Parser(std::string file)
	: nameOfFile(file)
	{}

	/**Destructeur virtuel. */
	inline virtual ~Parser() {}

	/** Méthode chargée de lire le fichier .xml (lance une exception si le fichier n'est pas valide),
	 * de créer et renvoyer un accélérateur par appel de fonction privées.
	 * @return Accelerator construit avec les données récoltées dans le fichier .xml */
	Accelerator* extract();

protected:

	/** Contient le chemin d'accès du fichier à lire. */
	string nameOfFile;

private:

//===========================================balises ouvrantes==========================================================================

	/** Balises ouvrantes d'un système.
	 * On ne peut pas y spécifier des constantes, car elle font partie d'un namespace. */
	static tag system;
	static tag accelerator;
	static tag comment;

	/** Balises ouvrantes d'une particule. */
	static tag particle;
	static tag position;
	static tag mass;
	static tag charge;
	static tag energy;
	static tag direction;

	/** Balises ouvrantes d'un Element. */
	static tag entryPos;
	static tag exitPos;
	static tag sectionRadius;

	/** Balises ouvrantes d'un dipole. */
	static tag dipole;
	static tag curvature;
	static tag magneticField;

	/** Balise ouvrantes commune aux quadrupoles et aux fodo. */
	static tag focCoeff;

	/** Balises ouvrantes d'une FODO. */
	static tag fodo;
	static tag straightLength;

	/** Balises ouvrante d'un quadrupole. */
	static tag quadrupole;

	/** Balises ouvrantes d'une straightElement. */
	static tag straightElement;

//===================================================balises fermantes==================================================================

	/** Balises fermantes d'un système. */
	static tag systemCl;
	static tag acceleratorCl;
	static tag commentCl;

	/** Balises fermantes d'une Particle. */
	static tag particleCl;
	static tag positionCl;
	static tag massCl;
	static tag chargeCl;
	static tag energyCl;
	static tag directionCl;

	/** Balises fermantes d'un Element. */
	static tag entryPosCl;
	static tag exitPosCl;
	static tag sectionRadiusCl;

	/** Balises fermantes d'un dipole. */
	static tag dipoleCl;
	static tag curvatureCl;
	static tag magneticFieldCl;

	/** Balise fermantes commune aux quadrupoles et aux fodo. */
	static tag focCoeffCl;

	/** Balises fermantes d'une FODO. */
	static tag fodoCl;
	static tag straightLengthCl;

	/** Balises fermantes d'un quadrupole. */
	static tag quadrupoleCl;

	/** Balises fermantes d'une straightElement. */
	static tag straightElementCl;

//=============================================================méthodes=================================================================

	/** Lit le fichier .xml.
	 * 	@param file fichier à lire
	 *  @param acc référence sur un Accelerator déjà construit */
	void readFile(ifstream& file, Accelerator& acc);

		/** Lit la balise system. Cette méthode appelle readConstants et buildAccelerator.
		 * 	@param file fichier à lire
		 *	@param acc référence sur un Accelerator déjà construit */
		void readSystem(ifstream& file, Accelerator& acc);

			/** Ajoute les différents éléments et particules du fichier dans l'Accelerator passé en argument.
			 * 	@param file fichier à lire
			 *  @param acc référence sur un Accelerator déjà construit */
			void buildAccelerator(ifstream& file, Accelerator const& acc);

				/** Construction d'une nouvelle Particle.
				 * 	@param file fichier à lire
				 * @return Particle créée avec les valeurs récoltées dans le fichier .xml */
				Particle* buildParticle(ifstream& file);

				/** Construction d'une nouvelle FODO.
				 * 	@param file fichier à lire
				 * @return FODO créée avec les valeurs récoltées dans le fichier .xml */
				FODO* buildFODO(ifstream& file);

				/** Construction d'un nouveau Dipole.
				 * 	@param file fichier à lire
				 * @return Dipole créé avec les valeurs récoltées dans le fichier .xml */
				Dipole* buildDipole(ifstream& file);

				/** Construction d'un nouveau quadrupole.
				 * 	@param file fichier à lire
				 * @return Quadrupole créé avec les valeurs récoltées dans le fichier .xml	*/
				Quadrupole* buildQuadrupole(ifstream& file);

				/** Construction d'un nouveau StraightElement.
				 * 	@param file fichier à lire
				 * @return StraightElement créé avec les valeurs récoltées dans le fichier .xml */
				StraightElement* buildStraightElement(ifstream& file);

	/** Lit un double.
	 * 	@param file fichier à lire */
	double readOneDouble(ifstream& file);
	/** Saute une virgule.
	 * 	@param file fichier à lire*/
	void readComma(ifstream& file);

	/** Lit un Vector3D.
	 * 	@param file fichier à lire*/
	Vector3D readVector3D(ifstream& file);
	/** Lit ue balise.
	 * 	@param file fichier à lire*/
	tag readOneTag(ifstream& file);
	/** Cherche et lit une balise fermante contenant à la chaîne de caractère passée en argument.
	 * @param file fichier à lire
	 * @param ta contenu de la balise à trouver */
	void closingTag(ifstream& file, std::string ta);
	/** Cherche et lit une balise fermante d'un commentaire.
	 * 	@param file fichier à lire*/
	void jumpComment(ifstream& file);

};

}

#endif /* PARSER_H_ */