Arcane  4.2.1.0
User documentation
Loading...
Searching...
No Matches
ValueConvert.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* ValueConvert.h (C) 2000-2026 */
9/* */
10/* Functions to convert a character string into a given type. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_VALUECONVERT_H
13#define ARCANE_UTILS_VALUECONVERT_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Iostream.h"
18#include "arcane/utils/String.h"
19#include "arcane/utils/Array.h"
20#include "arcane/utils/NumericTypes.h"
21#include "arcane/utils/Convert.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane::Impl
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31/*!
32 * \brief Encapsulates an std::istream for a StringView.
33 *
34 * Currently (C++20) std::istringstream uses
35 * an std::string for input, which requires an instance of this type
36 * and thus a potential allocation. This class serves to avoid
37 * this by directly using the memory pointed to by the instance
38 * of StringView passed in the constructor. The latter must
39 * remain valid throughout the use of this class.
40 */
41class ARCANE_UTILS_EXPORT StringViewInputStream
42: private std::streambuf
43{
44 public:
45
46 StringViewInputStream(StringView v);
47
48 public:
49
50 std::istream& stream() { return m_stream; }
51
52 private:
53
54 StringView m_view;
55 std::istream m_stream;
56};
57
58/*---------------------------------------------------------------------------*/
59/*---------------------------------------------------------------------------*/
60
61/*!
62 * \brief Converts the value of the string \a s into the basic type \a T
63 * and stores the value in \a v.
64 *
65 * \retval true in case of failure.
66 * \retval false in case of success
67 */
68template <class T> inline bool
69builtInGetValueGeneric(T& v, StringView s)
70{
71 T read_val = T();
73 std::istream& sbuf = svis.stream();
74 sbuf >> read_val;
75 if (sbuf.fail() || sbuf.bad())
76 return true;
77 if (!sbuf.eof())
78 return true;
79 v = read_val;
80 return false;
81}
82
83/*---------------------------------------------------------------------------*/
84/*---------------------------------------------------------------------------*/
85
86} // namespace Arcane::Impl
87
88/*---------------------------------------------------------------------------*/
89/*---------------------------------------------------------------------------*/
90
91namespace Arcane
92{
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96
97/*!
98 * \brief Converts the value of the string \a s into the basic type \a T
99 * and stores the value in \a v.
100 *
101 * \retval true in case of failure.
102 * \retval false in case of success
103 */
104template <class T> inline bool
105builtInGetValue(T& v, StringView s)
106{
107 return Arcane::Impl::builtInGetValueGeneric(v, s);
108}
109
110/*---------------------------------------------------------------------------*/
111/*---------------------------------------------------------------------------*/
112
113template <> ARCANE_UTILS_EXPORT bool builtInGetValue(String& v, StringView s);
114template <> ARCANE_UTILS_EXPORT bool builtInGetValue(double& v, StringView s);
115template <> ARCANE_UTILS_EXPORT bool builtInGetValue(float& v, StringView s);
116template <> ARCANE_UTILS_EXPORT bool builtInGetValue(int& v, StringView s);
117template <> ARCANE_UTILS_EXPORT bool builtInGetValue(unsigned int& v, StringView s);
118template <> ARCANE_UTILS_EXPORT bool builtInGetValue(long& v, StringView s);
119template <> ARCANE_UTILS_EXPORT bool builtInGetValue(long long& v, StringView s);
120template <> ARCANE_UTILS_EXPORT bool builtInGetValue(short& v, StringView s);
121template <> ARCANE_UTILS_EXPORT bool builtInGetValue(unsigned short& v, StringView s);
122template <> ARCANE_UTILS_EXPORT bool builtInGetValue(unsigned long& v, StringView s);
123template <> ARCANE_UTILS_EXPORT bool builtInGetValue(unsigned long long& v, StringView s);
124template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Float16& v, StringView s);
125template <> ARCANE_UTILS_EXPORT bool builtInGetValue(BFloat16& v, StringView s);
126template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Float128& v, StringView s);
127template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int128& v, StringView s);
128#ifdef ARCANE_REAL_NOT_BUILTIN
129template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real& v, StringView s);
130#endif
131template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2& v, StringView s);
132template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3& v, StringView s);
133template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2x2& v, StringView s);
134template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3x3& v, StringView s);
135
136template <> ARCANE_UTILS_EXPORT bool builtInGetValue(RealArray& v, StringView s);
137template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2Array& v, StringView s);
138template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3Array& v, StringView s);
139template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2x2Array& v, StringView s);
140template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3x3Array& v, StringView s);
141template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int8Array& v, StringView s);
142template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int16Array& v, StringView s);
143template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int32Array& v, StringView s);
144template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int64Array& v, StringView s);
145template <> ARCANE_UTILS_EXPORT bool builtInGetValue(BFloat16Array& v, StringView s);
146template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Float16Array& v, StringView s);
147template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Float32Array& v, StringView s);
148template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Array<Float128>& v, StringView s);
149template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Array<Int128>& v, StringView s);
150template <> ARCANE_UTILS_EXPORT bool builtInGetValue(BoolArray& v, StringView s);
151template <> ARCANE_UTILS_EXPORT bool builtInGetValue(StringArray& v, StringView s);
152
153template <> ARCANE_UTILS_EXPORT bool builtInGetValue(RealSharedArray& v, StringView s);
154template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2SharedArray& v, StringView s);
155template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3SharedArray& v, StringView s);
156template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2x2SharedArray& v, StringView s);
157template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3x3SharedArray& v, StringView s);
158template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int8SharedArray& v, StringView s);
159template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int16SharedArray& v, StringView s);
160template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int32SharedArray& v, StringView s);
161template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int64SharedArray& v, StringView s);
162template <> ARCANE_UTILS_EXPORT bool builtInGetValue(BFloat16SharedArray& v, StringView s);
163template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Float16SharedArray& v, StringView s);
164template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Float32SharedArray& v, StringView s);
165template <> ARCANE_UTILS_EXPORT bool builtInGetValue(SharedArray<Float128>& v, StringView s);
166template <> ARCANE_UTILS_EXPORT bool builtInGetValue(SharedArray<Int128>& v, StringView s);
167template <> ARCANE_UTILS_EXPORT bool builtInGetValue(BoolSharedArray& v, StringView s);
168template <> ARCANE_UTILS_EXPORT bool builtInGetValue(StringSharedArray& v, StringView s);
169
170template <> ARCANE_UTILS_EXPORT bool builtInGetValue(RealUniqueArray& v, StringView s);
171template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2UniqueArray& v, StringView s);
172template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3UniqueArray& v, StringView s);
173template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real2x2UniqueArray& v, StringView s);
174template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Real3x3UniqueArray& v, StringView s);
175template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int8UniqueArray& v, StringView s);
176template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int16UniqueArray& v, StringView s);
177template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int32UniqueArray& v, StringView s);
178template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Int64UniqueArray& v, StringView s);
179template <> ARCANE_UTILS_EXPORT bool builtInGetValue(BFloat16UniqueArray& v, StringView s);
180template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Float16UniqueArray& v, StringView s);
181template <> ARCANE_UTILS_EXPORT bool builtInGetValue(Float32UniqueArray& v, StringView s);
182template <> ARCANE_UTILS_EXPORT bool builtInGetValue(UniqueArray<Float128>& v, StringView s);
183template <> ARCANE_UTILS_EXPORT bool builtInGetValue(UniqueArray<Int128>& v, StringView s);
184template <> ARCANE_UTILS_EXPORT bool builtInGetValue(BoolUniqueArray& v, StringView s);
185template <> ARCANE_UTILS_EXPORT bool builtInGetValue(StringUniqueArray& v, StringView s);
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
189
190/*!
191 * \brief Converts the value of the string \a s to a Boolean
192 *
193 * Stores the converted value in \a v.
194 *
195 * \retval returns true on failure; the value of \a v remains unchanged
196 * \retval returns false on success
197 */
198inline bool
199builtInGetValue(bool& v, StringView s)
200{
201 if (s.empty())
202 return true;
203 if (s == "false" || s == "faux" || s == "0") {
204 v = false;
205 return false;
206 }
207
208 if (s == "true" || s == "vrai" || s == "1") {
209 v = true;
210 return false;
211 }
212 return true;
213}
214
215/*---------------------------------------------------------------------------*/
216/*---------------------------------------------------------------------------*/
217
218/*!
219 * \brief Converts the value of the string \a s to the basic type \a T
220 * and stores the value in \a v.
221 *
222 * \retval true on failure.
223 * \retval false on success
224 */
225template <class T> inline bool
226builtInGetValue(T& v, const String& s)
227{
228 return builtInGetValue(v, s.view());
229}
230
231//! Spécialisation pour 'String'
232template <> inline bool
233builtInGetValue(String& v, const String& s)
234{
235 v = s;
236 return false;
237}
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
242/*!
243 * \brief Converts the value of the string \a s to the basic type \a T
244 * and stores the value in \a v.
245 *
246 * \retval true on failure.
247 * \retval false on success
248 */
249template <class T> inline bool
250builtInGetValue(T& v, const char* s)
251{
252 return builtInGetValue(v, StringView(s));
253}
254
255/*---------------------------------------------------------------------------*/
256/*---------------------------------------------------------------------------*/
257
258//@{
259/*!
260 * \brief Converti la valeur \a v dans la chaîne \a s.
261 *
262 * \retval true en cas d'échec.
263 * \retval false en cas de succès
264 */
265ARCANE_UTILS_EXPORT bool builtInPutValue(const String& v, String& s);
266ARCANE_UTILS_EXPORT bool builtInPutValue(double v, String& s);
267ARCANE_UTILS_EXPORT bool builtInPutValue(float v, String& s);
268ARCANE_UTILS_EXPORT bool builtInPutValue(int v, String& s);
269ARCANE_UTILS_EXPORT bool builtInPutValue(unsigned int v, String& s);
270ARCANE_UTILS_EXPORT bool builtInPutValue(long v, String& s);
271ARCANE_UTILS_EXPORT bool builtInPutValue(long long v, String& s);
272ARCANE_UTILS_EXPORT bool builtInPutValue(short v, String& s);
273ARCANE_UTILS_EXPORT bool builtInPutValue(unsigned short v, String& s);
274ARCANE_UTILS_EXPORT bool builtInPutValue(unsigned long v, String& s);
275ARCANE_UTILS_EXPORT bool builtInPutValue(unsigned long long v, String& s);
276#ifdef ARCANE_REAL_NOT_BUILTIN
277ARCANE_UTILS_EXPORT bool builtInPutValue(Real v, String& s);
278#endif
279ARCANE_UTILS_EXPORT bool builtInPutValue(Real2 v, String& s);
280ARCANE_UTILS_EXPORT bool builtInPutValue(Real3 v, String& s);
281ARCANE_UTILS_EXPORT bool builtInPutValue(const Real2x2& v, String& s);
282ARCANE_UTILS_EXPORT bool builtInPutValue(const Real3x3& v, String& s);
283ARCANE_UTILS_EXPORT bool builtInPutValue(Span<const Real> v, String& s);
284ARCANE_UTILS_EXPORT bool builtInPutValue(Span<const Real2> v, String& s);
285ARCANE_UTILS_EXPORT bool builtInPutValue(Span<const Real3> v, String& s);
286ARCANE_UTILS_EXPORT bool builtInPutValue(Span<const Real2x2> v, String& s);
287ARCANE_UTILS_EXPORT bool builtInPutValue(Span<const Real3x3> v, String& s);
288ARCANE_UTILS_EXPORT bool builtInPutValue(Span<const Int16> v, String& s);
289ARCANE_UTILS_EXPORT bool builtInPutValue(Span<const Int32> v, String& s);
290ARCANE_UTILS_EXPORT bool builtInPutValue(Span<const Int64> v, String& s);
291ARCANE_UTILS_EXPORT bool builtInPutValue(Span<const bool> v, String& s);
292ARCANE_UTILS_EXPORT bool builtInPutValue(Span<const String> v, String& s);
293//@}
294
295/*---------------------------------------------------------------------------*/
296/*---------------------------------------------------------------------------*/
297
298inline const char* typeToName(bool)
299{
300 return "boolean";
301}
302inline const char* typeToName(Real)
303{
304 return "real";
305}
306inline const char* typeToName(Real2)
307{
308 return "real2";
309}
310inline const char* typeToName(Real3)
311{
312 return "real3";
313}
314inline const char* typeToName(Real2x2)
315{
316 return "real2x2";
317}
318inline const char* typeToName(Real3x3)
319{
320 return "real3x3";
321}
322inline const char* typeToName(short)
323{
324 return "short";
325}
326inline const char* typeToName(unsigned short)
327{
328 return "unsigned short";
329}
330inline const char* typeToName(int)
331{
332 return "integer";
333}
334inline const char* typeToName(long)
335{
336 return "long";
337}
338inline const char* typeToName(unsigned long)
339{
340 return "unsigned long";
341}
342inline const char* typeToName(unsigned long long)
343{
344 return "unsigned long long";
345}
346inline const char* typeToName(const String&)
347{
348 return "string";
349}
350inline const char* typeToName(long long)
351{
352 return "long long";
353}
354inline const char* typeToName(unsigned int)
355{
356 return "unsigned integer";
357}
358inline const char* typeToName(BFloat16)
359{
360 return "bfloat16";
361}
362inline const char* typeToName(Float16)
363{
364 return "float16";
365}
366inline const char* typeToName(Float32)
367{
368 return "float32";
369}
370inline const char* typeToName(Float128)
371{
372 return "float128";
373}
374inline const char* typeToName(Int128)
375{
376 return "int128";
377}
378inline const char* typeToName(const StringArray&)
379{
380 return "string[]";
381}
382inline const char* typeToName(const BoolArray&)
383{
384 return "boolean[]";
385}
386inline const char* typeToName(const RealArray&)
387{
388 return "real[]";
389}
390inline const char* typeToName(const Real2Array&)
391{
392 return "real2[]";
393}
394inline const char* typeToName(const Real3Array&)
395{
396 return "real3[]";
397}
398inline const char* typeToName(const Real2x2Array&)
399{
400 return "real2x2[]";
401}
402inline const char* typeToName(const Real3x3Array&)
403{
404 return "real3x3[]";
405}
406inline const char* typeToName(const Int16Array&)
407{
408 return "Int16[]";
409}
410inline const char* typeToName(const Int32Array&)
411{
412 return "Int32[]";
413}
414inline const char* typeToName(const Int64Array&)
415{
416 return "Int64[]";
417}
418
419/*---------------------------------------------------------------------------*/
420/*---------------------------------------------------------------------------*/
421
422} // End namespace Arcane
423
424/*---------------------------------------------------------------------------*/
425/*---------------------------------------------------------------------------*/
426
427#endif
Half-precision floating-point type.
Encapsulates an std::istream for a StringView.
Class managing a 2-dimensional real vector.
Class managing a 2x2 matrix of reals.
Class managing a 3-dimensional real vector.
Class managing a 3x3 real matrix.
View of a UTF-8 character string.
Definition StringView.h:44
constexpr bool empty() const ARCCORE_NOEXCEPT
True if the string is null or empty.
Definition StringView.h:102
StringView view() const
Returns a view of the current string.
Definition String.cc:369
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
SharedArray< Int64 > Int64SharedArray
Dynamic 1D array of 64-bit integers.
Definition UtilsTypes.h:373
Array< Real2 > Real2Array
Dynamic one-dimensional array of rank 2 vectors.
Definition UtilsTypes.h:141
UniqueArray< Real2x2 > Real2x2UniqueArray
Dynamic 1D array of rank 2 tensors.
Definition UtilsTypes.h:359
Array< Int64 > Int64Array
Dynamic one-dimensional array of 64-bit integers.
Definition UtilsTypes.h:119
bool builtInPutValue(const String &v, String &s)
Converti la valeur v dans la chaîne s.
SharedArray< Real > RealSharedArray
Dynamic 1D array of reals.
Definition UtilsTypes.h:383
UniqueArray< Real3x3 > Real3x3UniqueArray
Dynamic 1D array of rank 3 tensors.
Definition UtilsTypes.h:361
SharedArray< Float32 > Float32SharedArray
Dynamic 1D array of 'float'.
Definition UtilsTypes.h:389
UniqueArray< Float32 > Float32UniqueArray
Dynamic 1D array of 'float'.
Definition UtilsTypes.h:349
UniqueArray< Int64 > Int64UniqueArray
Dynamic 1D array of 64-bit integers.
Definition UtilsTypes.h:333
UniqueArray< BFloat16 > BFloat16UniqueArray
Dynamic 1D array of 'bfloat16'.
Definition UtilsTypes.h:345
Array< String > StringArray
Dynamic one-dimensional array of strings.
Definition UtilsTypes.h:139
UniqueArray< Float16 > Float16UniqueArray
Dynamic 1D array of 'float16'.
Definition UtilsTypes.h:347
SharedArray< Float16 > Float16SharedArray
Dynamic 1D array of 'float16'.
Definition UtilsTypes.h:387
Array< bool > BoolArray
Dynamic one-dimensional array of booleans.
Definition UtilsTypes.h:137
SharedArray< Int8 > Int8SharedArray
Dynamic 1D array of 8-bit integers.
Definition UtilsTypes.h:379
Array< Real3x3 > Real3x3Array
Dynamic one-dimensional array of rank 3 tensors.
Definition UtilsTypes.h:147
Array< Int16 > Int16Array
Dynamic one-dimensional array of 16-bit integers.
Definition UtilsTypes.h:123
Array< Float16 > Float16Array
Dynamic one-dimensional array of 'float16'.
Definition UtilsTypes.h:133
Array< BFloat16 > BFloat16Array
Dynamic one-dimensional array of 'bfloat16'.
Definition UtilsTypes.h:131
UniqueArray< Real3 > Real3UniqueArray
Dynamic 1D array of rank 3 vectors.
Definition UtilsTypes.h:357
SharedArray< Real3 > Real3SharedArray
Dynamic 1D array of rank 3 vectors.
Definition UtilsTypes.h:397
UniqueArray< Int16 > Int16UniqueArray
Dynamic 1D array of 16-bit integers.
Definition UtilsTypes.h:337
UniqueArray< bool > BoolUniqueArray
Dynamic 1D array of booleans.
Definition UtilsTypes.h:351
Array< Int8 > Int8Array
Dynamic one-dimensional array of 8-bit integers.
Definition UtilsTypes.h:125
SharedArray< String > StringSharedArray
Dynamic 1D array of strings.
Definition UtilsTypes.h:393
SharedArray< BFloat16 > BFloat16SharedArray
Dynamic 1D array of 'bfloat16'.
Definition UtilsTypes.h:385
SharedArray< Int32 > Int32SharedArray
Dynamic 1D array of 32-bit integers.
Definition UtilsTypes.h:375
UniqueArray< Int32 > Int32UniqueArray
Dynamic 1D array of 32-bit integers.
Definition UtilsTypes.h:335
SharedArray< Real3x3 > Real3x3SharedArray
Dynamic 1D array of rank 3 tensors.
Definition UtilsTypes.h:401
SharedArray< bool > BoolSharedArray
Dynamic 1D array of booleans.
Definition UtilsTypes.h:391
UniqueArray< Real > RealUniqueArray
Dynamic 1D array of reals.
Definition UtilsTypes.h:343
double Real
Type representing a real number.
Array< Real2x2 > Real2x2Array
Dynamic one-dimensional array of rank 2 tensors.
Definition UtilsTypes.h:145
Array< Int32 > Int32Array
Dynamic one-dimensional array of 32-bit integers.
Definition UtilsTypes.h:121
Array< Real > RealArray
Dynamic one-dimensional array of reals.
Definition UtilsTypes.h:129
UniqueArray< String > StringUniqueArray
Dynamic 1D array of strings.
Definition UtilsTypes.h:353
float Float32
IEEE-753 single-precision floating-point type.
SharedArray< Int16 > Int16SharedArray
Dynamic 1D array of 16-bit integers.
Definition UtilsTypes.h:377
SharedArray< Real2x2 > Real2x2SharedArray
Dynamic 1D array of rank 2 tensors.
Definition UtilsTypes.h:399
UniqueArray< Real2 > Real2UniqueArray
Dynamic 1D array of rank 2 vectors.
Definition UtilsTypes.h:355
SharedArray< Real2 > Real2SharedArray
Dynamic 1D array of rank 2 vectors.
Definition UtilsTypes.h:395
Array< Float32 > Float32Array
Dynamic one-dimensional array of 'float'.
Definition UtilsTypes.h:135
UniqueArray< Int8 > Int8UniqueArray
Dynamic 1D array of 8-bit integers.
Definition UtilsTypes.h:339
Array< Real3 > Real3Array
Dynamic one-dimensional array of rank 3 vectors.
Definition UtilsTypes.h:143