Arcane  v3.15.3.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ValueConvert.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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.cc (C) 2000-2025 */
9/* */
10/* Fonctions pour convertir une chaîne de caractère en un type donné. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ValueConvert.h"
15
16#include "arcane/utils/OStringStream.h"
17#include "arcane/utils/NotSupportedException.h"
18#include "arcane/utils/internal/ValueConvertInternal.h"
19
20// En théorie std::from_chars() est disponible avec le C++17 mais pour
21// GCC cela n'est implémenté pour les flottants qu'à partir de GCC 11.
22// Comme c'est la version requise pour le C++20, on n'active cette fonctionnalité
23// qu'à partir du C++20.
24#if defined(ARCANE_HAS_CXX20)
25#define ARCANE_USE_FROMCHARS
26#endif
27
28#if defined(ARCANE_USE_FROMCHARS)
29#include <charconv>
30#endif
31
32// TODO: Pour builtInGetValue(), retourner `true` si la chaîne en entrée est vide.
33
34/*---------------------------------------------------------------------------*/
35/*---------------------------------------------------------------------------*/
36
37namespace Arcane
38{
39namespace
40{
41 /*!
42 * \brief Retourne \a s converti en \a 'const char*'.
43 *
44 * \warning Si la valeur retournée est utilisée pour une fonction C,
45 * il faut être sur que \a s a un '\0' terminal.
46 */
47 const char* _stringViewData(StringView s)
48 {
49 return reinterpret_cast<const char*>(s.bytes().data());
50 }
51
52 /*!
53 * \brief Retourne une vue en supprimant les caratères blancs du début.
54 *
55 * Un caractère blanc est un caractère pour lequel std::isspace() est vrai.
56 * \a pos indique la position dans \a s à partir de laquelle
57 * on cherche les blancs.
58 */
59 StringView _removeLeadingSpaces(StringView s, Int64 pos = 0)
60 {
61 Span<const Byte> bytes = s.bytes();
62 Int64 nb_byte = bytes.size();
63 // Supprime les espaces potentiels
64 for (; pos < nb_byte; ++pos) {
65 int charv = static_cast<unsigned char>(bytes[pos]);
66 // Visual Studio 2017 or less
67#if defined(_MSC_VER) && _MSC_VER <= 1916
68 if (std::isspace(charv, std::locale()) != 0)
69 break;
70#else
71 if (!std::isspace(charv) != 0)
72 break;
73#endif
74 }
75 return s.subView(pos, nb_byte);
76 }
77} // namespace
78
79/*---------------------------------------------------------------------------*/
80/*---------------------------------------------------------------------------*/
81
82impl::StringViewInputStream::
83StringViewInputStream(StringView v)
84: m_view(v)
85, m_stream(this)
86{
87 auto b = v.bytes();
88 char* begin_ptr = const_cast<char*>(reinterpret_cast<const char*>(b.data()));
89 char* end_ptr = begin_ptr + b.size();
90 setg(begin_ptr, begin_ptr, end_ptr);
91}
92
93/*---------------------------------------------------------------------------*/
94/*---------------------------------------------------------------------------*/
95
96namespace
97{
98 Int32 global_value_convert_verbosity = 0;
99 bool global_use_from_chars = true;
100 bool global_use_same_value_convert_for_all_real = false;
101} // namespace
102
103/*---------------------------------------------------------------------------*/
104/*---------------------------------------------------------------------------*/
105
106void impl::
107arcaneSetIsValueConvertUseFromChars(bool v)
108{
109 global_use_from_chars = v;
110}
111
112void impl::
113arcaneSetValueConvertVerbosity(Int32 v)
114{
115 global_value_convert_verbosity = v;
116}
117
118void impl::
119arcaneSetUseSameValueConvertForAllReal(bool v)
120{
121 global_use_same_value_convert_for_all_real = v;
122}
123
124/*---------------------------------------------------------------------------*/
125/*---------------------------------------------------------------------------*/
126/*!
127 * \brief Classe pour convertir une 'StringView' en 'double'.
128 */
130{
131 public:
132
133 static Int64 _getDoubleValueWithFromChars(double& v, StringView s);
134 static Int64 _getDoubleValue(double& v, StringView s);
135};
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139/*!
140 * \brief Converti \a s en un double.
141 *
142 * Utilise std::from_chars() si \a global_use_from_chars est vrai.
143 * Sinon, utilise strtod().
144 */
145Int64 StringViewToDoubleConverter::
146_getDoubleValue(double& v, StringView s)
147{
148#if defined(ARCANE_USE_FROMCHARS)
151 Int64 p = _getDoubleValueWithFromChars(v, s);
152 return p;
153 }
154#endif
155
156 const char* ptr = _stringViewData(s);
157#ifdef WIN32
158 if (s == "infinity" || s == "inf") {
159 v = std::numeric_limits<double>::infinity();
160 return s.size();
161 }
162#endif
163 char* ptr2 = nullptr;
164 if (ptr)
165 v = ::strtod(ptr, &ptr2);
166 return (ptr2 - ptr);
167}
168
169/*---------------------------------------------------------------------------*/
170/*---------------------------------------------------------------------------*/
171/*!
172 * \brief Converti une chaîne de caractères en un double.
173 *
174 * Converti \a s en un double et range la valeur dans \a v.
175 * Il ne doit pas y avoir de caractères blancs au début de \a s.
176 *
177 * Le comportement de cette méthode est identique à std::strtod()
178 * avec le locale 'C' si on est en C++20. Sinon il est identique
179 * à std::strtod() avec le locale actuel (ce qui peut changer par exemple
180 * le séparateur décimal). La documentation de référence est
181 * ici: https://en.cppreference.com/w/cpp/utility/from_chars.
182 *
183 * \retval (-1) si la conversion a échouée.
184 * \retval la position dans \s du dernier caratère lu plus 1.
185 */
186Int64 StringViewToDoubleConverter::
187_getDoubleValueWithFromChars(double& v, StringView s)
188{
189#if defined(ARCANE_USE_FROMCHARS)
190 // NOTE: si on veut le même comportement que 'strtod',
191 // on suppose que l'appelant a enlevé les blancs en début de s.
192 auto bytes = s.bytes();
193 Int64 size = bytes.size();
194 if (size == 0)
195 // NOTE: Avec la version historique d'Arcane (avant la 3.15) il
196 // n'y avait pas d'erreur retournée lorsqu'on converti une chaîne vide.
197 // A priori cela n'était jamais utilisé donc cela ne pose pas de
198 // problème de corriger ce bug.
199 return (-1);
200 const char* orig_data = reinterpret_cast<const char*>(bytes.data());
201 const char* last_ptr = nullptr;
202 std::chars_format fmt = std::chars_format::general;
203 const char* data = orig_data;
204 bool do_negatif = false;
206
207 // std::from_chars() ne supporte pas les '+' en début alors
208 // que 'strto*' le supporte.
209 if (bytes[0] == '+') {
210 ++data;
211 --size;
212 bytes = bytes.subspan(1, size);
213 }
214 // std::from_chars() peut lire les valeurs au format hexadécimal
215 // mais il ne doit pas contenir le '0x' ou '0X' du début, contrairement
216 // à std::strtod(). On détecte ce cas et on commence la conversion
217 // après le '0x' ou '0X'.
218 // Détecte '-0x' ou '-0X'
219 if (size >= 3 && (bytes[0] == '-') && (bytes[1] == '0') && (bytes[2] == 'x' || bytes[2] == 'X')) {
220 fmt = std::chars_format::hex;
221 data += 3;
222 do_negatif = true;
223 }
224 // Détecte '0x' ou '0X'
225 else if (size >= 2 && (bytes[0] == '0') && (bytes[1] == 'x' || bytes[1] == 'X')) {
226 fmt = std::chars_format::hex;
227 data += 2;
228 }
229 // Cas général
230 {
231 auto [ptr, ec] = std::from_chars(data, data + size, v, fmt);
232 last_ptr = ptr;
233 if (is_verbose)
234 std::cout << "FromChars:TRY GET_DOUBLE data=" << data << " v=" << v << " is_ok=" << (ec == std::errc()) << "\n";
235 if (ec != std::errc())
236 return (-1);
237 }
238 // Prend en compte le signe '-' si demandé
239 if (do_negatif)
240 v = -v;
241 if (is_verbose) {
242 char* ptr2 = nullptr;
243 double v2 = ::strtod(orig_data, &ptr2);
244 std::cout << "FromChars: COMPARE GET_DOUBLE via strtod v2=" << v2 << " pos=" << (ptr2 - orig_data) << "\n";
245 }
246 return (last_ptr - orig_data);
247#else
248 ARCANE_THROW(NotSupportedException, "using std::from_chars() is not available on this platform");
249#endif
250}
251
252/*---------------------------------------------------------------------------*/
253/*---------------------------------------------------------------------------*/
254
255/*---------------------------------------------------------------------------*/
256/*---------------------------------------------------------------------------*/
257
258template <> ARCANE_UTILS_EXPORT bool
259builtInGetValue(double& v, StringView s)
260{
261#if defined(ARCANE_USE_FROMCHARS)
264 Int64 p = StringViewToDoubleConverter::_getDoubleValueWithFromChars(v, s);
265 return (p == (-1) || (p != s.size()));
266 }
267#endif
268
269 const char* ptr = _stringViewData(s);
270#ifdef WIN32
271 if (s == "infinity" || s == "inf") {
272 v = std::numeric_limits<double>::infinity();
273 return false;
274 }
275#endif
276 char* ptr2 = nullptr;
277 v = ::strtod(ptr, &ptr2);
278 return (ptr2 != (ptr + s.length()));
279}
280
281/*---------------------------------------------------------------------------*/
282/*---------------------------------------------------------------------------*/
283
284template <> ARCANE_UTILS_EXPORT bool
285builtInGetValue(BFloat16& v, StringView s)
286{
287 float z = 0.0;
288 bool r = builtInGetValue(z, s);
289 v = z;
290 return r;
291}
292
293template <> ARCANE_UTILS_EXPORT bool
294builtInGetValue(Float16& v, StringView s)
295{
296 float z = 0.0;
297 bool r = builtInGetValue(z, s);
298 v = z;
299 return r;
300}
301
302template <> ARCANE_UTILS_EXPORT bool
303builtInGetValue(Float128& v, StringView s)
304{
305 // Pour l'instant (12/2024), il n'y a pas de fonctions natives pour lire un Float128.
306 // On utilise donc un 'long double'.
307 // TODO: à implémenter correctement
308 long double z = 0.0;
309 bool r = builtInGetValue(z, s);
310 v = z;
311 return r;
312}
313
314template <> ARCANE_UTILS_EXPORT bool
315builtInGetValue(float& v, StringView s)
316{
317 double z = 0.;
318 bool r = builtInGetValue(z, s);
319 v = (float)z;
320 return r;
321}
322
323template <> ARCANE_UTILS_EXPORT bool
324builtInGetValue(long& v, StringView s)
325{
326 const char* ptr = _stringViewData(s);
327 char* ptr2 = 0;
328 v = ::strtol(ptr, &ptr2, 0);
329 return (ptr2 != (ptr + s.length()));
330}
331
332template <> ARCANE_UTILS_EXPORT bool
333builtInGetValue(int& v, StringView s)
334{
335 long z = 0;
336 bool r = builtInGetValue(z, s);
337 v = (int)z;
338 return r;
339}
340
341template <> ARCANE_UTILS_EXPORT bool
342builtInGetValue(short& v, StringView s)
343{
344 long z = 0;
345 bool r = builtInGetValue(z, s);
346 v = (short)z;
347 return r;
348}
349
350template <> ARCANE_UTILS_EXPORT bool
351builtInGetValue(unsigned long& v, StringView s)
352{
353 const char* ptr = _stringViewData(s);
354 char* ptr2 = 0;
355 v = ::strtoul(ptr, &ptr2, 0);
356 return (ptr2 != (ptr + s.length()));
357}
358
359template <> ARCANE_UTILS_EXPORT bool
360builtInGetValue(unsigned int& v, StringView s)
361{
362 unsigned long z = 0;
363 bool r = builtInGetValue(z, s);
364 v = (unsigned int)z;
365 return r;
366}
367
368template <> ARCANE_UTILS_EXPORT bool
369builtInGetValue(unsigned short& v, StringView s)
370{
371 unsigned long z = 0;
372 bool r = builtInGetValue(z, s);
373 v = (unsigned short)z;
374 return r;
375}
376
377template <> ARCANE_UTILS_EXPORT bool
378builtInGetValue(long long& v, StringView s)
379{
380 const char* ptr = _stringViewData(s);
381 char* ptr2 = 0;
382 v = ::strtoll(ptr, &ptr2, 0);
383 return (ptr2 != (ptr + s.length()));
384}
385
386template <> ARCANE_UTILS_EXPORT bool
387builtInGetValue(Real2& v, StringView s)
388{
389 if (global_use_same_value_convert_for_all_real) {
390 s = _removeLeadingSpaces(s);
391 v = {};
392 const bool is_verbose = global_value_convert_verbosity > 0;
393 if (is_verbose)
394 std::cout << "Try Read Real2: '" << s << "'\n";
395 Int64 p = StringViewToDoubleConverter::_getDoubleValue(v.x, s);
396 if (p == (-1))
397 return true;
398 s = _removeLeadingSpaces(s, p);
399 if (is_verbose)
400 std::cout << "VX=" << v.x << " remaining_s='" << s << "'\n";
401 p = StringViewToDoubleConverter::_getDoubleValue(v.y, s);
402 return (p == (-1) || (p != s.size()));
403 }
404 return impl::builtInGetValueGeneric(v, s);
405}
406
407template <> ARCANE_UTILS_EXPORT bool
408builtInGetValue(Real3& v, StringView s)
409{
410 if (global_use_same_value_convert_for_all_real) {
411 s = _removeLeadingSpaces(s);
412 v = {};
413 const bool is_verbose = global_value_convert_verbosity > 0;
414 if (is_verbose)
415 std::cout << "Try Read Real3: '" << s << "'\n";
416 Int64 p = StringViewToDoubleConverter::_getDoubleValue(v.x, s);
417 if (p == (-1) || (p == s.size()))
418 return true;
419 s = _removeLeadingSpaces(s, p);
420 if (is_verbose)
421 std::cout << "VX=" << v.x << " remaining_s='" << s << "'\n";
422 p = StringViewToDoubleConverter::_getDoubleValue(v.y, s);
423 if (p == (-1) || (p == s.size()))
424 return true;
425 s = _removeLeadingSpaces(s, p);
426 if (is_verbose)
427 std::cout << "VY=" << v.x << " remaining_s='" << s << "'\n";
428 p = StringViewToDoubleConverter::_getDoubleValue(v.z, s);
429 return (p == (-1) || (p != s.size()));
430 }
431 return impl::builtInGetValueGeneric(v, s);
432}
433
434template <> ARCANE_UTILS_EXPORT bool
435builtInGetValue(Real2x2& v, StringView s)
436{
437 return impl::builtInGetValueGeneric(v, s);
438}
439
440template <> ARCANE_UTILS_EXPORT bool
441builtInGetValue(Real3x3& v, StringView s)
442{
443 return impl::builtInGetValueGeneric(v, s);
444}
445
446template <> ARCANE_UTILS_EXPORT bool
447builtInGetValue(Int128& v, StringView s)
448{
449 // Pour l'instant (12/2024), il n'y a pas de fonctions natives pour lire un Int128.
450 // On utilise donc un 'Int64' en attendant.
451 // TODO: il existe des exemples sur internet. A implémenter correctement
452 long long v2 = 0;
453 const char* ptr = _stringViewData(s);
454 char* ptr2 = 0;
455 v2 = ::strtoll(ptr, &ptr2, 0);
456 v = v2;
457 return (ptr2 != (ptr + s.length()));
458}
459
460template <> ARCANE_UTILS_EXPORT bool
461builtInGetValue(unsigned long long& v, StringView s)
462{
463 const char* ptr = _stringViewData(s);
464 char* ptr2 = 0;
465 v = ::strtoull(ptr, &ptr2, 0);
466 return (ptr2 != (ptr + s.length()));
467}
468
469/*---------------------------------------------------------------------------*/
470/*---------------------------------------------------------------------------*/
471
472#ifdef ARCANE_REAL_NOT_BUILTIN
473template <> ARCANE_UTILS_EXPORT bool
474builtInGetValue(Real& v, StringView s)
475{
476#if 0
477 double vz = 0.0;
478 if (builtInGetValue(vz,s))
479 return true;
480 v = vz;
481 cout << "** CONVERT DOUBLE TO REAL s=" << s << " vz=" << vz << " v=" << v << '\n';
482 return false;
483#endif
484 double vz = 0.0;
485 if (builtInGetValue(vz, s))
486 return true;
487 v = Real((char*)s.localstr(), 1000);
488 cout << "** CONVERT DOUBLE TO REAL s=" << s << '\n';
489 return false;
490}
491#endif
492
493/*---------------------------------------------------------------------------*/
494/*---------------------------------------------------------------------------*/
495
496template <> bool
497builtInGetValue(String& v, StringView s)
498{
499 v = s;
500 return false;
501}
502
503/*---------------------------------------------------------------------------*/
504/*---------------------------------------------------------------------------*/
505
506namespace
507{
508 bool _builtInGetBoolArrayValue(BoolArray& v, StringView s)
509 {
510 // Le type 'bool' est un peu spécial car il doit pouvoir lire les
511 // valeurs comme 'true' ou 'false'.
512 // On le lit donc comme un 'StringUniqueArray', puis on converti en bool
513 //cout << "** GET BOOL ARRAY V=" << s << '\n';
514 //return builtInGetArrayValue(v,s);
515
517 if (builtInGetValue(sa, s))
518 return true;
519 for (Integer i = 0, is = sa.size(); i < is; ++i) {
520 bool read_val = false;
521 if (builtInGetValue(read_val, sa[i]))
522 return true;
523 v.add(read_val);
524 }
525 return false;
526 }
527
528 bool
529 _builtInGetStringArrayValue(StringArray& v, StringView s)
530 {
531 std::string s2;
532 String read_val = String();
533 impl::StringViewInputStream svis(s);
534 std::istream& sbuf = svis.stream();
535 while (!sbuf.eof()) {
536 sbuf >> s2;
537 //cout << " ** CHECK READ v='" << s2 << "' '" << sv << "'\n";
538 if (sbuf.bad()) // non-recoverable error
539 return true;
540 if (sbuf.fail()) // recoverable error : this means good conversion
541 return false;
542 read_val = StringView(s2.c_str());
543 v.add(read_val);
544 }
545 return false;
546 }
547} // namespace
548
549template <> ARCANE_UTILS_EXPORT bool
550builtInGetValue(RealArray& v, StringView s)
551{
552 return builtInGetArrayValue(v, s);
553}
554
555template <> ARCANE_UTILS_EXPORT bool
556builtInGetValue(Real2Array& v, StringView s)
557{
558 return builtInGetArrayValue(v, s);
559}
560
561template <> ARCANE_UTILS_EXPORT bool
562builtInGetValue(Real3Array& v, StringView s)
563{
564 return builtInGetArrayValue(v, s);
565}
566
567template <> ARCANE_UTILS_EXPORT bool
568builtInGetValue(Real2x2Array& v, StringView s)
569{
570 return builtInGetArrayValue(v, s);
571}
572
573template <> ARCANE_UTILS_EXPORT bool
574builtInGetValue(Real3x3Array& v, StringView s)
575{
576 return builtInGetArrayValue(v, s);
577}
578
579template <> ARCANE_UTILS_EXPORT bool
580builtInGetValue(Int8Array& v, StringView s)
581{
582 return builtInGetArrayValue(v, s);
583}
584
585template <> ARCANE_UTILS_EXPORT bool
586builtInGetValue(Int16Array& v, StringView s)
587{
588 return builtInGetArrayValue(v, s);
589}
590
591template <> ARCANE_UTILS_EXPORT bool
592builtInGetValue(Int32Array& v, StringView s)
593{
594 return builtInGetArrayValue(v, s);
595}
596
597template <> ARCANE_UTILS_EXPORT bool
598builtInGetValue(Int64Array& v, StringView s)
599{
600 return builtInGetArrayValue(v, s);
601}
602
603template <> ARCANE_UTILS_EXPORT bool
604builtInGetValue(BoolArray& v, StringView s)
605{
606 return _builtInGetBoolArrayValue(v, s);
607}
608
609template <> ARCANE_UTILS_EXPORT bool
610builtInGetValue(StringArray& v, StringView s)
611{
612 return _builtInGetStringArrayValue(v, s);
613}
614
615/*---------------------------------------------------------------------------*/
616/*---------------------------------------------------------------------------*/
617
618template <> ARCANE_UTILS_EXPORT bool
619builtInGetValue(RealUniqueArray& v, StringView s)
620{
621 return builtInGetArrayValue(v, s);
622}
623
624template <> ARCANE_UTILS_EXPORT bool
625builtInGetValue(Real2UniqueArray& v, StringView s)
626{
627 return builtInGetArrayValue(v, s);
628}
629
630template <> ARCANE_UTILS_EXPORT bool
631builtInGetValue(Real3UniqueArray& v, StringView s)
632{
633 return builtInGetArrayValue(v, s);
634}
635
636template <> ARCANE_UTILS_EXPORT bool
637builtInGetValue(Real2x2UniqueArray& v, StringView s)
638{
639 return builtInGetArrayValue(v, s);
640}
641
642template <> ARCANE_UTILS_EXPORT bool
643builtInGetValue(Real3x3UniqueArray& v, StringView s)
644{
645 return builtInGetArrayValue(v, s);
646}
647
648template <> ARCANE_UTILS_EXPORT bool
649builtInGetValue(Int8UniqueArray& v, StringView s)
650{
651 return builtInGetArrayValue(v, s);
652}
653
654template <> ARCANE_UTILS_EXPORT bool
655builtInGetValue(Int16UniqueArray& v, StringView s)
656{
657 return builtInGetArrayValue(v, s);
658}
659
660template <> ARCANE_UTILS_EXPORT bool
661builtInGetValue(Int32UniqueArray& v, StringView s)
662{
663 return builtInGetArrayValue(v, s);
664}
665
666template <> ARCANE_UTILS_EXPORT bool
667builtInGetValue(Int64UniqueArray& v, StringView s)
668{
669 return builtInGetArrayValue(v, s);
670}
671
672template <> ARCANE_UTILS_EXPORT bool
673builtInGetValue(BoolUniqueArray& v, StringView s)
674{
675 return _builtInGetBoolArrayValue(v, s);
676}
677
678template <> ARCANE_UTILS_EXPORT bool
679builtInGetValue(StringUniqueArray& v, StringView s)
680{
681 return _builtInGetStringArrayValue(v, s);
682}
683
684/*---------------------------------------------------------------------------*/
685/*---------------------------------------------------------------------------*/
686
687template <> ARCANE_UTILS_EXPORT bool
688builtInGetValue(RealSharedArray& v, StringView s)
689{
690 return builtInGetArrayValue(v, s);
691}
692
693template <> ARCANE_UTILS_EXPORT bool
694builtInGetValue(Real2SharedArray& v, StringView s)
695{
696 return builtInGetArrayValue(v, s);
697}
698
699template <> ARCANE_UTILS_EXPORT bool
700builtInGetValue(Real3SharedArray& v, StringView s)
701{
702 return builtInGetArrayValue(v, s);
703}
704
705template <> ARCANE_UTILS_EXPORT bool
706builtInGetValue(Real2x2SharedArray& v, StringView s)
707{
708 return builtInGetArrayValue(v, s);
709}
710
711template <> ARCANE_UTILS_EXPORT bool
712builtInGetValue(Real3x3SharedArray& v, StringView s)
713{
714 return builtInGetArrayValue(v, s);
715}
716
717template <> ARCANE_UTILS_EXPORT bool
718builtInGetValue(Int8SharedArray& v, StringView s)
719{
720 return builtInGetArrayValue(v, s);
721}
722
723template <> ARCANE_UTILS_EXPORT bool
724builtInGetValue(Int16SharedArray& v, StringView s)
725{
726 return builtInGetArrayValue(v, s);
727}
728
729template <> ARCANE_UTILS_EXPORT bool
730builtInGetValue(Int32SharedArray& v, StringView s)
731{
732 return builtInGetArrayValue(v, s);
733}
734
735template <> ARCANE_UTILS_EXPORT bool
736builtInGetValue(Int64SharedArray& v, StringView s)
737{
738 return builtInGetArrayValue(v, s);
739}
740
741template <> ARCANE_UTILS_EXPORT bool
742builtInGetValue(BoolSharedArray& v, StringView s)
743{
744 return _builtInGetBoolArrayValue(v, s);
745}
746
747template <> ARCANE_UTILS_EXPORT bool
748builtInGetValue(StringSharedArray& v, StringView s)
749{
750 return _builtInGetStringArrayValue(v, s);
751}
752
753/*---------------------------------------------------------------------------*/
754/*---------------------------------------------------------------------------*/
755
756namespace
757{
758 template <class T> inline bool
759 _builtInPutValue(const T& v, String& s)
760 {
761 OStringStream ostr;
762 ostr() << v;
763 if (ostr().fail() || ostr().bad())
764 return true;
765 s = ostr.str();
766 return false;
767 }
768 template <class T> inline bool
769 _builtInPutArrayValue(Span<const T> v, String& s)
770 {
771 OStringStream ostr;
772 for (Int64 i = 0, n = v.size(); i < n; ++i) {
773 if (i != 0)
774 ostr() << ' ';
775 ostr() << v[i];
776 }
777 if (ostr().fail() || ostr().bad())
778 return true;
779 s = ostr.str();
780 return false;
781 }
782} // namespace
783
784/*---------------------------------------------------------------------------*/
785/*---------------------------------------------------------------------------*/
786
787bool builtInPutValue(const String& v, String& s)
788{
789 return _builtInPutValue(v, s);
790}
791bool builtInPutValue(double v, String& s)
792{
793 return _builtInPutValue(v, s);
794}
795bool builtInPutValue(float v, String& s)
796{
797 return _builtInPutValue(v, s);
798}
799bool builtInPutValue(int v, String& s)
800{
801 return _builtInPutValue(v, s);
802}
803bool builtInPutValue(unsigned int v, String& s)
804{
805 return _builtInPutValue(v, s);
806}
807bool builtInPutValue(long v, String& s)
808{
809 return _builtInPutValue(v, s);
810}
811bool builtInPutValue(long long v, String& s)
812{
813 return _builtInPutValue(v, s);
814}
815bool builtInPutValue(short v, String& s)
816{
817 return _builtInPutValue(v, s);
818}
819bool builtInPutValue(unsigned short v, String& s)
820{
821 return _builtInPutValue(v, s);
822}
823bool builtInPutValue(unsigned long v, String& s)
824{
825 return _builtInPutValue(v, s);
826}
827bool builtInPutValue(unsigned long long v, String& s)
828{
829 return _builtInPutValue(v, s);
830}
831#ifdef ARCANE_REAL_NOT_BUILTIN
832bool builtInPutValue(Real v, String& s)
833{
834 return _builtInPutValue(v, s);
835}
836#endif
837bool builtInPutValue(Real2 v, String& s)
838{
839 return _builtInPutValue(v, s);
840}
841bool builtInPutValue(Real3 v, String& s)
842{
843 return _builtInPutValue(v, s);
844}
845bool builtInPutValue(const Real2x2& v, String& s)
846{
847 return _builtInPutValue(v, s);
848}
849bool builtInPutValue(const Real3x3& v, String& s)
850{
851 return _builtInPutValue(v, s);
852}
853
854bool builtInPutValue(Span<const Real> v, String& s)
855{
856 return _builtInPutArrayValue(v, s);
857}
858bool builtInPutValue(Span<const Real2> v, String& s)
859{
860 return _builtInPutArrayValue(v, s);
861}
862bool builtInPutValue(Span<const Real3> v, String& s)
863{
864 return _builtInPutArrayValue(v, s);
865}
866bool builtInPutValue(Span<const Real2x2> v, String& s)
867{
868 return _builtInPutArrayValue(v, s);
869}
870bool builtInPutValue(Span<const Real3x3> v, String& s)
871{
872 return _builtInPutArrayValue(v, s);
873}
874bool builtInPutValue(Span<const Int16> v, String& s)
875{
876 return _builtInPutArrayValue(v, s);
877}
878bool builtInPutValue(Span<const Int32> v, String& s)
879{
880 return _builtInPutArrayValue(v, s);
881}
882bool builtInPutValue(Span<const Int64> v, String& s)
883{
884 return _builtInPutArrayValue(v, s);
885}
886bool builtInPutValue(Span<const bool> v, String& s)
887{
888 return _builtInPutArrayValue(v, s);
889}
890bool builtInPutValue(Span<const String> v, String& s)
891{
892 return _builtInPutArrayValue(v, s);
893}
894//@}
895
896/*---------------------------------------------------------------------------*/
897/*---------------------------------------------------------------------------*/
898
899} // namespace Arcane
900
901/*---------------------------------------------------------------------------*/
902/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
Classe pour convertir une 'StringView' en 'double'.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Référence à une instance.
Vue sur une chaîne de caractères UTF-8.
Definition StringView.h:47
constexpr Int64 length() const ARCCORE_NOEXCEPT
Longueur en octet de la chaîne de caractères.
Definition StringView.h:99
constexpr Span< const Byte > bytes() const ARCCORE_NOEXCEPT
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition StringView.h:96
constexpr Int64 size() const ARCCORE_NOEXCEPT
Longueur en octet de la chaîne de caractères.
Definition StringView.h:102
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool builtInPutValue(const String &v, String &s)
Converti la valeur v dans la chaîne s.
UniqueArray< String > StringUniqueArray
Tableau dynamique à une dimension de chaînes de caractères.
Definition UtilsTypes.h:449
double Real
Type représentant un réel.