TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
TRUST_Deriv.h
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#ifndef TRUST_Deriv_included
17#define TRUST_Deriv_included
18
19#include <Objet_U_ptr.h>
20#include <Nom.h>
21
22/*! @brief classe TRUST_Deriv
23 *
24 * Soit une classe Type_base qui derive de Objet_U.
25 *
26 * TRUST_Deriv<Type_base> est une petite classe template contenant un pointeur vers une instance de Type_base,
27 * ou de n'importe quelle classe derivee de Type_base qui est creee dynamiquement lors a l'execution.
28 *
29 * Definition de la DERIV:
30 *
31 * #include <TRUST_Deriv.h>
32 * #include <Type_base.h>
33 * TRUST_Deriv<Type_base>
34 *
35 * Creation d'un objet de type OWN_PTR(Type_base) :
36 * OWN_PTR(Type_base) deriv_type; // deriv_type est encore un pointeur nul
37 *
38 * On suppose que la classe Type_Derive derive de Type_base et est instanciable:
39 * class Type_Derive : Type_base
40 * {
41 * Declare_instanciable(Type_Derive);;
42 * ...
43 * };
44 *
45 * Creation d'une instance de la classe Type_Derive qui derive de Type_base:
46 * deriv_type.typer("Type_Derive");
47 *
48 * Acces a l'instance de Type_Derive:
49 * Type_Derive & objet_derive = deriv_type.valeur();
50 * const Type_Derive & objet_derive = deriv_type.valeur();
51 *
52 * L'instance de Type_Derive est detruite si on appelle a nouveau "typer()"
53 * ou si l'objet deriv_type est detruit.
54 *
55 */
56
57// MACRO to replace OWN_PTR(THECLASS) by Deriv_THECLASS & keep previous syntax for some developers
58#define DERIV(_TYPE_) \
59 static_assert(false, "The old DERIV MACRO is now deprecated. Please use OWN_PTR instead.")
60
61#define OWN_PTR(_TYPE_) TRUST_Deriv<_TYPE_>
62
63template<typename _CLASSE_>
65{
66protected:
67 unsigned taille_memoire() const override { throw; }
68
69 int duplique() const override
70 {
71 TRUST_Deriv *xxx = new TRUST_Deriv(*this);
72#ifndef LATATOOLS
73 if (!xxx) Process::exit("Not enough memory !");
74#endif
75 return xxx->numero();
76 }
77
78 Sortie& printOn(Sortie& os) const override { return Objet_U_ptr::printOn(os); }
79
80 Entree& readOn(Entree& is) override { return Objet_U_ptr::readOn(is); }
81
82 void set_Objet_U_ptr(Objet_U *objet) override
83 {
85 /* Attention: cette conversion de type est non triviale. si le _TYPE_ est issu d'un heritage multiple. */
86 if (objet) pointeur_ = (_CLASSE_*) objet;
87 else pointeur_ = nullptr;
88 }
89
90private:
91 _CLASSE_ *pointeur_ = nullptr;
92
93 int reprendre(Entree&) override { return -100; /* NON PAS POSSIBLE */ }
94 int sauvegarder(Sortie&) const override { return -100; /* NON PAS POSSIBLE */ }
95
96public:
98 TRUST_Deriv() : Objet_U_ptr(), pointeur_(nullptr) { }
100 {
101 if (t) recopie(t.valeur());
102 }
103
104 TRUST_Deriv(const _CLASSE_& t) : TRUST_Deriv()
105 {
106 recopie(t);
107 }
108
109 inline const _CLASSE_& valeur() const
110 {
111 assert(pointeur_ != nullptr);
112#ifndef TRUST_USE_GPU
113 assert(get_Objet_U_ptr_check() || 1);
114#endif
115 return *pointeur_;
116 }
117
118 inline _CLASSE_& valeur()
119 {
120 assert(pointeur_ != nullptr);
121#ifndef TRUST_USE_GPU
122 assert(get_Objet_U_ptr_check() || 1);
123#endif
124 return *pointeur_;
125 }
126
127 inline const _CLASSE_* operator ->() const
128 {
129 assert(pointeur_ != nullptr);
130 assert(get_Objet_U_ptr_check() || 1);
131 return pointeur_;
132 }
133
134 inline _CLASSE_* operator ->()
135 {
136 assert(pointeur_ != nullptr);
137 assert(get_Objet_U_ptr_check() || 1);
138 return pointeur_;
139 }
140
141 const TRUST_Deriv& operator=(const _CLASSE_& t)
142 {
143 if (pointeur_ != (&t))
144 {
145 detach();
146 recopie(t);
147 }
148 return *this;
149 }
150
152 {
153 if (pointeur_ != t.pointeur_)
154 {
155 detach();
156 if (t) recopie(t.valeur());
157 }
158 return *this;
159 }
160
161 operator const _CLASSE_& () const { return valeur(); }
162 operator _CLASSE_& () { return valeur(); }
163
164 const Type_info& get_info_ptr() const override
165 {
166 const Type_info * type_info = _CLASSE_::info();
167 return *type_info; /* type de base accepte par la ref */
168 }
169
170 Entree& typer_lire_simple(Entree& is, const char* msg = "??")
171 {
172 return typer_lire(is, "??", msg);
173 }
174
175 Entree& typer_lire(Entree& is, const char* b = "??", const char* msg = "??")
176 {
177 Nom type, base;
178
179 if (strcmp(msg, "??") != 0)
180 Cerr << msg << " ";
181
182 if (strcmp(b, "??") != 0)
183 base = b;
184
185 is >> type; // On lit le type :-)
186
187 if (base != "??")
188 type = base + type;
189
190 typer(type); // on type :-)
191
192 if (strcmp(msg, "??") != 0)
193 Cerr << valeur().que_suis_je() << finl;
194
195 is >> valeur(); // et on lit la classe :-)
196
197 return is;
198 }
199};
200
201/* ======================================================= *
202 * ======================================================= *
203 * ======================================================= */
204
205/*! @brief classe TRUST_Deriv_Objet_U est quasiment identique a TRUST_Deriv<Objet_U>
206 * sauf qu'elle ne contient pas les operateurs de conversion de OWN_PTR(Objet_U) en Objet_U.
207 *
208 * Il existe 3 methodes supplementaires :
209 *
210 * - deplace(TRUST_Deriv_Objet_U& )
211 * - reprendre
212 * - sauvegarder
213 *
214 * Utilisation :
215 * - TRUST_Deriv_Objet_U
216 * ou
217 * - DerObjU
218 */
220{
221 Declare_instanciable_sans_constructeur(TRUST_Deriv_Objet_U);
222protected:
223 void set_Objet_U_ptr(Objet_U *objet) override;
224
225private:
226 Objet_U *pointeur_;
227
228public:
232 const Type_info& get_info_ptr() const override;
233 const TRUST_Deriv_Objet_U& operator=(const Objet_U& t);
235#ifndef LATATOOLS
236 int reprendre(Entree& is) override;
237 int sauvegarder(Sortie& os) const override;
238#endif
239 void deplace(TRUST_Deriv_Objet_U& deriv_obj);
240
241 inline const Objet_U& valeur() const
242 {
243 assert(pointeur_ != nullptr);
244 assert(get_Objet_U_ptr_check() || 1);
245 return *pointeur_;
246 }
247
248 inline Objet_U& valeur()
249 {
250 assert(pointeur_ != nullptr);
251 assert(get_Objet_U_ptr_check() || 1);
252 return *pointeur_;
253 }
254
255 inline Objet_U* operator ->() const
256 {
257 assert(pointeur_ != nullptr);
258 assert(get_Objet_U_ptr_check() || 1);
259 return pointeur_;
260 }
261};
262
263using DerObjU = TRUST_Deriv_Objet_U;
264
265#endif /* TRUST_Deriv_included */
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
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.
Objet_U_ptr(const Objet_U_ptr &)=delete
Objet_U * typer(const char *nom_type)
Essaie de creer une instance du type "type".
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
friend class Entree
Definition Objet_U.h:76
int numero() const
Renvoie l'indice de l'objet dans Memoire::data.
Definition Objet_U.cpp:268
friend class Sortie
Definition Objet_U.h:75
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
Definition Objet_U.cpp:55
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
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
classe TRUST_Deriv_Objet_U est quasiment identique a TRUST_Deriv<Objet_U> sauf qu'elle ne contient pa...
int sauvegarder(Sortie &os) const override
Sauvegarde d'un Objet_U sur un flot de sortie Methode a surcharger.
int reprendre(Entree &is) override
Reprise d'un Objet_U sur un flot d'entree Methode a surcharger.
const Type_info & get_info_ptr() const override
Objet_U * operator->() const
const Objet_U & valeur() const
const TRUST_Deriv_Objet_U & operator=(const Objet_U &t)
void deplace(TRUST_Deriv_Objet_U &deriv_obj)
void set_Objet_U_ptr(Objet_U *objet) override
Fait pointer *this sur l'objet *ptr L'adresse peut etre nulle (pointeur nul).
int duplique() const override
Definition TRUST_Deriv.h:69
const _CLASSE_ & valeur() const
Sortie & printOn(Sortie &os) const override
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition TRUST_Deriv.h:78
TRUST_Deriv(const TRUST_Deriv &t)
Definition TRUST_Deriv.h:99
_CLASSE_ & valeur()
const _CLASSE_ * operator->() const
const TRUST_Deriv & operator=(const _CLASSE_ &t)
Entree & typer_lire_simple(Entree &is, const char *msg="??")
Entree & typer_lire(Entree &is, const char *b="??", const char *msg="??")
unsigned taille_memoire() const override
Definition TRUST_Deriv.h:67
const TRUST_Deriv & operator=(const TRUST_Deriv &t)
void set_Objet_U_ptr(Objet_U *objet) override
Fait pointer *this sur l'objet *ptr L'adresse peut etre nulle (pointeur nul).
Definition TRUST_Deriv.h:82
Entree & readOn(Entree &is) override
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition TRUST_Deriv.h:80
const Type_info & get_info_ptr() const override
TRUST_Deriv(const _CLASSE_ &t)
modelise une information de type pour les Objet_U
Definition Type_info.h:30