Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ISimpleTableReaderWriter.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ISimpleTableReaderWriter.h (C) 2000-2022 */
9/* */
10/* Interface représentant un lecteur/écrivain de tableau simple. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#ifndef ARCANE_ISIMPLETABLEREADERWRITER_H
15#define ARCANE_ISIMPLETABLEREADERWRITER_H
16
17/*---------------------------------------------------------------------------*/
18/*---------------------------------------------------------------------------*/
19
20#include "arcane/ISimpleTableInternalMng.h"
21
22#include "arcane/Directory.h"
23#include "arcane/IParallelMng.h"
24#include "arcane/ItemTypes.h"
25#include "arcane/utils/Iostream.h"
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36/**
37 * @brief Classe contenant deux méthodes statiques
38 * utile pour les implémentations.
39 *
40 */
41class ARCANE_CORE_EXPORT SimpleTableReaderWriterUtils
42{
43 public:
44 /**
45 * @brief Méthode statique permettant de créer un répertoire avec plusieurs
46 * processus.
47 * @note C'est une méthode collective qui doit être appelée par tous les processus.
48 *
49 * @param parallel_mng Le parallel manager du contexte actuel.
50 * @param directory Le répertoire à créer.
51 * @return true Si le répertoire a été correctement créé.
52 * @return false Si le répertoire n'a pas pu être créé.
53 */
54 static bool createDirectoryOnlyProcess0(IParallelMng* parallel_mng, const Directory& directory)
55 {
56 int sf = 0;
57 if (parallel_mng->commRank() == 0) {
58 sf = directory.createDirectory();
59 }
60 if (parallel_mng->commSize() > 1) {
61 sf = parallel_mng->reduce(Parallel::ReduceMax, sf);
62 }
63 return sf == 0;
64 };
65 /**
66 * @brief Méthode statique permettant de vérifier l'existance d'un fichier.
67 *
68 * @param directory Le répertoire où se situe le fichier.
69 * @param file Le nom du fichier (avec l'extension).
70 * @return true Si le fichier existe déjà.
71 * @return false Si le fichier n'existe pas.
72 */
73 static bool isFileExist(const Directory& directory, const String& file)
74 {
75 std::ifstream stream;
76 stream.open(directory.file(file).localstr(), std::ifstream::in);
77 bool fin = stream.good();
78 stream.close();
79 return fin;
80 };
81};
82
83/*---------------------------------------------------------------------------*/
84/*---------------------------------------------------------------------------*/
85
86/**
87 * @brief Interface de classe permettant de lire un fichier et d'écrire
88 * un fichier avec ou à partir d'un SimpleTableInternal.
89 *
90 * Le fichier lu devra, de préférence, avoir été écrit par une implémentation
91 * de cette même interface.
92 *
93 * Impérativement donc, un fichier écrit par une implémentation de cette
94 * interface devra pouvoir être lu par cette même implémentation.
95 *
96 * L'implémentation ne devra pas détruire l'objet SimpleTableInternal
97 * pointé par le pointeur utilisé. C'est à l'appelant de gérer ça.
98 */
99class ARCANE_CORE_EXPORT ISimpleTableReaderWriter
100{
101 public:
102 virtual ~ISimpleTableReaderWriter() = default;
103
104 public:
105 /**
106 * @brief Méthode permettant d'écrire un tableau simple dans un fichier.
107 *
108 * L'extension sera ajouté par l'implémentation.
109 *
110 * Le répertoire de destination sera créé par l'implémentation s'il
111 * n'existe pas.
112 *
113 * Les élements de SimpleTableInternal qui doivent impérativement
114 * être écrits sont :
115 * - les noms des lignes (m_row_names),
116 * - les noms des colonnes (m_column_names),
117 * - le nom du tableau (m_table_name),
118 * - les valeurs du tableau (m_values).
119 *
120 * Les autres élements de SimpleTableInternal ne sont pas obligatoire.
121 *
122 * @param dst Le répertoire de destination.
123 * @param file_name Le nom du fichier (sans extension).
124 * @return true Si le fichier a bien été écrit.
125 * @return false Si le fichier n'a pas pu être écrit.
126 */
127 virtual bool writeTable(const Directory& dst, const String& file_name) = 0;
128
129 /**
130 * @brief Méthode permettant de lire un fichier contenant un tableau simple.
131 *
132 * L'extension sera ajouté par l'implémentation.
133 *
134 * Un appel à SimpleTableInternal::clear() devra être effectué avant la lecture.
135 *
136 * Les élements qui doivent impérativement être récupérés sont :
137 * - les noms des lignes (m_row_names),
138 * - les noms des colonnes (m_column_names),
139 * - le nom du tableau (m_table_name),
140 * - les valeurs du tableau (m_values).
141 *
142 * Les élements qui doivent être déduit si non récupérés sont :
143 * - les tailles des lignes (m_row_sizes),
144 * - les tailles des colonnes (m_column_sizes).
145 *
146 * Déduction par défaut pour m_row_sizes :
147 * - len(m_row_sizes) = len(m_row_names)
148 * - m_row_sizes[*] = m_values.dim2Size()
149 *
150 * Déduction par défaut pour m_column_sizes :
151 * - len(m_column_sizes) = len(m_column_names)
152 * - m_column_sizes[*] = m_values.dim1Size()
153 *
154 *
155 * @param src Le répertoire source.
156 * @param file_name Le nom du fichier (sans extension).
157 * @return true Si le fichier a bien été lu.
158 * @return false Si le fichier n'a pas pu être lu.
159 */
160 virtual bool readTable(const Directory& src, const String& file_name) = 0;
161
162 /**
163 * @brief Méthode permettant d'effacer le contenu de l'objet
164 * SimpleTableInternal.
165 */
166 virtual void clearInternal() = 0;
167
168 /**
169 * @brief Méthode permettant d'écrire le tableau dans la
170 * sortie standard.
171 *
172 * Le format d'écriture est libre (pour l'implémentation
173 * csv, l'écriture se fait pareil que dans un fichier csv).
174 */
175 virtual void print() = 0;
176
177 /**
178 * @brief Méthode permettant de récupérer la précision actuellement
179 * utilisée pour l'écriture des valeurs.
180 *
181 * @return Integer La précision.
182 */
183 virtual Integer precision() = 0;
184
185 /**
186 * @brief Méthode permettant de modifier la précision du print.
187 *
188 * Aussi bien pour la méthode 'print()' que la méthode 'writetable()'.
189 *
190 * @warning Le flag "std::fixed" modifie le comportement de "setPrecision()",
191 * si le flag "std::fixed" est désactivé, la précision définira le
192 * nombre de chiffres total (avant et après la virgule) ;
193 * si le flag "std::fixed" est activé, la précision définira le
194 * nombre de chiffres après la virgule. Attention donc lors de
195 * l'utilisation de "std::numeric_limits<Real>::max_digits10"
196 * (pour l'écriture) ou de "std::numeric_limits<Real>::digits10"
197 * (pour la lecture) qui sont à utiliser sans le flag "std::fixed".
198 *
199 * @param precision La nouvelle précision.
200 */
201 virtual void setPrecision(Integer precision) = 0;
202
203 /**
204 * @brief Méthode permettant de savoir si le frag 'std::fixed' est
205 * actif ou non pour l'écriture des valeurs.
206 *
207 * @return true Si oui.
208 * @return false Si non.
209 */
210 virtual bool isFixed() = 0;
211 /**
212 * @brief Méthode permettant de définir le flag 'std::fixed' ou non.
213 *
214 * Aussi bien pour la méthode 'print()' que la méthode 'writetable()'.
215 *
216 * Ce flag permet de 'forcer' le nombre de chiffre après la virgule à
217 * la précision voulu. Par exemple, si l'on a appelé 'setPrecision(4)',
218 * et que l'on appelle 'setFixed(true)', le print de '6.1' donnera '6.1000'.
219 *
220 * @warning Le flag "std::fixed" modifie le comportement de "setPrecision()",
221 * si le flag "std::fixed" est désactivé, la précision définira le
222 * nombre de chiffres total (avant et après la virgule) ;
223 * si le flag "std::fixed" est activé, la précision définira le
224 * nombre de chiffres après la virgule. Attention donc lors de
225 * l'utilisation de "std::numeric_limits<Real>::max_digits10"
226 * (pour l'écriture) ou de "std::numeric_limits<Real>::digits10"
227 * (pour la lecture) qui sont à utiliser sans le flag "std::fixed".
228 *
229 * @param fixed Si le flag 'std::fixed' doit être défini ou non.
230 */
231 virtual void setFixed(bool fixed) = 0;
232
233 /**
234 * @brief Méthode permettant de savoir si le frag 'std::scientific' est
235 * actif ou non pour l'écriture des valeurs.
236 *
237 * @return true Si oui.
238 * @return false Si non.
239 */
241 /**
242 * @brief Méthode permettant de définir le flag 'std::scientific' ou non.
243 *
244 * Aussi bien pour la méthode 'print()' que la méthode 'writetable()'.
245 *
246 * Ce flag permet de 'forcer' l'affichage des valeurs en écriture
247 * scientifique.
248 *
249 * @param use_scientific Si le flag 'std::scientific' doit être défini ou non.
250 */
251 virtual void setForcedToUseScientificNotation(bool use_scientific) = 0;
252
253 /**
254 * @brief Méthode permettant de récupérer le type de fichier
255 * qui sera écrit par l'implémentation. ("csv" sera retourné
256 * pour l'implémentation csv).
257 *
258 * @return String Le type/l'extension du fichier utilisé.
259 */
260 virtual String fileType() = 0;
261
262 /**
263 * @brief Méthode permettant de récupérer une référence vers l'objet
264 * SimpleTableInternal utilisé.
265 *
266 * @return Ref<SimpleTableInternal> Une copie de la référence.
267 */
268 virtual Ref<SimpleTableInternal> internal() = 0;
269
270 /**
271 * @brief Méthode permettant de définir une référence vers un
272 * SimpleTableInternal.
273 *
274 * @param simple_table_internal La référence vers un SimpleTableInternal.
275 */
276 virtual void setInternal(const Ref<SimpleTableInternal>& simple_table_internal) = 0;
277};
278
279/*---------------------------------------------------------------------------*/
280/*---------------------------------------------------------------------------*/
281
282} // End namespace Arcane
283
284/*---------------------------------------------------------------------------*/
285/*---------------------------------------------------------------------------*/
286
287#endif
288
289/*---------------------------------------------------------------------------*/
290/*---------------------------------------------------------------------------*/
Classe gérant un répertoire.
Definition Directory.h:33
virtual String file(const String &file_name) const
Retourne le chemin complet du fichier file_name dans le répertoire.
Definition Directory.cc:138
virtual bool createDirectory() const
Créé le répertoire.
Definition Directory.cc:120
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface de classe permettant de lire un fichier et d'écrire un fichier avec ou à partir d'un Simple...
virtual bool isForcedToUseScientificNotation()=0
Méthode permettant de savoir si le frag 'std::scientific' est actif ou non pour l'écriture des valeur...
virtual bool writeTable(const Directory &dst, const String &file_name)=0
Méthode permettant d'écrire un tableau simple dans un fichier.
virtual void setPrecision(Integer precision)=0
Méthode permettant de modifier la précision du print.
virtual void setInternal(const Ref< SimpleTableInternal > &simple_table_internal)=0
Méthode permettant de définir une référence vers un SimpleTableInternal.
virtual Integer precision()=0
Méthode permettant de récupérer la précision actuellement utilisée pour l'écriture des valeurs.
virtual bool isFixed()=0
Méthode permettant de savoir si le frag 'std::fixed' est actif ou non pour l'écriture des valeurs.
virtual bool readTable(const Directory &src, const String &file_name)=0
Méthode permettant de lire un fichier contenant un tableau simple.
virtual void setFixed(bool fixed)=0
Méthode permettant de définir le flag 'std::fixed' ou non.
virtual Ref< SimpleTableInternal > internal()=0
Méthode permettant de récupérer une référence vers l'objet SimpleTableInternal utilisé.
virtual void setForcedToUseScientificNotation(bool use_scientific)=0
Méthode permettant de définir le flag 'std::scientific' ou non.
virtual String fileType()=0
Méthode permettant de récupérer le type de fichier qui sera écrit par l'implémentation....
virtual void clearInternal()=0
Méthode permettant d'effacer le contenu de l'objet SimpleTableInternal.
virtual void print()=0
Méthode permettant d'écrire le tableau dans la sortie standard.
Classe contenant deux méthodes statiques utile pour les implémentations.
static bool createDirectoryOnlyProcess0(IParallelMng *parallel_mng, const Directory &directory)
Méthode statique permettant de créer un répertoire avec plusieurs processus.
static bool isFileExist(const Directory &directory, const String &file)
Méthode statique permettant de vérifier l'existance d'un fichier.
Chaîne de caractères unicode.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:227
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-