14#include "arcane/utils/ValueConvert.h"
16#include "arcane/utils/OStringStream.h"
17#include "arcane/utils/NotSupportedException.h"
18#include "arcane/utils/internal/ValueConvertInternal.h"
24#if defined(ARCANE_HAS_CXX20)
25#define ARCANE_USE_FROMCHARS
28#if defined(ARCANE_USE_FROMCHARS)
47 const char* _stringViewData(StringView s)
49 return reinterpret_cast<const char*
>(s.bytes().data());
59 StringView _removeLeadingSpaces(StringView s,
Int64 pos = 0)
61 Span<const Byte> bytes = s.bytes();
62 Int64 nb_byte = bytes.size();
64 for (; pos < nb_byte; ++pos) {
65 int charv =
static_cast<unsigned char>(bytes[pos]);
67#if defined(_MSC_VER) && _MSC_VER <= 1916
68 if (std::isspace(charv, std::locale()) != 0)
71 if (!std::isspace(charv) != 0)
75 return s.subView(pos, nb_byte);
82impl::StringViewInputStream::
83StringViewInputStream(StringView v)
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);
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;
107arcaneSetIsValueConvertUseFromChars(
bool v)
109 global_use_from_chars = v;
113arcaneSetValueConvertVerbosity(
Int32 v)
115 global_value_convert_verbosity = v;
119arcaneSetUseSameValueConvertForAllReal(
bool v)
121 global_use_same_value_convert_for_all_real = v;
133 static Int64 _getDoubleValueWithFromChars(
double& v,
StringView s);
134 static Int64 _getDoubleValue(
double& v,
StringView s);
145Int64 StringViewToDoubleConverter::
148#if defined(ARCANE_USE_FROMCHARS)
151 Int64
p = _getDoubleValueWithFromChars(v, s);
158 if (s ==
"infinity" || s ==
"inf") {
159 v = std::numeric_limits<double>::infinity();
163 char*
ptr2 =
nullptr;
186Int64 StringViewToDoubleConverter::
187_getDoubleValueWithFromChars(
double& v,
StringView s)
189#if defined(ARCANE_USE_FROMCHARS)
192 auto bytes = s.
bytes();
193 Int64 size = bytes.size();
200 const char*
orig_data =
reinterpret_cast<const char*
>(bytes.data());
202 std::chars_format
fmt = std::chars_format::general;
209 if (bytes[0] ==
'+') {
212 bytes = bytes.subspan(1, size);
219 if (size >= 3 && (bytes[0] ==
'-') && (bytes[1] ==
'0') && (bytes[2] ==
'x' || bytes[2] ==
'X')) {
220 fmt = std::chars_format::hex;
225 else if (size >= 2 && (bytes[0] ==
'0') && (bytes[1] ==
'x' || bytes[1] ==
'X')) {
226 fmt = std::chars_format::hex;
231 auto [
ptr,
ec] = std::from_chars(data, data + size, v,
fmt);
234 std::cout <<
"FromChars:TRY GET_DOUBLE data=" << data <<
" v=" << v <<
" is_ok=" << (
ec == std::errc()) <<
"\n";
235 if (
ec != std::errc())
242 char*
ptr2 =
nullptr;
244 std::cout <<
"FromChars: COMPARE GET_DOUBLE via strtod v2=" << v2 <<
" pos=" << (
ptr2 -
orig_data) <<
"\n";
258template <> ARCANE_UTILS_EXPORT
bool
261#if defined(ARCANE_USE_FROMCHARS)
264 Int64
p = StringViewToDoubleConverter::_getDoubleValueWithFromChars(v, s);
265 return (
p == (-1) || (
p != s.
size()));
269 const char* ptr = _stringViewData(s);
271 if (s ==
"infinity" || s ==
"inf") {
272 v = std::numeric_limits<double>::infinity();
276 char* ptr2 =
nullptr;
277 v = ::strtod(ptr, &ptr2);
278 return (ptr2 != (ptr + s.
length()));
284template <> ARCANE_UTILS_EXPORT
bool
285builtInGetValue(BFloat16& v, StringView s)
288 bool r = builtInGetValue(z, s);
293template <> ARCANE_UTILS_EXPORT
bool
294builtInGetValue(Float16& v, StringView s)
297 bool r = builtInGetValue(z, s);
302template <> ARCANE_UTILS_EXPORT
bool
303builtInGetValue(Float128& v, StringView s)
309 bool r = builtInGetValue(z, s);
314template <> ARCANE_UTILS_EXPORT
bool
315builtInGetValue(
float& v, StringView s)
318 bool r = builtInGetValue(z, s);
323template <> ARCANE_UTILS_EXPORT
bool
324builtInGetValue(
long& v, StringView s)
326 const char* ptr = _stringViewData(s);
328 v = ::strtol(ptr, &ptr2, 0);
329 return (ptr2 != (ptr + s.length()));
332template <> ARCANE_UTILS_EXPORT
bool
333builtInGetValue(
int& v, StringView s)
336 bool r = builtInGetValue(z, s);
341template <> ARCANE_UTILS_EXPORT
bool
342builtInGetValue(
short& v, StringView s)
345 bool r = builtInGetValue(z, s);
350template <> ARCANE_UTILS_EXPORT
bool
351builtInGetValue(
unsigned long& v, StringView s)
353 const char* ptr = _stringViewData(s);
355 v = ::strtoul(ptr, &ptr2, 0);
356 return (ptr2 != (ptr + s.length()));
359template <> ARCANE_UTILS_EXPORT
bool
360builtInGetValue(
unsigned int& v, StringView s)
363 bool r = builtInGetValue(z, s);
368template <> ARCANE_UTILS_EXPORT
bool
369builtInGetValue(
unsigned short& v, StringView s)
372 bool r = builtInGetValue(z, s);
373 v = (
unsigned short)z;
377template <> ARCANE_UTILS_EXPORT
bool
378builtInGetValue(
long long& v, StringView s)
380 const char* ptr = _stringViewData(s);
382 v = ::strtoll(ptr, &ptr2, 0);
383 return (ptr2 != (ptr + s.length()));
386template <> ARCANE_UTILS_EXPORT
bool
387builtInGetValue(Real2& v, StringView s)
389 if (global_use_same_value_convert_for_all_real) {
390 s = _removeLeadingSpaces(s);
392 const bool is_verbose = global_value_convert_verbosity > 0;
394 std::cout <<
"Try Read Real2: '" << s <<
"'\n";
395 Int64 p = StringViewToDoubleConverter::_getDoubleValue(v.x, s);
398 s = _removeLeadingSpaces(s, p);
400 std::cout <<
"VX=" << v.x <<
" remaining_s='" << s <<
"'\n";
401 p = StringViewToDoubleConverter::_getDoubleValue(v.y, s);
402 return (p == (-1) || (p != s.size()));
404 return impl::builtInGetValueGeneric(v, s);
407template <> ARCANE_UTILS_EXPORT
bool
408builtInGetValue(Real3& v, StringView s)
410 if (global_use_same_value_convert_for_all_real) {
411 s = _removeLeadingSpaces(s);
413 const bool is_verbose = global_value_convert_verbosity > 0;
415 std::cout <<
"Try Read Real3: '" << s <<
"'\n";
416 Int64 p = StringViewToDoubleConverter::_getDoubleValue(v.x, s);
417 if (p == (-1) || (p == s.size()))
419 s = _removeLeadingSpaces(s, p);
421 std::cout <<
"VX=" << v.x <<
" remaining_s='" << s <<
"'\n";
422 p = StringViewToDoubleConverter::_getDoubleValue(v.y, s);
423 if (p == (-1) || (p == s.size()))
425 s = _removeLeadingSpaces(s, p);
427 std::cout <<
"VY=" << v.x <<
" remaining_s='" << s <<
"'\n";
428 p = StringViewToDoubleConverter::_getDoubleValue(v.z, s);
429 return (p == (-1) || (p != s.size()));
431 return impl::builtInGetValueGeneric(v, s);
434template <> ARCANE_UTILS_EXPORT
bool
435builtInGetValue(Real2x2& v, StringView s)
437 return impl::builtInGetValueGeneric(v, s);
440template <> ARCANE_UTILS_EXPORT
bool
441builtInGetValue(Real3x3& v, StringView s)
443 return impl::builtInGetValueGeneric(v, s);
446template <> ARCANE_UTILS_EXPORT
bool
447builtInGetValue(Int128& v, StringView s)
453 const char* ptr = _stringViewData(s);
455 v2 = ::strtoll(ptr, &ptr2, 0);
457 return (ptr2 != (ptr + s.length()));
460template <> ARCANE_UTILS_EXPORT
bool
461builtInGetValue(
unsigned long long& v, StringView s)
463 const char* ptr = _stringViewData(s);
465 v = ::strtoull(ptr, &ptr2, 0);
466 return (ptr2 != (ptr + s.length()));
472#ifdef ARCANE_REAL_NOT_BUILTIN
473template <> ARCANE_UTILS_EXPORT
bool
474builtInGetValue(
Real& v, StringView s)
478 if (builtInGetValue(vz,s))
481 cout <<
"** CONVERT DOUBLE TO REAL s=" << s <<
" vz=" << vz <<
" v=" << v <<
'\n';
485 if (builtInGetValue(vz, s))
487 v =
Real((
char*)s.localstr(), 1000);
488 cout <<
"** CONVERT DOUBLE TO REAL s=" << s <<
'\n';
497builtInGetValue(String& v, StringView s)
508 bool _builtInGetBoolArrayValue(BoolArray& v, StringView s)
517 if (builtInGetValue(sa, s))
519 for (Integer i = 0, is = sa.size(); i < is; ++i) {
520 bool read_val =
false;
521 if (builtInGetValue(read_val, sa[i]))
529 _builtInGetStringArrayValue(StringArray& v, StringView s)
532 String read_val = String();
533 impl::StringViewInputStream svis(s);
534 std::istream& sbuf = svis.stream();
535 while (!sbuf.eof()) {
542 read_val = StringView(s2.c_str());
549template <> ARCANE_UTILS_EXPORT
bool
550builtInGetValue(RealArray& v, StringView s)
552 return builtInGetArrayValue(v, s);
555template <> ARCANE_UTILS_EXPORT
bool
556builtInGetValue(Real2Array& v, StringView s)
558 return builtInGetArrayValue(v, s);
561template <> ARCANE_UTILS_EXPORT
bool
562builtInGetValue(Real3Array& v, StringView s)
564 return builtInGetArrayValue(v, s);
567template <> ARCANE_UTILS_EXPORT
bool
568builtInGetValue(Real2x2Array& v, StringView s)
570 return builtInGetArrayValue(v, s);
573template <> ARCANE_UTILS_EXPORT
bool
574builtInGetValue(Real3x3Array& v, StringView s)
576 return builtInGetArrayValue(v, s);
579template <> ARCANE_UTILS_EXPORT
bool
580builtInGetValue(Int8Array& v, StringView s)
582 return builtInGetArrayValue(v, s);
585template <> ARCANE_UTILS_EXPORT
bool
586builtInGetValue(Int16Array& v, StringView s)
588 return builtInGetArrayValue(v, s);
591template <> ARCANE_UTILS_EXPORT
bool
592builtInGetValue(Int32Array& v, StringView s)
594 return builtInGetArrayValue(v, s);
597template <> ARCANE_UTILS_EXPORT
bool
598builtInGetValue(Int64Array& v, StringView s)
600 return builtInGetArrayValue(v, s);
603template <> ARCANE_UTILS_EXPORT
bool
604builtInGetValue(BoolArray& v, StringView s)
606 return _builtInGetBoolArrayValue(v, s);
609template <> ARCANE_UTILS_EXPORT
bool
610builtInGetValue(StringArray& v, StringView s)
612 return _builtInGetStringArrayValue(v, s);
618template <> ARCANE_UTILS_EXPORT
bool
619builtInGetValue(RealUniqueArray& v, StringView s)
621 return builtInGetArrayValue(v, s);
624template <> ARCANE_UTILS_EXPORT
bool
625builtInGetValue(Real2UniqueArray& v, StringView s)
627 return builtInGetArrayValue(v, s);
630template <> ARCANE_UTILS_EXPORT
bool
631builtInGetValue(Real3UniqueArray& v, StringView s)
633 return builtInGetArrayValue(v, s);
636template <> ARCANE_UTILS_EXPORT
bool
637builtInGetValue(Real2x2UniqueArray& v, StringView s)
639 return builtInGetArrayValue(v, s);
642template <> ARCANE_UTILS_EXPORT
bool
643builtInGetValue(Real3x3UniqueArray& v, StringView s)
645 return builtInGetArrayValue(v, s);
648template <> ARCANE_UTILS_EXPORT
bool
649builtInGetValue(Int8UniqueArray& v, StringView s)
651 return builtInGetArrayValue(v, s);
654template <> ARCANE_UTILS_EXPORT
bool
655builtInGetValue(Int16UniqueArray& v, StringView s)
657 return builtInGetArrayValue(v, s);
660template <> ARCANE_UTILS_EXPORT
bool
661builtInGetValue(Int32UniqueArray& v, StringView s)
663 return builtInGetArrayValue(v, s);
666template <> ARCANE_UTILS_EXPORT
bool
667builtInGetValue(Int64UniqueArray& v, StringView s)
669 return builtInGetArrayValue(v, s);
672template <> ARCANE_UTILS_EXPORT
bool
673builtInGetValue(BoolUniqueArray& v, StringView s)
675 return _builtInGetBoolArrayValue(v, s);
678template <> ARCANE_UTILS_EXPORT
bool
679builtInGetValue(StringUniqueArray& v, StringView s)
681 return _builtInGetStringArrayValue(v, s);
687template <> ARCANE_UTILS_EXPORT
bool
688builtInGetValue(RealSharedArray& v, StringView s)
690 return builtInGetArrayValue(v, s);
693template <> ARCANE_UTILS_EXPORT
bool
694builtInGetValue(Real2SharedArray& v, StringView s)
696 return builtInGetArrayValue(v, s);
699template <> ARCANE_UTILS_EXPORT
bool
700builtInGetValue(Real3SharedArray& v, StringView s)
702 return builtInGetArrayValue(v, s);
705template <> ARCANE_UTILS_EXPORT
bool
706builtInGetValue(Real2x2SharedArray& v, StringView s)
708 return builtInGetArrayValue(v, s);
711template <> ARCANE_UTILS_EXPORT
bool
712builtInGetValue(Real3x3SharedArray& v, StringView s)
714 return builtInGetArrayValue(v, s);
717template <> ARCANE_UTILS_EXPORT
bool
718builtInGetValue(Int8SharedArray& v, StringView s)
720 return builtInGetArrayValue(v, s);
723template <> ARCANE_UTILS_EXPORT
bool
724builtInGetValue(Int16SharedArray& v, StringView s)
726 return builtInGetArrayValue(v, s);
729template <> ARCANE_UTILS_EXPORT
bool
730builtInGetValue(Int32SharedArray& v, StringView s)
732 return builtInGetArrayValue(v, s);
735template <> ARCANE_UTILS_EXPORT
bool
736builtInGetValue(Int64SharedArray& v, StringView s)
738 return builtInGetArrayValue(v, s);
741template <> ARCANE_UTILS_EXPORT
bool
742builtInGetValue(BoolSharedArray& v, StringView s)
744 return _builtInGetBoolArrayValue(v, s);
747template <> ARCANE_UTILS_EXPORT
bool
748builtInGetValue(StringSharedArray& v, StringView s)
750 return _builtInGetStringArrayValue(v, s);
758 template <
class T>
inline bool
759 _builtInPutValue(
const T& v, String& s)
763 if (ostr().fail() || ostr().bad())
768 template <
class T>
inline bool
769 _builtInPutArrayValue(Span<const T> v, String& s)
772 for (
Int64 i = 0, n = v.size(); i < n; ++i) {
777 if (ostr().fail() || ostr().bad())
791bool builtInPutValue(
double v, String& s)
793 return _builtInPutValue(v, s);
797 return _builtInPutValue(v, s);
801 return _builtInPutValue(v, s);
805 return _builtInPutValue(v, s);
809 return _builtInPutValue(v, s);
813 return _builtInPutValue(v, s);
817 return _builtInPutValue(v, s);
821 return _builtInPutValue(v, s);
825 return _builtInPutValue(v, s);
829 return _builtInPutValue(v, s);
831#ifdef ARCANE_REAL_NOT_BUILTIN
834 return _builtInPutValue(v, s);
839 return _builtInPutValue(v, s);
843 return _builtInPutValue(v, s);
847 return _builtInPutValue(v, s);
851 return _builtInPutValue(v, s);
856 return _builtInPutArrayValue(v, s);
860 return _builtInPutArrayValue(v, s);
864 return _builtInPutArrayValue(v, s);
868 return _builtInPutArrayValue(v, s);
872 return _builtInPutArrayValue(v, s);
876 return _builtInPutArrayValue(v, s);
880 return _builtInPutArrayValue(v, s);
884 return _builtInPutArrayValue(v, s);
888 return _builtInPutArrayValue(v, s);
892 return _builtInPutArrayValue(v, s);
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Classe pour convertir une 'StringView' en 'double'.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Exception lorsqu'une opération n'est pas supportée.
Vue sur une chaîne de caractères UTF-8.
constexpr Int64 length() const ARCCORE_NOEXCEPT
Longueur en octet de la chaîne de caractères.
constexpr Span< const Byte > bytes() const ARCCORE_NOEXCEPT
Retourne la conversion de l'instance dans l'encodage UTF-8.
constexpr Int64 size() const ARCCORE_NOEXCEPT
Longueur en octet de la chaîne de caractères.
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.