14#include "arccore/base/String.h"
15#include "arccore/base/StringBuilder.h"
16#include "arccore/base/CStringUtils.h"
17#include "arccore/base/APReal.h"
18#include "arccore/base/TraceInfo.h"
19#include "arccore/base/FatalErrorException.h"
20#include "arccore/base/StringView.h"
23#include "arccore/base/internal/StringImpl.h"
30#define A_FASTLOCK(ptr)
46String(
const std::string& str)
47: m_p(new StringImpl(str))
57String(std::string_view str)
58: m_p(new StringImpl(str))
81: m_p(new StringImpl(ustr))
92: m_p(new StringImpl(ustr))
104, m_const_ptr_size(-1)
115: m_p(new StringImpl(std::string_view(str,
len)))
116, m_const_ptr_size(-1)
126: m_p(new StringImpl(str))
127, m_const_ptr_size(-1)
136String(
const char* str,
bool do_alloc)
138, m_const_ptr(nullptr)
139, m_const_ptr_size(-1)
142 m_p =
new StringImpl(str);
148 m_const_ptr_size = std::strlen(str);
158, m_const_ptr(str.m_const_ptr)
159, m_const_ptr_size(str.m_const_ptr_size)
172 str.m_p->addReference();
173 _removeReferenceIfNeeded();
184 _removeReferenceIfNeeded();
232 return m_p->toStdStringView().data();
240_removeImplReference()
242 m_p->removeReference();
248ConstArrayView<UChar> String::
249_internalUtf16BE()
const
259 return ConstArrayView<UChar>();
268 return _internalUtf16BE();
278 return m_p->largeUtf8().smallView();
280 Int64 ts = m_const_ptr_size+1;
318 return m_const_ptr[0]==
'\0';
352 Int64 xlen = std::strlen(m_const_ptr);
353 if (xlen!=m_const_ptr_size)
354 ARCCORE_FATAL(
"Bad length (computed={0} stored={1})",xlen,m_const_ptr_size);
356 return _viewFromConstChar();
359 return m_p->toStdStringView();
360 return std::string_view();
390 if (m_const_ptr || !m_p){
391 std::string_view sview;
393 sview = _viewFromConstChar();
394 m_p =
new StringImpl(sview);
396 m_const_ptr =
nullptr;
397 m_const_ptr_size = -1;
400 if (m_p->nbReference()!=1){
401 StringImpl* old_p = m_p;
404 old_p->removeReference();
415 return String(m_p->clone());
428 if (str.m_const_ptr){
429 m_p = m_p->append(str._viewFromConstChar());
432 m_p = m_p->append(str.m_p);
444 s2.m_p = s2.m_p->replaceWhiteSpace();
458 s2.m_p = s2.m_p->collapseWhiteSpace();
470 s2.m_p = s2.m_p->toUpper();
482 s2.m_p = s2.m_p->toLower();
495 return s2._append(str);
507 return s2._append(str);
517 return s2._append(str);
524fromNumber(
unsigned long v)
530fromNumber(
unsigned int v)
532 return StringFormatterArg(v).value();
538 return StringFormatterArg(v).value();
542fromNumber(
long double v)
544 return StringFormatterArg(v).value();
550 return StringFormatterArg(v).value();
556 return StringFormatterArg(v).value();
560fromNumber(
unsigned long long v)
562 return StringFormatterArg(v).value();
566fromNumber(
long long v)
568 return StringFormatterArg(v).value();
572fromNumber(
const APReal& v)
574 return StringFormatterArg(v).value();
578fromNumber(
double v,
Integer nb_digit_after_point)
581 for(
Integer z=0; z<nb_digit_after_point; ++z )
584 Int64 after_digit = p % mulp;
585 Int64 before_digit = p / mulp;
586 StringBuilder s(String::fromNumber(before_digit) +
".");
589 Int64 mv = mulp / 10;
590 for(
Integer i=0; i<(nb_digit_after_point-1); ++i ){
591 if (after_digit>=mv){
597 for(
Integer i=0; i<nb_zero; ++i )
600 s += String::fromNumber(after_digit);
611 return s2._append(String::fromNumber(v));
618 return s2._append(String::fromNumber(v));
625 return s2._append(String::fromNumber(v));
632 return s2._append(String::fromNumber(v));
639 return s2._append(String::fromNumber(v));
646 return s2._append(String::fromNumber(v));
653 return s2._append(String::fromNumber(v));
660 return s2._append(String::fromNumber(v));
667 return s2._append(String::fromNumber(v));
674isLess(
const String& b)
const
680 if (b.m_p->isEqual(m_const_ptr))
682 return !(b.m_p->isLessThan(m_const_ptr));
690 return m_p->isLessThan(b.m_const_ptr);
697 return m_p->isLessThan(b.m_p);
703 return b.m_p==
nullptr;
721 ostr <<
"StringDump(m_const_ptr=" << (
void*)m_const_ptr <<
",m_p=" << m_p;
724 m_p->internalDump(ostr);
738 for(
Int64 i=0; i<n; ++i ){
739 h = (h << 5) - h + s[i];
747void StringFormatterArg::
748_formatReal(
Real avalue)
750 std::ostringstream ostr;
751 ostr.precision(std::numeric_limits<Real>::digits10);
753 m_str_value = ostr.str();
762 StringFormatter(
const String& format)
763 : m_format(format), m_current_arg(0) {}
765 void addArg(
const String& ostr)
774 std::cerr <<
"Too many args (maximum is 100)";
779 buf[0] = (char)(
'0' + (z / 10));
780 buf[1] = (char)(
'0' + (z % 10));
784 buf[0] = (char)(
'0' + z);
790 std::string str = m_format.
localstr();
791 const char* local_str = str.c_str();
793 const Int64 slen = str.length();
794 for(
Int64 i=0; i<slen; ++i ){
795 if (local_str[i]==
'{'){
799 for(
Integer j=0; j<nb_z; ++j )
800 if (local_str[i+1+j]!=buf[j]){
805 std::string str1(local_str,local_str+i);
806 std::string str2(local_str+i+1+nb_z);
807 m_format =
String(str1) + ostr + str2;
816 const String& value()
const {
return m_format; }
836format(
const String& str,
const StringFormatterArg& arg1)
838 StringFormatter sf(str);
839 sf.addArg(arg1.value());
850 StringFormatter sf(str);
851 sf.addArg(arg1.value());
852 sf.addArg(arg2.value());
864 StringFormatter sf(str);
865 sf.addArg(arg1.value());
866 sf.addArg(arg2.value());
867 sf.addArg(arg3.value());
880 StringFormatter sf(str);
881 sf.addArg(arg1.value());
882 sf.addArg(arg2.value());
883 sf.addArg(arg3.value());
884 sf.addArg(arg4.value());
898 StringFormatter sf(str);
899 sf.addArg(arg1.value());
900 sf.addArg(arg2.value());
901 sf.addArg(arg3.value());
902 sf.addArg(arg4.value());
903 sf.addArg(arg5.value());
918 StringFormatter sf(str);
919 sf.addArg(arg1.value());
920 sf.addArg(arg2.value());
921 sf.addArg(arg3.value());
922 sf.addArg(arg4.value());
923 sf.addArg(arg5.value());
924 sf.addArg(arg6.value());
940 StringFormatter sf(str);
941 sf.addArg(arg1.value());
942 sf.addArg(arg2.value());
943 sf.addArg(arg3.value());
944 sf.addArg(arg4.value());
945 sf.addArg(arg5.value());
946 sf.addArg(arg6.value());
947 sf.addArg(arg7.value());
964 StringFormatter sf(str);
965 sf.addArg(arg1.value());
966 sf.addArg(arg2.value());
967 sf.addArg(arg3.value());
968 sf.addArg(arg4.value());
969 sf.addArg(arg5.value());
970 sf.addArg(arg6.value());
971 sf.addArg(arg7.value());
972 sf.addArg(arg8.value());
990 StringFormatter sf(str);
991 sf.addArg(arg1.value());
992 sf.addArg(arg2.value());
993 sf.addArg(arg3.value());
994 sf.addArg(arg4.value());
995 sf.addArg(arg5.value());
996 sf.addArg(arg6.value());
997 sf.addArg(arg7.value());
998 sf.addArg(arg8.value());
999 sf.addArg(arg9.value());
1009 return arg1.value();
1016 return arg1.value()+arg2.value();
1024 return arg1.value()+arg2.value()+arg3.value();
1033 return arg1.value()+arg2.value()+arg3.value()+arg4.value();
1050 return (a>0) ? a : (-a);
1058 return String::concat(n,
" ", ((_abs(n) > 1)?str2:str) );
1060 return ((_abs(n) > 1)?str2:str);
1076 return a.find(b) != std::string_view::npos;
1089 if (ref_size>v_size)
1091 const Byte* v_begin = &v[v_size-ref_size];
1092 return std::memcmp(v_begin,ref.
data(),ref_size)==0;
1105 if (ref_size>v_size)
1107 return memcmp(v.
data(),ref.
data(),ref_size)==0;
1129 String s2(StringImpl::substring(m_p,pos,
len));
1159 return b.m_p->isEqual(a.m_const_ptr);
1166 return a.m_p->isEqual(b.m_const_ptr);
1171 return a.m_p->isEqual(b.m_p);
1177 return b.m_p==
nullptr;
1196 bool v = a.isLess(b);
1218bool global_write_utf8 =
false;
1224 if (global_write_utf8)
1240 o.write((
const char*)v.
data(),vlen);
1261 static std::vector<UChar>
1262 toUtf16BE(
const String& str)
1270 return { x.begin(), x.begin()+(n-1) };
1277std::vector<UChar> StringUtils::
1278asUtf16BE(
const String& str)
1280 return StringUtilsImpl::toUtf16BE(str);
Fonctions utilitaires sur les chaînes de caractères.
Emulation de réel en précision arbitraire.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Vue d'un tableau d'éléments de type T.
Constructeur de chaîne de caractère unicode.
String toString() const
Retourne la chaîne de caractères construite.
Vue sur une chaîne de caractères UTF-8.
Chaîne de caractères unicode.
bool startsWith(const String &s) const
Indique si la chaîne commence par les caractères de s.
bool null() const
Retourne true si la chaîne est nulle.
static String plural(const Integer n, const String &str, const bool with_number=true)
Forme standard du pluriel par ajout d'un 's'.
String upper() const
Transforme tous les caractères de la chaîne en majuscules.
Int64 length() const
Retourne la longueur de la chaîne.
String clone() const
Clone cette chaîne.
String lower() const
Transforme tous les caractères de la chaîne en minuscules.
void writeBytes(std::ostream &o) const
Écrit la chaîne au format UTF-8 sur le flot o.
void internalDump(std::ostream &ostr) const
Affiche les infos internes de la classe.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
ByteConstArrayView utf8() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
String()
Crée une chaîne nulle.
Int32 hashCode() const
Calcule une valeur de hashage pour cette chaîne de caractères.
friend ARCCORE_BASE_EXPORT bool operator==(const String &a, const String &b)
Compare deux chaînes unicode.
static String replaceWhiteSpace(const String &rhs)
Effectue une normalisation des caractères espaces.
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
bool endsWith(const String &s) const
Indique si la chaîne se termine par les caractères de s.
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
friend ARCCORE_BASE_EXPORT String operator+(const char *a, const String &b)
Ajoute deux chaînes.
static String collapseWhiteSpace(const String &rhs)
Effectue une normalisation des caractères espaces.
ConstArrayView< UChar > utf16() const
Retourne la conversion de l'instance dans l'encodage UTF-16.
StringView view() const
Retourne une vue sur la chaîne actuelle.
String & operator=(const String &str)
Copie str dans cette instance.
bool contains(const String &s) const
Indique si la chaîne contient s.
std::string_view toStdStringView() const
Retourne une vue de la STL sur la chaîne actuelle.
Integer len() const
Retourne la longueur de la chaîne en 32 bits.
String substring(Int64 pos) const
Sous-chaîne commençant à la position pos.
bool isLess(const char *s1, const char *s2)
Retourne true si s1 est inférieur (ordre alphabétique) à s2 , false sinon.
bool isEqual(const char *s1, const char *s2)
Retourne true si s1 et s2 sont identiques, false sinon.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
constexpr __host__ __device__ Integer arccoreCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
bool operator<(const Item &item1, const Item &item2)
Compare deux entités.
std::istream & operator>>(std::istream &istr, eItemKind &item_kind)
Opérateur d'entrée depuis un flot.
double Real
Type représentant un réel.
ConstArrayView< UChar > UCharConstArrayView
Equivalent C d'un tableau à une dimension de caractères unicode.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
unsigned char Byte
Type d'un octet.
std::ostream & operator<<(std::ostream &ostr, eItemKind item_kind)
Opérateur de sortie sur un flot.
std::int32_t Int32
Type entier signé sur 32 bits.