TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Motcle.cpp
1/****************************************************************************
2* Copyright (c) 2023, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Motcle.h>
17#include <Noms.h>
18
19Implemente_instanciable_sans_constructeur(Motcle,"Motcle",Nom);
20Implemente_instanciable(Motcles,"Motcles",VECT(Motcle));
21
22
23/*! @brief Ecriture d'un Motcle sur un flot de sortie Utilise l'implementation de la classe Nom
24 *
25 * @param (Sortie& s) le flot de sortie a utiliser
26 * @return (Sortie&) le flot de sortie modifie
27 */
29{
30 return Nom::printOn(s);
31}
32
33
34/*! @brief Ecriture d'un tableau Motcles sur un flot de sortie
35 *
36 * @param (Sortie& s) le flot de sortie a utiliser
37 * @return (Sortie&) le flot de sortie modifie
38 */
39Sortie& Motcles::printOn(Sortie& s) const
40{
41 return VECT(Motcle)::printOn(s);
42}
43
44
45/*! @brief Lecture d'un Motcle dans un flot d'entree Utilise l'implementation de la classe Nom
46 *
47 * Passe ensuite le Nom en majuscules
48 *
49 * @param (Entree& s) le flux d'entree a utiliser
50 * @return (Entree&) le flux d'entree modifie
51 */
53{
54 Nom::readOn(s);
55 majuscule();
56 return s;
57}
58
59
60/*! @brief Constructeur par defaut Construit un Nom puis le passe en majuscule
61 *
62 */
64{
65 majuscule();
66}
67
68
69/*! @brief Construction d'un Motcle a partie d'une chaine de caracteres Construit un Nom puis le passe en majuscules
70 *
71 * @param (const char* nom) la chaine de caracteres du Motcle
72 */
73Motcle::Motcle(const char* const nom) : Nom(nom)
74{
75 majuscule();
76}
77
78Motcle::Motcle(const std::string& nom) : Nom(nom)
79{
80 majuscule();
81}
82
83Motcle::Motcle(const Nom& nom) : Nom(nom)
84{
85 majuscule();
86}
87
88/*! @brief Construction d'un Motcle par copie
89 *
90 * @param (const Motcle& nom) le Motcle a copier
91 */
92Motcle::Motcle(const Motcle& nom) : Nom(nom)
93{
94}
95
96/*! @brief Construction a partir d'une chaine de caracteres Utilise l'implementation de la classe Nom
97 *
98 * @param (const char* const mot) la chaine de caracteres du mot a construire
99 * @return (Motcle&) reference sur le Motcle cree
100 */
101Motcle& Motcle::operator=(const char* const mot)
102{
103 Nom::operator=(mot);
104 majuscule();
105 return *this;
106}
107
109{
110 Nom::operator=(mot);
111 majuscule();
112 return *this;
113}
114
115/*! @brief Construction par copie Utilise l'implementation de la classe Nom
116 *
117 * @param (const Motcle& mot) le Motcle a copier
118 * @return (Motcle&) reference sur le Motcle modifie
119 */
121{
122 Nom::operator=(mot);
123 return *this;
124}
125
126/*! @brief Lecture d'un tableau Motcles sur un flot d'entree
127 *
128 * @param (Entree& s) le flux d'entree a utiliser
129 * @return (Entree&) le flux d'entree modifie
130 */
131Entree& Motcles::readOn(Entree& s)
132{
133 return VECT(Motcle)::readOn(s);
134}
135
136
137/*! @brief Autotest de la classe Motcle Effectue des affectations de controle
138 *
139 * Retourne toujours 1
140 *
141 * @return (int) code de retour; retourne toujours 1
142 */
144{
145 Nom un_nom;
146 Motcle un_motcle("PasOk");
147 Motcle un_autre(un_nom);
148 un_nom="Ok";
149 un_motcle=un_nom;
150 un_motcle="Ok";
151 un_motcle=un_autre;
152 return 1;
153}
154
155
156
157/*! @brief Constructeur Cree un tableau de i elements
158 *
159 * @param (int i) nombre de mots cles
160 */
162 VECT(Motcle)(i)
163{
164}
165
166// "a" == "a|b" returns 0
167// "b" == "a|b" returns 0
168// "a|b" == "a|c" return 0
169static inline int strcmp_uppercase(const char *n1, const char *n2)
170{
171 // loop on n1
172 unsigned char c1,c2;
173 int i=0;
174 int length_i=0;
175 do
176 {
177 c1 = (unsigned char) ::toupper(n1[i]);
178 i++;
179 length_i++;
180 if (c1==0 || c1==124) // Keyword found in n1
181 {
182 // loop on c2
183 int j=0;
184 int length_j=0;
185 do
186 {
187 c2 = (unsigned char) ::toupper(n2[j]);
188 j++;
189 length_j++;
190 if (c2==0 || c2==124) // Keyword found in n2
191 {
192 if (length_i==length_j)
193 {
194 // Same length, we compare each caracter:
195 int l=length_i;
196 int delta=0;
197 unsigned char C1,C2;
198 do
199 {
200 C1 = (unsigned char) ::toupper(n1[i-l]);
201 C2 = (unsigned char) ::toupper(n2[j-l]);
202 delta = C2 - C1;
203 l--;
204 }
205 while (l>1 && delta==0);
206 if (delta==0)
207 return 0; // Found the same keyword
208 }
209 length_j=0;
210 }
211 }
212 while(c2!=0); // End of n2
213 length_i=0;
214 }
215 }
216 while (c1!=0); // End of n1
217 return 1;
218}
219
220/*! @brief Comparaison d'un mot cle avec une chaine de caracteres
221 *
222 * @param (const Motcle& un_mot) le mot cle a utiliser pour la comparaison
223 * @param (const char* const nom) la chaine de caractere avec laquelle comparer le mot cle
224 * @return (int) 1 si le Nom du mot est egal a la chaine
225 */
226int operator ==(const Motcle& nom, const Motcle& un_mot)
227{
228 const int resu = strcmp_uppercase((const char *) nom, (const char *)un_mot);
229 return (resu == 0);
230}
231
232int operator ==(const Motcle& un_mot, const char* const nom)
233{
234 const int resu = strcmp_uppercase((const char *)un_mot, nom);
235 return (resu == 0);
236}
237
238int operator ==(const char* const nom, const Motcle& un_mot)
239{
240 return (un_mot == nom);
241}
242
243int operator ==(const Motcle& un_mot, const Nom& nom)
244{
245 const int resu = strcmp_uppercase((const char *)un_mot, (const char *) nom);
246 return (resu == 0);
247}
248
249int operator ==(const Nom& nom, const Motcle& un_mot)
250{
251 return (un_mot == nom);
252}
253
254/*! @brief Comparaison d'un mot cle avec une chaine de caracteres
255 *
256 * @param (const Motcle& un_mot) le mot cle a utiliser pour la comparaison
257 * @param (const char* const nom) la chaine de caractere avec laquelle comparer le mot cle
258 * @return (int) 1 si le Nom du mot est different de la chaine
259 */
260int operator !=(const Motcle& nom, const Motcle& un_mot)
261{
262 return ! (nom == un_mot);
263}
264
265int operator !=(const Motcle& un_mot, const char* const nom)
266{
267 return ! (un_mot == nom);
268}
269
270int operator !=(const char* const nom, const Motcle& un_mot)
271{
272 return ! (nom == un_mot);
273}
274
275int operator !=(const Motcle& un_mot, const Nom& nom)
276{
277 return ! (un_mot == nom);
278}
279
280int operator !=(const Nom& nom, const Motcle& un_mot)
281{
282 return ! (nom == un_mot);
283}
284
285Motcle& Motcle::operator+=(const char * const mot)
286{
287 Nom::operator+=(mot);
288 majuscule();
289 return *this;
290}
291
292Motcles noms_to_motcles(const Noms& a)
293{
294 int n = a.size();
295
296 Motcles b(n);
297 for (int i = 0; i < n; i++)
298 b[i] = a[i]; // ouais, ecriture bizarre mais la plus efficace...
299 return b;
300}
301
302int Motcle::finit_par(const char* const mot) const
303{
304 Motcle mm(mot);
305 return Nom::finit_par(mm);
306}
307
308
309int Motcle::debute_par(const char* const mot) const
310{
311 Motcle mm(mot);
312 return Nom::debute_par(mm);
313}
314
315int Motcle::find(const char* const mot) const
316{
317 Motcle mm(mot);
318 return Nom::find(mm);
319}
320
321int Motcles::search(const Motcle& t ) const
322{
323 assert(size()>=0);
324 int i=size();
325 while(i--)
326 if (operator[](i)==t)
327 {
328 return i;
329 }
330 return -1;
331}
332
333int Motcles::contient_(const char* const ch) const
334{
335 return (rang(ch)!=-1);
336}
337/* Returns the VECT position number of a string (-1 if not found) */
338int Motcles::rang(const char* const ch) const
339{
340 Nom nom(ch);
341 assert(size()>=0);
342 int i=size();
343 while(i--)
344 if (operator[](i)==nom)
345 {
346 return i;
347 }
348 return -1;
349}
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
int selftest()
Autotest de la classe Motcle Effectue des affectations de controle.
Definition Motcle.cpp:143
int finit_par(const char *const n) const override
Definition Motcle.cpp:302
Motcle()
Constructeur par defaut Construit un Nom puis le passe en majuscule.
Definition Motcle.cpp:63
Motcle & operator+=(const char *const)
Definition Motcle.cpp:285
Motcle & operator=(const Motcle &)
Construction par copie Utilise l'implementation de la classe Nom.
Definition Motcle.cpp:120
int debute_par(const char *const n) const override
Definition Motcle.cpp:309
int find(const char *const n) const override
Definition Motcle.cpp:315
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
int rang(const char *const ch) const
Definition Motcle.cpp:338
int contient_(const char *const ch) const
Definition Motcle.cpp:333
Motcles(int)
Constructeur Cree un tableau de i elements.
Definition Motcle.cpp:161
int search(const Motcle &t) const
Definition Motcle.cpp:321
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Nom()
Constructeur par defaut.
Definition Nom.cpp:63
virtual int finit_par(const char *const n) const
Definition Nom.cpp:324
Nom & operator=(const char *const)
Copie la chaine nom.
Definition Nom.cpp:201
virtual int debute_par(const char *const n) const
Definition Nom.cpp:319
virtual int find(const char *const n) const
Definition Nom.cpp:314
Nom & operator+=(const Nom &x)
Concatenation avec un Nom.
Definition Nom.cpp:223
Nom & majuscule()
Transforme le nom en majuscules Seules les lettres 'a'-'z' sont modifiees.
Definition Nom.cpp:180
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Classe de base des flux de sortie.
Definition Sortie.h:52