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))
69: m_p(new StringImpl(str.toStdStringView()))
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;
710fromUtf8(Span<const Byte> bytes)
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();
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());
847format(
const String& str,
const StringFormatterArg& arg1,
848 const StringFormatterArg& arg2)
850 StringFormatter sf(str);
851 sf.addArg(arg1.value());
852 sf.addArg(arg2.value());
860format(
const String& str,
const StringFormatterArg& arg1,
861 const StringFormatterArg& arg2,
862 const StringFormatterArg& arg3)
864 StringFormatter sf(str);
865 sf.addArg(arg1.value());
866 sf.addArg(arg2.value());
867 sf.addArg(arg3.value());
875format(
const String& str,
const StringFormatterArg& arg1,
876 const StringFormatterArg& arg2,
877 const StringFormatterArg& arg3,
878 const StringFormatterArg& arg4)
880 StringFormatter sf(str);
881 sf.addArg(arg1.value());
882 sf.addArg(arg2.value());
883 sf.addArg(arg3.value());
884 sf.addArg(arg4.value());
892format(
const String& str,
const StringFormatterArg& arg1,
893 const StringFormatterArg& arg2,
894 const StringFormatterArg& arg3,
895 const StringFormatterArg& arg4,
896 const StringFormatterArg& arg5)
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());
911format(
const String& str,
const StringFormatterArg& arg1,
912 const StringFormatterArg& arg2,
913 const StringFormatterArg& arg3,
914 const StringFormatterArg& arg4,
915 const StringFormatterArg& arg5,
916 const StringFormatterArg& arg6)
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());
932format(
const String& str,
const StringFormatterArg& arg1,
933 const StringFormatterArg& arg2,
934 const StringFormatterArg& arg3,
935 const StringFormatterArg& arg4,
936 const StringFormatterArg& arg5,
937 const StringFormatterArg& arg6,
938 const StringFormatterArg& arg7)
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());
955format(
const String& str,
const StringFormatterArg& arg1,
956 const StringFormatterArg& arg2,
957 const StringFormatterArg& arg3,
958 const StringFormatterArg& arg4,
959 const StringFormatterArg& arg5,
960 const StringFormatterArg& arg6,
961 const StringFormatterArg& arg7,
962 const StringFormatterArg& arg8)
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());
980format(
const String& str,
const StringFormatterArg& arg1,
981 const StringFormatterArg& arg2,
982 const StringFormatterArg& arg3,
983 const StringFormatterArg& arg4,
984 const StringFormatterArg& arg5,
985 const StringFormatterArg& arg6,
986 const StringFormatterArg& arg7,
987 const StringFormatterArg& arg8,
988 const StringFormatterArg& arg9)
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());
1007concat(
const StringFormatterArg& arg1)
1009 return arg1.value();
1013concat(
const StringFormatterArg& arg1,
1014 const StringFormatterArg& arg2)
1016 return arg1.value()+arg2.value();
1020concat(
const StringFormatterArg& arg1,
1021 const StringFormatterArg& arg2,
1022 const StringFormatterArg& arg3)
1024 return arg1.value()+arg2.value()+arg3.value();
1028concat(
const StringFormatterArg& arg1,
1029 const StringFormatterArg& arg2,
1030 const StringFormatterArg& arg3,
1031 const StringFormatterArg& arg4)
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;
1221operator<<(std::ostream& o,
const String& str)
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.
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.
ByteConstArrayView utf8() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
void writeBytes(std::ostream &o) const
Écrit la chaîne au format UTF-8 sur le flot o.
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.
void internalDump(std::ostream &ostr) const
Affiche les infos internes de la classe.
bool contains(const String &s) const
Indique si la chaîne contient s.
String & operator=(const String &str)
Copie str dans cette instance.
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
String upper() const
Transforme tous les caractères de la chaîne en majuscules.
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
String clone() const
Clone cette chaîne.
static String collapseWhiteSpace(const String &rhs)
Effectue une normalisation des caractères espaces.
bool startsWith(const String &s) const
Indique si la chaîne commence par les caractères de s.
friend ARCCORE_BASE_EXPORT String operator+(const char *a, const String &b)
Ajoute deux chaînes.
Integer len() const
Retourne la longueur de la chaîne en 32 bits.
String()
Crée une chaîne nulle.
static String plural(const Integer n, const String &str, const bool with_number=true)
Forme standard du pluriel par ajout d'un 's'.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
bool null() const
Retourne true si la chaîne est nulle.
Int64 length() const
Retourne la longueur de la chaîne.
String lower() const
Transforme tous les caractères de la chaîne en minuscules.
static String replaceWhiteSpace(const String &rhs)
Effectue une normalisation des caractères espaces.
std::string_view toStdStringView() const
Retourne une vue de la STL sur la chaîne actuelle.
String substring(Int64 pos) const
Sous-chaîne commençant à la position pos.
bool endsWith(const String &s) const
Indique si la chaîne se termine par les caractères de s.
Int32 hashCode() const
Calcule une valeur de hashage pour cette chaîne de caractères.
ARCCORE_BASE_EXPORT bool isLess(const char *s1, const char *s2)
Retourne true si s1 est inférieur (ordre alphabétique) à s2 , false sinon.
ARCCORE_BASE_EXPORT bool isEqual(const char *s1, const char *s2)
Retourne true si s1 et s2 sont identiques, false sinon.
Espace de nom de Arccore.
double Real
Type représentant un réel.
Int32 Integer
Type représentant un entier.
bool operator<(const APReal &a, const APReal &b)
Emulation d'un réel en précision arbitraire.
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.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
std::int32_t Int32
Type entier signé sur 32 bits.
unsigned char Byte
Type d'un octet.