18#include <Synonyme_info.h>
37int * Type_info::types_homonymes=0;
39int Type_info::nb_classes=0;
40int Type_info::les_types_memsize=0;
44static inline int strcmp_uppercase(
const char *n1,
const char *n2)
51 c1 = (
unsigned char) ::toupper(n1[i]);
52 c2 = (
unsigned char) ::toupper(n2[i]);
56 while ((delta == 0) && (c1 != 0) && (c2 != 0));
66 int existe_deja = search_type_info_name(
name(), index);
69 for (
int i = index; i<nb_classes-1; i++)
71 les_types[i] = les_types[i+1];
72 types_homonymes[i] = types_homonymes[i+1];
85 if ((nb_classes==0)&& (les_types_memsize!=0))
88 delete [] types_homonymes;
102int Type_info::search_type_info_name(
const char *nom,
int& index)
107 int imax = nb_classes;
111 int milieu = (imin + imax) / 2;
112 int comparaison = strcmp_uppercase(nom, les_types[milieu]->
name());
113 if (comparaison == 0)
144 synonym_name_((
Nom*) 0),
151 Cerr <<
"Type_info::Type_info(const char* nom,Objet_U* (*f)()...)\n";
152 Cerr <<
" Error : name == 0" << finl;
175 synonym_name_((
Nom*) 0),
182 Cerr <<
"Type_info::Type_info(const char* nom,Objet_U* (*f)()...)\n";
183 Cerr <<
" Error : name == 0" << finl;
195void Type_info::ajouter_type(
const Type_info& type_info)
206 c = type_info.names_[i];
210 if (synonym_found==1)
212 Cerr <<
"More than 1 synonym found in " << type_info.names_ << finl;
213 Cerr <<
"Not supported yet !" << finl;
220 c = type_info.names_[i];
223 Cerr <<
"Error in a classname which can't finished by | : " << type_info.names_ << finl;
242 synonym_name_ =
new Nom(B);
243 synonym_ =
new Synonyme_info(synonym_name_->getChar(),name_->getChar());
246 if (les_types_memsize <= nb_classes + 1)
248 static const int INCREMENT = 512;
250 les_types_memsize += INCREMENT;
252 for (
int j = 0; j < nb_classes; j++)
253 nouveau[j] = les_types[j];
257 int * temp =
new int[les_types_memsize];
258 for (
int j = 0; j < nb_classes; j++)
259 temp[j] = types_homonymes[j];
260 delete[] types_homonymes;
261 types_homonymes = temp;
268 Cerr<<
" class "<<type_info.
name()<<
" already exists as a synonym which is forbidden!!!!"<<finl;
272 existe_deja = search_type_info_name(type_info.
name(), index);
275 types_homonymes[index] = 1;
278 if (strcmp(string_macro_trio(
"VECT",titi),
"VECT"))
280 if (strncmp(type_info.
name(),
"Iterateur_",10))
282 Cerr<<
" type "<<type_info.
name()<<
" is in double and it is not allowed!!!!"<<finl;
290 for (
int j = nb_classes; j > index; j--)
292 les_types[j] = les_types[j-1];
293 types_homonymes[j] = types_homonymes[j-1];
295 les_types[index] = &type_info;
296 types_homonymes[index] = 0;
310 os << b[i]->name() <<
" ";
321 os <<
"There is " << nb_classes <<
" classes:" << finl;
325 os << les_types[i]->name() <<
" inherits from ";
326 les_types[i]->bases(os);
356 if (cree_instance == 0)
358 Cerr <<
"Error in Type_info::instance()\n";
359 Cerr <<
" The type " <<
name() <<
" is not instantiable" << finl;
363 Objet_U * ainstance = (*cree_instance)();
414 for (
int i = 0; i < nb_bases_; i++)
420 for (
int i = 0; i < nb_bases_; i++)
421 if (b[i]->
has_base(p, direct))
return 1;
452 int resultat =
has_base(type, direct);
463 return strcmp(
name(),other_name)==0;
485 const Nom& nom_mere = mere.
name();
489 if( les_types[i]->
has_base(nom_mere, 0) )
490 if (!les_types[i]->
same(nom_mere))
496 if(compteur==0)
return 0;
502 if( les_types[i]->
has_base(nom_mere, 0) )
503 if (!les_types[i]->
same(nom_mere))
522 Cerr << type <<
"is not a type recognized by TRUST Unitaire " << finl;
529 if( les_types[i]->
same(type) )
550 if (search_type_info_name(type_name, index))
552 if (types_homonymes[index] == 0)
554 type_info = les_types[index];
560 Cerr <<
"const Type_info * Type_info::type_info_from_name(const char * type_name)\n";
561 Cerr <<
" The type " << type_name <<
" has several homonymous\n";
562 Cerr <<
" We doing as if the type is unknown..." << finl;
574 return (cree_instance != 0);
class Nom Une chaine de caractere pour nommer les objets de TRUST
Un tableau de chaine de caracteres (VECT(Nom)).
classe Objet_U Cette classe est la classe de base des Objets de TRUST
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
static int est_un_synonyme(const char *)
Test d'existence d'une classe du synonyme indique si il existe une classe T dont le Synonyme_info a.
modelise une information de type pour les Objet_U
int instanciable() const
Renvoie 1 si le type associe est instanciable (cree_instance non nul) renvoie 0 sinon.
static int les_sous_types(const Nom &, Noms &sous_types)
Donne les noms des sous-types, un type mere etant donne par son nom.
Type_info(const char *name, Objet_U *(*f)(), int nb_bases=0, const Type_info **bases=0)
Constructeur par un nom, une fonction et un tableau de meres.
Objet_U * instance() const
Cree une instance de la classe associee au type_info.
int has_base(const Type_info *p, int direct=0) const
Test d'appartenance d'un type dans les types de bases du type considere si direct == 0.
int same(const Type_info *p) const
Renvoie 1 si this==p, 0 sinon.
static int est_un_type(const char *)
Test d'existence d'une classe du type indique si il existe une classe T dont le Type_info a.
static Sortie & hierarchie(Sortie &)
Ecriture de toute la hierarchie du type considere sur un flix de sortie.
static const Type_info * type_info_from_name(const char *type_name)
Methode statique qui renvoie un pointeur vers le Type_info dont le nom est "type_name".
Sortie & bases(Sortie &) const
Ecriture des bases du type considere sur un flot de sortie.