TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Type_info.h
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#ifndef Type_info_included
17#define Type_info_included
18class Objet_U;
19class Nom;
20class Noms;
21class Sortie;
22class Synonyme_info;
23
24
25/*! @brief modelise une information de type pour les Objet_U
26 *
27 * @sa Objet_U Nom
28 */
30{
31public:
32 ~Type_info();
33 Type_info(const char* name, Objet_U* (*f)(), int nb_bases=0, const Type_info** bases=0);
34 Type_info(const char* name, int nb_bases=0, const Type_info** bases=0);
35
36 inline const Nom& name() const
37 {
38 return *name_;
39 };
40 inline int can_cast(const Type_info* p) const;
41
42 int same(const Type_info* p) const;
43 int same(const Nom&) const;
44 int has_base(const Type_info* p, int direct=0) const;
45 int has_base(const Nom& , int direct=0) const;
46 Sortie& bases(Sortie&) const;
47 Objet_U* instance() const;
48 int instanciable() const;
49
50 // Methodes statiques :
51 static Sortie& hierarchie(Sortie&) ;
52 static int est_un_type(const char*) ;
53 static int les_sous_types(const Nom&, Noms& sous_types);
54 static int les_sous_types(const Type_info&, Noms& sous_types);
55 static const Type_info * type_info_from_name(const char * type_name);
56 static Objet_U* instance(const char* typ);
57
58protected:
59
60private:
61 Type_info(Type_info&) {}; // Constructeur par copie invalide
62 Type_info& operator=(Type_info&); // Operateur= invalide
63 void ajouter_type(const Type_info& type_info);
64 static int search_type_info_name(const char *nom, int& index);
65
66 // Possible names (eg: A|B)
67 const char* names_ = "rien";
68 // Name and its synonym
69 mutable Nom * name_ = nullptr; // (eg: A)
70 mutable Nom * synonym_name_ = nullptr; // (eg: B)
71 // Object synonym:
72 Synonyme_info* synonym_= nullptr; // Synonym
73
74 // Nombre de classes de base de cette classe
75 int nb_bases_ = -1;
76 // Liste des Type_info des classes de base de cette classe
77 const Type_info** b= nullptr;
78 // Pointeur vers la methode statique "cree_instance" de la classe
79 // (nul si la classe n'est pas instanciable)
80 Objet_U* (*cree_instance)()= nullptr;
81
82 // Liste des Type_info des classes declarees par declare_base/declare_instanciable
83 // La liste est triee par ordre alphabetique (minuscules/majuscules indifferentes)
84 static const Type_info** les_types;
85 // Pour chaque type enregistre dans "les_types", s'il existe plusieurs classes
86 // ayant le meme "nom", alors types_homonymes != 0.
87 static int * types_homonymes;
88 // Nombre de classes enregistrees dans "les_types" et "types_homonymes"
89 static int nb_classes;
90 // Taille memoire du tableau "les_types" et "types_homonymes"
91 // (tableau redimensionne par blocs)
92 static int les_types_memsize;
93};
94
95/*! @brief Exploration de la hierarchie des types retourne 1 si p pointe sur un sous type du type considere
96 *
97 * @param (const Type_info* p) pointeur sur le type a tester
98 * @return (int) 1 si p pointe sur un sous type du type considere, 0 sinon
99 */
100inline int Type_info::can_cast(const Type_info* p) const
101{
102 return ( (same(p)) || (p->has_base(this)) );
103}
104
105#endif
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
Classe de base des flux de sortie.
Definition Sortie.h:52
modelise une information de synonyme pour les Objet_U
modelise une information de type pour les Objet_U
Definition Type_info.h:30
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 can_cast(const Type_info *p) const
Exploration de la hierarchie des types retourne 1 si p pointe sur un sous type du type considere.
Definition Type_info.h:100
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.
const Nom & name() const
Definition Type_info.h:36