Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Convert.cc
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/* Convert.cc (C) 2000-2022 */
9/* */
10/* Fonctions pour convertir un type en un autre. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ValueConvert.h"
15
16#include "arcane/utils/Convert.h"
17#include "arcane/utils/Iostream.h"
18#include "arcane/utils/NotImplementedException.h"
19#include "arcane/utils/OStringStream.h"
20#include "arcane/utils/PlatformUtils.h"
21#include "arcane/utils/FatalErrorException.h"
22#include "arcane/utils/internal/ValueConvertInternal.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33
34#ifdef ARCANE_REAL_NOT_BUILTIN
35template<> ARCANE_UTILS_EXPORT bool
36builtInGetValue(Real& v,const String& s)
37{
38#if 0
39 double vz = 0.0;
40 if (builtInGetValue(vz,s))
41 return true;
42 v = vz;
43 cout << "** CONVERT DOUBLE TO REAL s=" << s << " vz=" << vz << " v=" << v << '\n';
44 return false;
45#endif
46 double vz = 0.0;
47 if (builtInGetValue(vz,s))
48 return true;
49 v = Real((char*)s.localstr(),1000);
50 cout << "** CONVERT DOUBLE TO REAL s=" << s << '\n';
51 return false;
52}
53#endif
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
57
58template<> bool
59builtInGetValue(String& v,const String& s)
60{
61 v = s;
62 return false;
63}
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67
68namespace{
69bool _builtInGetBoolArrayValue(BoolArray& v,const String& s)
70{
71 // Le type 'bool' est un peu spécial car il doit pouvoir lire les
72 // valeurs comme 'true' ou 'false'.
73 // On le lit donc comme un 'StringUniqueArray', puis on converti en bool
74 //cout << "** GET BOOL ARRAY V=" << s << '\n';
75 //return builtInGetArrayValue(v,s);
76
78 if (builtInGetValue(sa,s))
79 return true;
80 for( Integer i=0, is=sa.size(); i<is; ++i ){
81 bool read_val = false;
82 if (builtInGetValue(read_val,sa[i]))
83 return true;
84 v.add(read_val);
85 }
86 return false;
87}
88
89bool
90_builtInGetStringArrayValue(StringArray& v,const String& s)
91{
92 std::string s2;
93 String read_val = String();
94 std::istringstream sbuf(s.localstr());
95 while(!sbuf.eof()) {
96 sbuf >> s2;
97 //cout << " ** CHECK READ v='" << s2 << "' '" << sv << "'\n";
98 if (sbuf.bad()) // non-recoverable error
99 return true;
100 if (sbuf.fail()) // recoverable error : this means good conversion
101 return false;
102 read_val = StringView(s2.c_str());
103 v.add(read_val);
104 }
105 return false;
106}
107}
108
109template<> ARCANE_UTILS_EXPORT bool builtInGetValue(RealArray& v,const String& s)
110{
111 return builtInGetArrayValue(v,s);
112}
113
114template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2Array& v,const String& s)
115{
116 return builtInGetArrayValue(v,s);
117}
118
119template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3Array& v,const String& s)
120{
121 return builtInGetArrayValue(v,s);
122}
123
124template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2x2Array& v,const String& s)
125{
126 return builtInGetArrayValue(v,s);
127}
128
129template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3x3Array& v,const String& s)
130{
131 return builtInGetArrayValue(v,s);
132}
133
134template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Int32Array& v,const String& s)
135{
136 return builtInGetArrayValue(v,s);
137}
138
139template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Int64Array& v,const String& s)
140{
141 return builtInGetArrayValue(v,s);
142}
143
144template<> ARCANE_UTILS_EXPORT bool builtInGetValue(BoolArray& v,const String& s)
145{
146 return _builtInGetBoolArrayValue(v,s);
147}
148
149template<> ARCANE_UTILS_EXPORT bool builtInGetValue(StringArray& v,const String& s)
150{
151 return _builtInGetStringArrayValue(v,s);
152}
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
157template<> ARCANE_UTILS_EXPORT bool builtInGetValue(RealUniqueArray& v,const String& s)
158{
159 return builtInGetArrayValue(v,s);
160}
161
162template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2UniqueArray& v,const String& s)
163{
164 return builtInGetArrayValue(v,s);
165}
166
167template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3UniqueArray& v,const String& s)
168{
169 return builtInGetArrayValue(v,s);
170}
171
172template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2x2UniqueArray& v,const String& s)
173{
174 return builtInGetArrayValue(v,s);
175}
176
177template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3x3UniqueArray& v,const String& s)
178{
179 return builtInGetArrayValue(v,s);
180}
181
182template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Int16UniqueArray& v,const String& s)
183{
184 return builtInGetArrayValue(v,s);
185}
186
187template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Int32UniqueArray& v,const String& s)
188{
189 return builtInGetArrayValue(v,s);
190}
191
192template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Int64UniqueArray& v,const String& s)
193{
194 return builtInGetArrayValue(v,s);
195}
196
197template<> ARCANE_UTILS_EXPORT bool builtInGetValue(BoolUniqueArray& v,const String& s)
198{
199 return _builtInGetBoolArrayValue(v,s);
200}
201
202template<> ARCANE_UTILS_EXPORT bool builtInGetValue(StringUniqueArray& v,const String& s)
203{
204 return _builtInGetStringArrayValue(v,s);
205}
206
207/*---------------------------------------------------------------------------*/
208/*---------------------------------------------------------------------------*/
209
210template<> ARCANE_UTILS_EXPORT bool builtInGetValue(RealSharedArray& v,const String& s)
211{
212 return builtInGetArrayValue(v,s);
213}
214
215template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2SharedArray& v,const String& s)
217 return builtInGetArrayValue(v,s);
218}
219
220template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3SharedArray& v,const String& s)
221{
222 return builtInGetArrayValue(v,s);
223}
224
225template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2x2SharedArray& v,const String& s)
226{
227 return builtInGetArrayValue(v,s);
228}
229
230template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3x3SharedArray& v,const String& s)
231{
232 return builtInGetArrayValue(v,s);
233}
234
235template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Int16SharedArray& v,const String& s)
236{
237 return builtInGetArrayValue(v,s);
239
240template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Int32SharedArray& v,const String& s)
241{
242 return builtInGetArrayValue(v,s);
243}
244
245template<> ARCANE_UTILS_EXPORT bool builtInGetValue(Int64SharedArray& v,const String& s)
246{
247 return builtInGetArrayValue(v,s);
248}
249
250template<> ARCANE_UTILS_EXPORT bool builtInGetValue(BoolSharedArray& v,const String& s)
251{
252 return _builtInGetBoolArrayValue(v,s);
253}
254
255template<> ARCANE_UTILS_EXPORT bool builtInGetValue(StringSharedArray& v,const String& s)
256{
257 return _builtInGetStringArrayValue(v,s);
258}
259
260/*---------------------------------------------------------------------------*/
261/*---------------------------------------------------------------------------*/
262
263namespace
264{
265template<class T> inline bool
266_builtInPutValue(const T& v,String& s)
267{
268 OStringStream ostr;
269 ostr() << v;
270 if (ostr().fail() || ostr().bad())
271 return true;
272 s = ostr.str();
273 return false;
274}
275template<class T> inline bool
276_builtInPutArrayValue(Span<const T> v,String& s)
277{
278 OStringStream ostr;
279 for( Int64 i=0, n=v.size(); i<n; ++i ){
280 if (i!=0)
281 ostr() << ' ';
282 ostr() << v[i];
283 }
284 if (ostr().fail() || ostr().bad())
285 return true;
286 s = ostr.str();
287 return false;
288}
289}
290
292{ return _builtInPutValue(v,s); }
293bool builtInPutValue(double v,String& s)
294{ return _builtInPutValue(v,s); }
295bool builtInPutValue(float v,String& s)
296{ return _builtInPutValue(v,s); }
297bool builtInPutValue(int v,String& s)
298{ return _builtInPutValue(v,s); }
299bool builtInPutValue(unsigned int v,String& s)
300{ return _builtInPutValue(v,s); }
301bool builtInPutValue(long v,String& s)
302{ return _builtInPutValue(v,s); }
303bool builtInPutValue(long long v,String& s)
304{ return _builtInPutValue(v,s); }
305bool builtInPutValue(short v,String& s)
306{ return _builtInPutValue(v,s); }
307bool builtInPutValue(unsigned short v,String& s)
308{ return _builtInPutValue(v,s); }
309bool builtInPutValue(unsigned long v,String& s)
310{ return _builtInPutValue(v,s); }
311bool builtInPutValue(unsigned long long v,String& s)
312{ return _builtInPutValue(v,s); }
313#ifdef ARCANE_REAL_NOT_BUILTIN
314bool builtInPutValue(Real v,String& s)
315{ return _builtInPutValue(v,s); }
316#endif
317bool builtInPutValue(Real2 v,String& s)
318{ return _builtInPutValue(v,s); }
319bool builtInPutValue(Real3 v,String& s)
320{ return _builtInPutValue(v,s); }
321bool builtInPutValue(const Real2x2& v,String& s)
322{ return _builtInPutValue(v,s); }
323bool builtInPutValue(const Real3x3& v,String& s)
324{ return _builtInPutValue(v,s); }
325
326bool builtInPutValue(Span<const Real> v,String& s)
327{ return _builtInPutArrayValue(v,s); }
328bool builtInPutValue(Span<const Real2> v,String& s)
329{ return _builtInPutArrayValue(v,s); }
330bool builtInPutValue(Span<const Real3> v,String& s)
331{ return _builtInPutArrayValue(v,s); }
332bool builtInPutValue(Span<const Real2x2> v,String& s)
333{ return _builtInPutArrayValue(v,s); }
334bool builtInPutValue(Span<const Real3x3> v,String& s)
335{ return _builtInPutArrayValue(v,s); }
336bool builtInPutValue(Span<const Int16> v,String& s)
337{ return _builtInPutArrayValue(v,s); }
338bool builtInPutValue(Span<const Int32> v,String& s)
339{ return _builtInPutArrayValue(v,s); }
340bool builtInPutValue(Span<const Int64> v,String& s)
341{ return _builtInPutArrayValue(v,s); }
342bool builtInPutValue(Span<const bool> v,String& s)
343{ return _builtInPutArrayValue(v,s); }
344bool builtInPutValue(Span<const String> v,String& s)
345{ return _builtInPutArrayValue(v,s); }
346//@}
347
348/*---------------------------------------------------------------------------*/
349/*---------------------------------------------------------------------------*/
350
351static char global_hexa[16] = {'0','1', '2', '3', '4', '5', '6', '7', '8', '9',
352 'a', 'b', 'c', 'd', 'e', 'f' };
353
354/*---------------------------------------------------------------------------*/
355/*---------------------------------------------------------------------------*/
356
357namespace
358{
359String
360_toHexaString(Span<const std::byte> input)
361{
362 UniqueArray<Byte> out_buf;
363 Int64 len = input.size();
364 out_buf.resize((len*2)+1);
365 for( Int64 i=0; i<len; ++i ){
366 int v = std::to_integer<int>(input[i]);
367 out_buf[(i*2)] = global_hexa[v/16];
368 out_buf[(i*2)+1] = global_hexa[v%16];
369 }
370 out_buf[len*2] = '\0';
371 return String(out_buf);
372}
373}
374
375/*---------------------------------------------------------------------------*/
376/*---------------------------------------------------------------------------*/
377
380{
381 return _toHexaString(input);
382}
383
384/*---------------------------------------------------------------------------*/
385/*---------------------------------------------------------------------------*/
386
389{
390 return _toHexaString(asBytes(Span<const Byte>(input)));
391}
392
393/*---------------------------------------------------------------------------*/
394/*---------------------------------------------------------------------------*/
395
397toHexaString(Int64 input,Span<Byte> output)
398{
399 for (Integer i=0; i<8; ++i ){
400 Byte v = (Byte)(input % 256);
401 output[(i*2)] = global_hexa[v/16];
402 output[(i*2)+1] = global_hexa[v%16];
403 input = input / 256;
404 }
405}
406
407/*---------------------------------------------------------------------------*/
408/*---------------------------------------------------------------------------*/
409
411toHexaString(Real input)
412{
413 return toHexaString(ByteConstArrayView(sizeof(Real),(Byte*)&input));
414}
415
416/*---------------------------------------------------------------------------*/
417/*---------------------------------------------------------------------------*/
418
419namespace Convert
420{
421
422template<typename T> std::optional<T>
424{
425 T v;
426 if (s.empty())
427 return std::nullopt;
428 bool is_bad = builtInGetValue(v,s);
429 if (is_bad)
430 return std::nullopt;
431 return v;
432}
433
434template<typename T> std::optional<T>
436{
437 String env_value = platform::getEnvironmentVariable(s);
438 if (env_value.null())
439 return std::nullopt;
440 auto v = tryParse(env_value);
441 if (!v && throw_if_invalid)
442 ARCANE_FATAL("Invalid value '{0}' for environment variable {1}. Can not convert to type '{2}'",
443 env_value,s,typeToName(T{}));
444 return v;
445}
446
447template class ScalarType<Int32>;
448template class ScalarType<Int64>;
449template class ScalarType<Real>;
450
451}
452
453/*---------------------------------------------------------------------------*/
454/*---------------------------------------------------------------------------*/
455
456} // End namespace Arcane
457
458/*---------------------------------------------------------------------------*/
459/*---------------------------------------------------------------------------*/
460
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
static std::optional< T > tryParseFromEnvironment(StringView s, bool throw_if_invalid)
Convertit la valeur de la variable d'environnement s en le type T.
Definition Convert.cc:435
static std::optional< T > tryParse(StringView s)
Convertit s en le type T.
Definition Convert.cc:423
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
Vecteur 1D de données avec sémantique par référence.
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
Vue sur une chaîne de caractères UTF-8.
Definition StringView.h:47
constexpr bool empty() const ARCCORE_NOEXCEPT
Vrai si la chaîne est nulle ou vide.
Definition StringView.h:105
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:304
Integer len(const char *s)
Retourne la longueur de la chaîne s.
String toHexaString(ByteConstArrayView input)
Converti un tableau d'octet en sa représentation hexadécimale.
Definition Convert.cc:388
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Array< Real2 > Real2Array
Tableau dynamique à une dimension de vecteurs de rang 2.
Definition UtilsTypes.h:339
UniqueArray< Real2x2 > Real2x2UniqueArray
Tableau dynamique à une dimension de tenseurs de rang 2.
Definition UtilsTypes.h:531
Array< Int64 > Int64Array
Tableau dynamique à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:325
bool builtInPutValue(const String &v, String &s)
Converti la valeur v dans la chaîne s.
Definition Convert.cc:291
SharedArray< Real > RealSharedArray
Tableau dynamique à une dimension de réels.
Definition UtilsTypes.h:553
UniqueArray< Real3x3 > Real3x3UniqueArray
Tableau dynamique à une dimension de tenseurs de rang 3.
Definition UtilsTypes.h:533
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:513
Array< String > StringArray
Tableau dynamique à une dimension de chaînes de caractères.
Definition UtilsTypes.h:337
Array< bool > BoolArray
Tableau dynamique à une dimension de booléens.
Definition UtilsTypes.h:335
Array< Real3x3 > Real3x3Array
Tableau dynamique à une dimension de tenseurs de rang 3.
Definition UtilsTypes.h:345
UniqueArray< Real3 > Real3UniqueArray
Tableau dynamique à une dimension de vecteurs de rang 3.
Definition UtilsTypes.h:529
UniqueArray< Int16 > Int16UniqueArray
Tableau dynamique à une dimension d'entiers 16 bits.
Definition UtilsTypes.h:517
UniqueArray< bool > BoolUniqueArray
Tableau dynamique à une dimension de booléens.
Definition UtilsTypes.h:523
SharedArray< String > StringSharedArray
Tableau dynamique à une dimension de chaînes de caractères.
Definition UtilsTypes.h:557
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:634
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:515
SharedArray< Real3x3 > Real3x3SharedArray
Tableau dynamique à une dimension de tenseurs de rang 3.
Definition UtilsTypes.h:565
SharedArray< bool > BoolSharedArray
Tableau dynamique à une dimension de booléens.
Definition UtilsTypes.h:555
UniqueArray< Real > RealUniqueArray
Tableau dynamique à une dimension de réels.
Definition UtilsTypes.h:521
unsigned char Byte
Type d'un octet.
Definition UtilsTypes.h:142
Array< Real2x2 > Real2x2Array
Tableau dynamique à une dimension de tenseurs de rang 2.
Definition UtilsTypes.h:343
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:327
Array< Real > RealArray
Tableau dynamique à une dimension de réels.
Definition UtilsTypes.h:333
UniqueArray< String > StringUniqueArray
Tableau dynamique à une dimension de chaînes de caractères.
Definition UtilsTypes.h:525
SharedArray< Int16 > Int16SharedArray
Tableau dynamique à une dimension d'entiers 16 bits.
Definition UtilsTypes.h:549
UniqueArray< Real2 > Real2UniqueArray
Tableau dynamique à une dimension de vecteurs de rang 2.
Definition UtilsTypes.h:527
SharedArray< Real2 > Real2SharedArray
Tableau dynamique à une dimension de vecteurs de rang 2.
Definition UtilsTypes.h:559
Array< Real3 > Real3Array
Tableau dynamique à une dimension de vecteurs de rang 3.
Definition UtilsTypes.h:341
double Real
Type représentant un réel.