TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Objet_U_ptr.cpp
1/****************************************************************************
2* Copyright (c) 2026, 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 <Synonyme_info.h>
17#include <Objet_U_ptr.h>
18#include <Memoire.h>
19#include <Nom.h>
20
21Implemente_base_sans_constructeur_ni_destructeur(Objet_U_ptr,"Objet_U_ptr",Objet_U);
22
24{
25 const Objet_U * objet = get_Objet_U_ptr();
26 if (objet)
27 {
28 os << objet->le_type() << finl;
29 os << (*objet);
30 }
31 else os << "vide" << finl;
32
33 return os;
34}
35
37{
38 detach(); // Efface l'objet existant
39 static Nom nom_type; // static pour le pas creer un Objet_U a chaque fois
40 is >> nom_type;
41 Objet_U * objet = nullptr;
42 if (nom_type != "vide")
43 {
44 objet = typer(nom_type);
45 if (! objet) Process::exit();
46 }
47
48 set_Objet_U_ptr(objet);
49 if (objet) is >> (*objet); // On lit
50
51 return is;
52}
53
54/*! @brief Destructeur.
55 *
56 * Il ne detruit pas l'objet en reference
57 *
58 */
60{
61 cle_ = -2; // Paranoia : on rend le pointeur invalide
62}
63
64/*! @brief construit un pointeur nul (cle a -1)
65 *
66 */
67Objet_U_ptr::Objet_U_ptr() : cle_(-1), ptr_object_id_(-1) { }
68
70{
71 Objet_U * ptr = get_Objet_U_ptr();
72 if (ptr) delete ptr;
73 set_Objet_U_ptr(nullptr);
74}
75
77{
79 assert(ptr != nullptr);
80 int resu = ptr->associer_(objet);
81 return resu;
82}
83
84
85/*! @brief Verifie si le pointeur est valide.
86 *
87 * Le pointeur est valide si cle_==-1
88 * ou si la_memoire().objet_u(cle_) a le meme object_id_ que
89 * celui enregistre dans ptr_object_id_.
90 * Si le pointeur n'est pas valide, arret du programme.
91 * Renvoie l'adresse de l'objet pointe (de type Objet_U)
92 *
93 */
95{
96 if (cle_ != -1 || ptr_object_id_ != -1)
97 {
98 Objet_U& objet = Memoire::Instance().objet_u(cle_);
99 Objet_U * addr = &objet;
100 const int id = objet.get_object_id();
101 if (id == ptr_object_id_)
102 return addr;
103 else
104 {
105 Cerr << "(PE" << me() << ") ";
106 Cerr << "Error in Objet_U_ptr::get_Objet_U_ptr_check() : id != ptr_object_id_\n";
107 Cerr << " Pointer type " << le_type();
108 Cerr << "\n cle_ = " << cle_;
109 Cerr << "\n ptr_object_id_ = " << ptr_object_id_;
110 Cerr << "\n id = " << id;
111 std::cerr << "\n &la_memoire().objet_u(cle_) = " << addr << std::endl;
112 // Si ca plante a cet endroit, c'est que l'objet en reference
113 // a ete detruit et que la reference est encore utilisee.
114 exit();
115 }
116 }
117 return 0;
118}
119
120/*! @brief Verifie que l'objet pointe par ptr est d'un type acceptable pour le pointeur (avec get_info_ptr)
121 *
122 */
124{
125 if (ptr == nullptr) return 1; // Le pointeur nul est valide
126
127 const Objet_U& objet = *ptr;
128 // On verifie que l'objet est du bon type :
129 // type accepte par le pointeur :
130 const Type_info& type_info_ptr = get_info_ptr();
131 // type de l'objet :
132 const Type_info& type_info_obj = *(objet.get_info());
133 // Peut-on convertir type_info_obj en type_info_ptr ?
134 if (! type_info_ptr.can_cast(&type_info_obj))
135 {
136 Cerr << "(PE" << me() << ") ";
137 Cerr << "Error in Objet_U_ptr::get_Objet_U_ptr_check() : Type error\n";
138 Cerr << " Pointer type " << le_type();
139 Cerr << "\n cle_ = " << cle_;
140 Cerr << "\n ptr_object_id_ = " << ptr_object_id_;
141 std::cerr << "\n &memoire.objet_u(cle_) = " << ptr;
142 Cerr << "\n Type accepted by the pointer : " << type_info_ptr.name();
143 Cerr << "\n Object type in reference : " << type_info_obj.name();
145 }
146 return 1;
147}
148
149
150
151/*! @brief Pour mettre a jour les cles lorsque les Objet_U ont etes renumerotes.
152 *
153 * @param (const int* const new_ones) tableau de la nouvelle numerotation
154 * @return (int) la nouvelle cle du pointeur
155 */
156int Objet_U_ptr::change_num(const int* const new_ones)
157{
158 Objet_U::change_num(new_ones);
159
160 // Il ne faut pas faire d'appel a une fonction qui fait "verifie"
161 // car la memoire est en cours de modification.
162 if (cle_ > -1)
163 cle_ = new_ones[cle_];
164 return cle_;
165}
166
167/*! @brief Duplique l'Objet_U obj puis change le pointeur vers cette copie.
168 *
169 * @param (const Objet_U& obj) reference sur l'Objet_U a copier
170 */
172{
173 int cle = obj.duplique();
174 Memoire& memoire = Memoire::Instance();
175 Objet_U& objet = memoire.objet_u(cle);
176 set_Objet_U_ptr(& objet);
177}
178
179/*! @brief Renvoie un pointeur sur l'Objet_U associe ATTENTION: l'adresse peut etre nulle (si le pointeur est nul)
180 *
181 */
183{
184 const Objet_U * objet;
185 if (cle_ < 0)
186 {
187 objet = nullptr;
188 }
189 else
190 {
191 Memoire& memoire = Memoire::Instance();
192 objet = & memoire.objet_u(cle_);
193 }
194 assert(objet == get_Objet_U_ptr_check());
195 return (Objet_U*) objet;
196}
197
198/*! @brief Fait pointer *this sur l'objet *ptr L'adresse peut etre nulle (pointeur nul).
199 *
200 */
202{
203 if (ptr != nullptr)
204 {
205 cle_ = ptr->numero();
206 ptr_object_id_ = ptr->get_object_id();
207 }
208 else
209 {
210 cle_ = -1;
211 ptr_object_id_ = -1;
212 }
213 // Il suffit de tester le type ici : si le type est bon ici et qu'ensuite l'object_id_ ne change pas, alors le type est toujours bon.
214 assert(check_Objet_U_ptr_type(ptr));
215 assert(get_Objet_U_ptr_check() == ptr);
216}
217
218/*! @brief Essaie de creer une instance du type "type".
219 *
220 * si type n'est pas un type ou type n'est pas instanciable=>arret
221 * si type n'est pas un sous-type du type du pointeur=>retour 0
222 * si ok, renvoie l'adresse de l'objet cree.
223 */
224Objet_U * Objet_U_ptr::typer(const char * type)
225{
226 const Type_info * type_info = Type_info::type_info_from_name(type); // Type_info du type demande
227 const Type_info& type_base = get_info_ptr(); // Type de base du OWN_PTR
228
229 if ( get_Objet_U_ptr()) detach();
230
231 Objet_U * instance = nullptr;
232
233 if (type_info == 0)
234 {
236
237 if (syn_info!=0) return typer(syn_info->org_name_());
238 else
239 {
240 Cerr << "Error in Deriv_::typer_(const char* const type)" << finl << type << " is not a type." << finl;
241 Cerr << "Type required : derived from " << type_base.name() << finl << finl;
242 Cerr << type << " is not a recognized keyword." << finl << "Check your data set." << finl;
243 Nom nompb = type;
244 if (nompb.find("TURBULENT") != -1 || nompb.find("TURBULENCE") != -1)
245 Cerr << finl << "*** NOTE :: Since TRUST V1.8.0, turbulence models are in TrioCFD and not anymore in TRUST.\nTry using TrioCFD executable or contact TRUST support." << finl;
247 }
248 }
249 if (! type_info->instanciable())
250 {
251 Cerr << "Error in Deriv_::typer_(const char* const type).\n" << type << " is not instanciable." << finl;
253 }
254
255 if (! type_info->has_base(&type_base))
256 Cerr << "Error in Deriv_::typer_(const char* const type).\n " << type << " is not a subtype of " << type_base.name() << finl;
257 else
258 instance = type_info->instance(); // Cree une instance du type decrit dans type_info
259
260 set_Objet_U_ptr(instance);
261 return instance;
262}
263
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
La memoire de Trio-U.
Definition Memoire.h:30
Objet_U & objet_u(int)
Retoune une reference sur l'Objet_U de rang num dans la memoire.
Definition Memoire.cpp:206
static Memoire & Instance()
Retourne un pointeur sur l'instance de la memoire Cree un nouvel objet memoire si aucune instance n'a...
Definition Memoire.cpp:32
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
virtual int find(const char *const n) const
Definition Nom.cpp:314
Pointeur sur un Objet_U.
Definition Objet_U_ptr.h:31
int associer_(Objet_U &objet) override
Associe l'Objet_U a un autre Objet_U Methode virtuelle a surcharger.
int change_num(const int *const) override
Pour mettre a jour les cles lorsque les Objet_U ont etes renumerotes.
Objet_U * get_Objet_U_ptr_check() const
Verifie si le pointeur est valide.
virtual void set_Objet_U_ptr(Objet_U *)
Fait pointer *this sur l'objet *ptr L'adresse peut etre nulle (pointeur nul).
void recopie(const Objet_U &)
Duplique l'Objet_U obj puis change le pointeur vers cette copie.
int check_Objet_U_ptr_type(const Objet_U *ptr) const
Verifie que l'objet pointe par ptr est d'un type acceptable pour le pointeur (avec get_info_ptr).
~Objet_U_ptr() override
Destructeur.
Objet_U_ptr()
construit un pointeur nul (cle a -1)
Objet_U * typer(const char *nom_type)
Essaie de creer une instance du type "type".
virtual Objet_U * get_Objet_U_ptr() const
Renvoie un pointeur sur l'Objet_U associe ATTENTION: l'adresse peut etre nulle (si le pointeur est nu...
virtual const Type_info & get_info_ptr() const =0
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
virtual int duplique() const =0
virtual int associer_(Objet_U &)
Associe l'Objet_U a un autre Objet_U Methode virtuelle a surcharger.
Definition Objet_U.cpp:201
int numero() const
Renvoie l'indice de l'objet dans Memoire::data.
Definition Objet_U.cpp:268
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual int change_num(const int *const)
Change le numero interne de l'Objet_U.
Definition Objet_U.cpp:181
const char * le_type() const
Donne le nom du type de l'Objet_U.
Definition Objet_U.cpp:191
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
Definition Objet_U.cpp:55
int get_object_id() const
Renvoie l'identifiant unique de l'objet object_id_.
Definition Objet_U.cpp:95
virtual const Type_info * get_info() const
Donne des informations sur le type de l'Objet_U.
Definition Objet_U.cpp:126
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static int me()
renvoie mon rang dans le groupe de communication courant.
Definition Process.cpp:125
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe de base des flux de sortie.
Definition Sortie.h:52
modelise une information de synonyme pour les Objet_U
static const Synonyme_info * synonyme_info_from_name(const char *synonyme_name)
Methode statique qui renvoie un pointeur vers le Synonyme_info dont le nom est "synonyme_name".
const char * org_name_() const
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.
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
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".
const Nom & name() const
Definition Type_info.h:36