44 TString operator+(
const TString &s1,
const TString &s2);
45 TString operator+(
const TString &s,
const char *cs);
46 TString operator+(
const char *cs,
const TString &s);
47 TString operator+(
const TString &s,
char c);
48 TString operator+(
char c,
const TString &s);
49 Bool_t operator==(
const TString &s1,
const TString &s2);
50 Bool_t operator==(
const TString &s1,
const char *s2);
51 Bool_t operator==(
const TSubString &s1,
const TSubString &s2);
52 Bool_t operator==(
const TSubString &s1,
const TString &s2);
53 Bool_t operator==(
const TSubString &s1,
const char *s2);
79 friend class TStringLong;
82 friend Bool_t operator==(
const TSubString &s1,
const TSubString &s2);
83 friend Bool_t operator==(
const TSubString &s1,
const TString &s2);
84 friend Bool_t operator==(
const TSubString &s1,
const char *s2);
92 TSubString(
const TString &s, Ssiz_t start, Ssiz_t len);
95 void SubStringError(Ssiz_t, Ssiz_t, Ssiz_t)
const;
96 void AssertElement(Ssiz_t i)
const;
99 TSubString(
const TSubString &s)
100 : fStr(s.fStr), fBegin(s.fBegin), fExtent(s.fExtent) { }
102 TSubString &operator=(
const char *s);
103 TSubString &operator=(
const TString &s);
104 TSubString &operator=(
const TSubString &s);
105 char &operator()(Ssiz_t i);
106 char &operator[](Ssiz_t i);
107 char operator()(Ssiz_t i)
const;
108 char operator[](Ssiz_t i)
const;
110 operator std::string_view()
const {
return std::string_view(Data(),fExtent); }
111 operator std::string()
const {
return std::string(Data(),fExtent); }
113 const char *Data()
const;
114 Ssiz_t Length()
const {
return fExtent; }
115 Ssiz_t Start()
const {
return fBegin; }
116 TString& String() {
return fStr; }
121 Bool_t IsNull()
const {
return fBegin == kNPOS; }
122 int operator!()
const {
return fBegin == kNPOS; }
133 friend class TStringLong;
134 friend class TSubString;
135 friend class TBufferFile;
137 friend TString operator+(
const TString &s1,
const TString &s2);
138 friend TString operator+(
const TString &s,
const char *cs);
139 friend TString operator+(
const char *cs,
const TString &s);
140 friend TString operator+(
const TString &s,
char c);
141 friend TString operator+(
char c,
const TString &s);
144 friend typename std::enable_if<ROOT::TypeTraits::IsSignedNumeral<T>::value,TString>::type
145 operator+(TString s, T i);
147 friend typename std::enable_if<ROOT::TypeTraits::IsUnsignedNumeral<T>::value,TString>::type
148 operator+(TString s, T u);
150 friend typename std::enable_if<ROOT::TypeTraits::IsFloatNumeral<T>::value,TString>::type
151 operator+(TString s, T f);
153 friend typename std::enable_if<ROOT::TypeTraits::IsSignedNumeral<T>::value,TString>::type
154 operator+(T i,
const TString &s);
156 friend typename std::enable_if<ROOT::TypeTraits::IsUnsignedNumeral<T>::value,TString>::type
157 operator+(T u,
const TString &s);
159 friend typename std::enable_if<ROOT::TypeTraits::IsFloatNumeral<T>::value,TString>::type
160 operator+(T f,
const TString &s);
162 friend Bool_t operator==(
const TString &s1,
const TString &s2);
163 friend Bool_t operator==(
const TString &s1,
const char *s2);
167 enum { kShortMask = 0x01, kLongMask = 0x1 };
169 enum { kShortMask = 0x80, kLongMask = 0x80000000 };
179 enum { kMinCap = (
sizeof(LongStr_t) - 1)/
sizeof(char) > 2 ?
180 (
sizeof(LongStr_t) - 1)/
sizeof(
char) : 2 };
188 union UStr_t { LongStr_t fL; ShortStr_t fS; };
190 enum { kNwords =
sizeof(UStr_t) /
sizeof(Ssiz_t)};
194 Ssiz_t fWords[kNwords];
213 TString(
const char *a1, Ssiz_t n1,
const char *a2, Ssiz_t n2);
214 void AssertElement(Ssiz_t nc)
const;
215 void Clobber(Ssiz_t nc);
216 void InitChar(
char c);
218 enum { kAlignment = 16 };
219 static Ssiz_t Align(Ssiz_t s) {
return (s + (kAlignment-1)) & ~(kAlignment-1); }
220 static Ssiz_t Recommend(Ssiz_t s) {
return (s < kMinCap ? kMinCap : Align(s+1)) - 1; }
221 static Ssiz_t AdjustCapacity(Ssiz_t oldCap, Ssiz_t newCap);
224 Bool_t IsLong()
const {
return Bool_t(fRep.fShort.fSize & kShortMask); }
226 void SetShortSize(Ssiz_t s) { fRep.fShort.fSize = (
unsigned char)(s << 1); }
227 Ssiz_t GetShortSize()
const {
return fRep.fShort.fSize >> 1; }
229 void SetShortSize(Ssiz_t s) { fRep.fShort.fSize = (
unsigned char)s; }
230 Ssiz_t GetShortSize()
const {
return fRep.fShort.fSize; }
232 void SetLongSize(Ssiz_t s) { fRep.fLong.fSize = s; }
233 Ssiz_t GetLongSize()
const {
return fRep.fLong.fSize; }
234 void SetSize(Ssiz_t s) { IsLong() ? SetLongSize(s) : SetShortSize(s); }
235 void SetLongCap(Ssiz_t s) { fRep.fLong.fCap = kLongMask | s; }
236 Ssiz_t GetLongCap()
const {
return fRep.fLong.fCap & ~kLongMask; }
237 void SetLongPointer(
char *p) { fRep.fLong.fData = p; }
238 char *GetLongPointer() {
return fRep.fLong.fData; }
239 const char *GetLongPointer()
const {
return fRep.fLong.fData; }
240 char *GetShortPointer() {
return fRep.fShort.fData; }
241 const char *GetShortPointer()
const {
return fRep.fShort.fData; }
242 char *GetPointer() {
return IsLong() ? GetLongPointer() : GetShortPointer(); }
243 const char *GetPointer()
const {
return IsLong() ? GetLongPointer() : GetShortPointer(); }
245 static Ssiz_t MaxSize() {
return kMaxInt - 1; }
247 static Ssiz_t MaxSize() {
return (kMaxInt >> 1) - 1; }
249 void UnLink()
const {
if (IsLong())
delete [] fRep.fLong.fData; }
251 Ssiz_t (&a)[kNwords] = fRep.fRaw.fWords;
252 for (UInt_t i = 0; i < kNwords; ++i)
255 char *Init(Ssiz_t capacity, Ssiz_t nchar);
256 void Clone(Ssiz_t nc);
257 void FormImp(
const char *fmt, va_list ap);
258 UInt_t HashCase()
const;
259 UInt_t HashFoldCase()
const;
262 enum EStripType { kLeading = 0x1, kTrailing = 0x2, kBoth = 0x3 };
263 enum ECaseCompare { kExact, kIgnoreCase };
264 static const Ssiz_t kNPOS = ::kNPOS;
267 explicit TString(Ssiz_t ic);
268 TString(
const TString &s);
269 TString(TString &&s) noexcept;
270 TString(const
char *s);
271 TString(const
char *s, Ssiz_t n);
272 TString(const std::
string &s);
274 TString(
char c, Ssiz_t s);
275 explicit TString(const std::string_view &sub);
276 TString(const TSubString &sub);
281 virtual
void FillBuffer(
char *&buffer) const;
282 virtual
void ReadBuffer(
char *&buffer);
283 virtual Int_t Sizeof() const;
285 static TString *ReadString(TBuffer &b, const TClass *clReq);
286 static
void WriteString(TBuffer &b, const TString *a);
288 friend TBuffer &operator<<(TBuffer &b, const TString *obj);
291 Bool_t Gets(FILE *fp, Bool_t chop=kTRUE);
295 operator const
char*()
const {
return GetPointer(); }
296 #if (__cplusplus >= 201700L) && (!defined(__clang_major__) || __clang_major__ > 5)
299 explicit operator std::string()
const {
return std::string(GetPointer(),Length()); }
300 explicit operator ROOT::Internal::TStringView()
const {
return ROOT::Internal::TStringView(GetPointer(),Length()); }
301 operator std::string_view()
const {
return std::string_view(GetPointer(),Length()); }
303 operator ROOT::Internal::TStringView()
const {
return ROOT::Internal::TStringView(GetPointer(),Length()); }
307 TString &operator=(
char s);
308 TString &operator=(
const char *s);
309 TString &operator=(
const TString &s);
310 TString &operator=(TString &&s) noexcept;
311 TString &operator=(const std::
string &s);
312 TString &operator=(const std::string_view &s);
313 TString &operator=(const TSubString &s);
314 TString &operator+=(const
char *s);
315 TString &operator+=(const TString &s);
316 TString &operator+=(
char c);
319 typename std::enable_if<ROOT::TypeTraits::IsSignedNumeral<T>::value,TString>::type
322 typename std::enable_if<ROOT::TypeTraits::IsUnsignedNumeral<T>::value,TString>::type
325 typename std::enable_if<ROOT::TypeTraits::IsFloatNumeral<T>::value,TString>::type
329 char &operator[](Ssiz_t i);
330 char &operator()(Ssiz_t i);
331 char operator[](Ssiz_t i) const;
332 char operator()(Ssiz_t i) const;
333 TSubString operator()(Ssiz_t start, Ssiz_t len) const;
334 TSubString operator()(const TRegexp &re) const;
335 TSubString operator()(const TRegexp &re, Ssiz_t start) const;
336 TSubString operator()(TPRegexp &re) const;
337 TSubString operator()(TPRegexp &re, Ssiz_t start) const;
338 TSubString SubString(const
char *pat, Ssiz_t start = 0,
339 ECaseCompare cmp = kExact) const;
342 TString &Append(const
char *cs);
343 TString &Append(const
char *cs, Ssiz_t n);
344 TString &Append(const TString &s);
345 TString &Append(const TString &s, Ssiz_t n);
346 TString &Append(
char c, Ssiz_t rep = 1);
348 Long64_t Atoll() const;
349 Double_t Atof() const;
350 Bool_t BeginsWith(const
char *s, ECaseCompare cmp = kExact) const;
351 Bool_t BeginsWith(const TString &pat, ECaseCompare cmp = kExact) const;
352 Ssiz_t Capacity()
const {
return (IsLong() ? GetLongCap() : kMinCap) - 1; }
353 Ssiz_t Capacity(Ssiz_t n);
356 int CompareTo(
const char *cs, ECaseCompare cmp = kExact)
const;
357 int CompareTo(
const TString &st, ECaseCompare cmp = kExact)
const;
358 Bool_t Contains(
const char *pat, ECaseCompare cmp = kExact)
const;
359 Bool_t Contains(
const TString &pat, ECaseCompare cmp = kExact)
const;
360 Bool_t Contains(
const TRegexp &pat)
const;
361 Bool_t Contains(TPRegexp &pat)
const;
362 Int_t CountChar(Int_t c)
const;
363 TString Copy()
const;
364 const char *Data()
const {
return GetPointer(); }
365 Bool_t EndsWith(
const char *pat, ECaseCompare cmp = kExact)
const;
366 Bool_t EqualTo(
const char *cs, ECaseCompare cmp = kExact)
const;
367 Bool_t EqualTo(
const TString &st, ECaseCompare cmp = kExact)
const;
368 Ssiz_t First(
char c)
const;
369 Ssiz_t First(
const char *cs)
const;
370 void Form(
const char *fmt, ...)
371 #if defined(__GNUC__) && !defined(__CINT__)
372 __attribute__((format(printf, 2, 3)))
375 UInt_t Hash(ECaseCompare cmp = kExact)
const;
376 Ssiz_t Index(
const char *pat, Ssiz_t i = 0,
377 ECaseCompare cmp = kExact)
const;
378 Ssiz_t Index(
const TString &s, Ssiz_t i = 0,
379 ECaseCompare cmp = kExact)
const;
380 Ssiz_t Index(
const char *pat, Ssiz_t patlen, Ssiz_t i,
381 ECaseCompare cmp)
const;
382 Ssiz_t Index(
const TString &s, Ssiz_t patlen, Ssiz_t i,
383 ECaseCompare cmp)
const;
384 Ssiz_t Index(
const TRegexp &pat, Ssiz_t i = 0)
const;
385 Ssiz_t Index(
const TRegexp &pat, Ssiz_t *ext, Ssiz_t i = 0)
const;
386 Ssiz_t Index(TPRegexp &pat, Ssiz_t i = 0)
const;
387 Ssiz_t Index(TPRegexp &pat, Ssiz_t *ext, Ssiz_t i = 0)
const;
388 TString &Insert(Ssiz_t pos,
const char *s);
389 TString &Insert(Ssiz_t pos,
const char *s, Ssiz_t extent);
390 TString &Insert(Ssiz_t pos,
const TString &s);
391 TString &Insert(Ssiz_t pos,
const TString &s, Ssiz_t extent);
392 Bool_t IsAscii()
const;
393 Bool_t IsAlpha()
const;
394 Bool_t IsAlnum()
const;
395 Bool_t IsDigit()
const;
396 Bool_t IsFloat()
const;
397 Bool_t IsHex()
const;
398 Bool_t IsBin()
const;
399 Bool_t IsOct()
const;
400 Bool_t IsDec()
const;
401 Bool_t IsInBaseN(Int_t base)
const;
402 Bool_t IsNull()
const {
return Length() == 0; }
403 Bool_t IsWhitespace()
const {
return (Length() == CountChar(
' ')); }
404 Ssiz_t Last(
char c)
const;
405 Ssiz_t Length()
const {
return IsLong() ? GetLongSize() : GetShortSize(); }
406 Bool_t MaybeRegexp()
const;
407 Bool_t MaybeWildcard()
const;
409 TString &Prepend(
const char *cs);
410 TString &Prepend(
const char *cs, Ssiz_t n);
411 TString &Prepend(
const TString &s);
412 TString &Prepend(
const TString &s, Ssiz_t n);
413 TString &Prepend(
char c, Ssiz_t rep = 1);
414 std::istream &ReadFile(std::istream &str);
415 std::istream &ReadLine(std::istream &str,
416 Bool_t skipWhite = kTRUE);
417 std::istream &ReadString(std::istream &str);
418 std::istream &ReadToDelim(std::istream &str,
char delim =
'\n');
419 std::istream &ReadToken(std::istream &str);
420 TString &Remove(Ssiz_t pos);
421 TString &Remove(Ssiz_t pos, Ssiz_t n);
422 TString &Remove(EStripType s,
char c);
423 TString &Replace(Ssiz_t pos, Ssiz_t n,
const char *s);
424 TString &Replace(Ssiz_t pos, Ssiz_t n,
const char *s, Ssiz_t ns);
425 TString &Replace(Ssiz_t pos, Ssiz_t n,
const TString &s);
426 TString &Replace(Ssiz_t pos, Ssiz_t n1,
const TString &s, Ssiz_t n2);
427 TString &ReplaceAll(
const TString &s1,
const TString &s2);
428 TString &ReplaceAll(
const TString &s1,
const char *s2);
429 TString &ReplaceAll(
const char *s1,
const TString &s2);
430 TString &ReplaceAll(
const char *s1,
const char *s2);
431 TString &ReplaceAll(
const char *s1, Ssiz_t ls1,
const char *s2, Ssiz_t ls2);
432 void Resize(Ssiz_t n);
433 TSubString Strip(EStripType s = kTrailing,
char c =
' ')
const;
434 TString &Swap(TString &other);
437 TObjArray *Tokenize(
const TString &delim)
const;
438 Bool_t Tokenize(TString &tok, Ssiz_t &from,
const char *delim =
" ")
const;
439 std::string_view View()
const {
return std::string_view(GetPointer(),Length()); }
442 static UInt_t Hash(
const void *txt, Int_t ntxt);
443 static Ssiz_t InitialCapacity(Ssiz_t ic = 15);
444 static Ssiz_t MaxWaste(Ssiz_t mw = 15);
445 static Ssiz_t ResizeIncrement(Ssiz_t ri = 16);
446 static Ssiz_t GetInitialCapacity();
447 static Ssiz_t GetResizeIncrement();
448 static Ssiz_t GetMaxWaste();
449 static TString Itoa ( Int_t value, Int_t base);
450 static TString UItoa ( UInt_t value, Int_t base);
451 static TString LLtoa ( Long64_t value, Int_t base);
452 static TString ULLtoa (ULong64_t value, Int_t base);
453 static TString BaseConvert(
const TString& s_in, Int_t base_in, Int_t base_out);
454 static TString Format(
const char *fmt, ...)
455 #if defined(__GNUC__) && !defined(__CINT__)
456 __attribute__((format(printf, 1, 2)))
464 std::istream &operator>>(std::istream &str, TString &s);
465 std::ostream &operator<<(std::ostream &str,
const TString &s);
466 #if defined(R__TEMPLATE_OVERLOAD_BUG)
469 TBuffer &operator>>(TBuffer &buf, TString *&sp);
470 TBuffer &operator<<(TBuffer &buf,
const TString * sp);
473 inline std::string& operator+=(std::string &left,
const TString &right)
475 return left.append(right.Data());
478 TString ToLower(
const TString &s);
479 TString ToUpper(
const TString &s);
481 inline UInt_t Hash(
const TString &s) {
return s.Hash(); }
482 inline UInt_t Hash(
const TString *s) {
return s->Hash(); }
483 UInt_t Hash(
const char *s);
485 extern char *Form(
const char *fmt, ...)
486 #if defined(__GNUC__) && !defined(__CINT__)
487 __attribute__((format(printf, 1, 2)))
490 extern void Printf(
const char *fmt, ...)
491 #if defined(__GNUC__) && !defined(__CINT__)
492 __attribute__((format(printf, 1, 2)))
495 extern char *Strip(
const char *str,
char c =
' ');
496 extern char *StrDup(
const char *str);
497 extern char *Compress(
const char *str);
498 extern int EscChar(
const char *src,
char *dst,
int dstlen,
char *specchars,
500 extern int UnEscChar(
const char *src,
char *dst,
int dstlen,
char *specchars,
503 #ifdef NEED_STRCASECMP
504 extern int strcasecmp(
const char *str1,
const char *str2);
505 extern int strncasecmp(
const char *str1,
const char *str2, Ssiz_t n);
515 inline typename std::enable_if<ROOT::TypeTraits::IsSignedNumeral<T>::value,TString>::type
516 operator+(TString s, T i)
520 inline typename std::enable_if<ROOT::TypeTraits::IsUnsignedNumeral<T>::value,TString>::type
521 operator+(TString s, T u)
525 inline typename std::enable_if<ROOT::TypeTraits::IsFloatNumeral<T>::value,TString>::type
526 operator+(TString s, T f)
530 inline typename std::enable_if<ROOT::TypeTraits::IsSignedNumeral<T>::value,TString>::type
531 operator+(T i,
const TString &s)
535 snprintf(buffer,
sizeof(buffer),
"%lld", static_cast<Long64_t>(i));
536 return TString(buffer, strlen(buffer), s.Data(), s.Length());
540 inline typename std::enable_if<ROOT::TypeTraits::IsUnsignedNumeral<T>::value,TString>::type
541 operator+(T u,
const TString &s)
545 snprintf(buffer,
sizeof(buffer),
"%llu", static_cast<ULong64_t>(u));
546 return TString(buffer, strlen(buffer), s.Data(), s.Length());
550 inline typename std::enable_if<ROOT::TypeTraits::IsFloatNumeral<T>::value,TString>::type
551 operator+(T f,
const TString &s)
555 snprintf(buffer,
sizeof(buffer),
"%.17Lg", static_cast<LongDouble_t>(f));
556 return TString(buffer, strlen(buffer), s.Data(), s.Length());
559 inline TString &TString::Append(
const char *cs)
560 {
return Replace(Length(), 0, cs, cs ? strlen(cs) : 0); }
562 inline TString &TString::Append(
const char *cs, Ssiz_t n)
563 {
return Replace(Length(), 0, cs, n); }
565 inline TString &TString::Append(
const TString &s)
566 {
return Replace(Length(), 0, s.Data(), s.Length()); }
568 inline TString &TString::Append(
const TString &s, Ssiz_t n)
569 {
return Replace(Length(), 0, s.Data(), TMath::Min(n, s.Length())); }
571 inline TString &TString::operator+=(
const char *cs)
572 {
return Append(cs, cs ? strlen(cs) : 0); }
574 inline TString &TString::operator+=(
const TString &s)
575 {
return Append(s.Data(), s.Length()); }
577 inline TString &TString::operator+=(
char c)
578 {
return Append(c); }
581 inline typename std::enable_if<ROOT::TypeTraits::IsSignedNumeral<T>::value,TString>::type
582 &TString::operator+=(T i)
586 snprintf(buffer,
sizeof(buffer),
"%lld", static_cast<Long64_t>(i));
587 return operator+=(buffer);
591 inline typename std::enable_if<ROOT::TypeTraits::IsUnsignedNumeral<T>::value,TString>::type
592 &TString::operator+=(T u)
596 snprintf(buffer,
sizeof(buffer),
"%llu", static_cast<ULong64_t>(u));
597 return operator+=(buffer);
601 inline typename std::enable_if<ROOT::TypeTraits::IsFloatNumeral<T>::value,TString>::type
602 &TString::operator+=(T f)
606 snprintf(buffer,
sizeof(buffer),
"%.17Lg", static_cast<LongDouble_t>(f));
607 return operator+=(buffer);
610 inline Bool_t TString::BeginsWith(
const char *s, ECaseCompare cmp)
const
611 {
return Index(s, s ? strlen(s) : (Ssiz_t)0, (Ssiz_t)0, cmp) == 0; }
613 inline Bool_t TString::BeginsWith(
const TString &pat, ECaseCompare cmp)
const
614 {
return Index(pat.Data(), pat.Length(), (Ssiz_t)0, cmp) == 0; }
616 inline Bool_t TString::Contains(
const TString &pat, ECaseCompare cmp)
const
617 {
return Index(pat.Data(), pat.Length(), (Ssiz_t)0, cmp) != kNPOS; }
619 inline Bool_t TString::Contains(
const char *s, ECaseCompare cmp)
const
620 {
return Index(s, s ? strlen(s) : 0, (Ssiz_t)0, cmp) != kNPOS; }
622 inline Bool_t TString::Contains(
const TRegexp &pat)
const
623 {
return Index(pat, (Ssiz_t)0) != kNPOS; }
625 inline Bool_t TString::Contains(TPRegexp &pat)
const
626 {
return Index(pat, (Ssiz_t)0) != kNPOS; }
628 inline Bool_t TString::EqualTo(
const char *cs, ECaseCompare cmp)
const
629 {
return (CompareTo(cs, cmp) == 0) ? kTRUE : kFALSE; }
631 inline Bool_t TString::EqualTo(
const TString &st, ECaseCompare cmp)
const
632 {
return (CompareTo(st, cmp) == 0) ? kTRUE : kFALSE; }
634 inline Ssiz_t TString::Index(
const char *s, Ssiz_t i, ECaseCompare cmp)
const
635 {
return Index(s, s ? strlen(s) : 0, i, cmp); }
637 inline Ssiz_t TString::Index(
const TString &s, Ssiz_t i, ECaseCompare cmp)
const
638 {
return Index(s.Data(), s.Length(), i, cmp); }
640 inline Ssiz_t TString::Index(
const TString &pat, Ssiz_t patlen, Ssiz_t i,
641 ECaseCompare cmp)
const
642 {
return Index(pat.Data(), patlen, i, cmp); }
644 inline TString &TString::Insert(Ssiz_t pos,
const char *cs)
645 {
return Replace(pos, 0, cs, cs ? strlen(cs) : 0); }
647 inline TString &TString::Insert(Ssiz_t pos,
const char *cs, Ssiz_t n)
648 {
return Replace(pos, 0, cs, n); }
650 inline TString &TString::Insert(Ssiz_t pos,
const TString &s)
651 {
return Replace(pos, 0, s.Data(), s.Length()); }
653 inline TString &TString::Insert(Ssiz_t pos,
const TString &s, Ssiz_t n)
654 {
return Replace(pos, 0, s.Data(), TMath::Min(n, s.Length())); }
656 inline TString &TString::Prepend(
const char *cs)
657 {
return Replace(0, 0, cs, cs ? strlen(cs) : 0); }
659 inline TString &TString::Prepend(
const char *cs, Ssiz_t n)
660 {
return Replace(0, 0, cs, n); }
662 inline TString &TString::Prepend(
const TString &s)
663 {
return Replace(0, 0, s.Data(), s.Length()); }
665 inline TString &TString::Prepend(
const TString &s, Ssiz_t n)
666 {
return Replace(0, 0, s.Data(), TMath::Min(n, s.Length())); }
668 inline TString &TString::Remove(Ssiz_t pos)
669 {
return Replace(pos, TMath::Max(0, Length()-pos), 0, 0); }
671 inline TString &TString::Remove(Ssiz_t pos, Ssiz_t n)
672 {
return Replace(pos, n, 0, 0); }
674 inline TString &TString::Chop()
675 {
return Remove(TMath::Max(0, Length()-1)); }
677 inline TString &TString::Replace(Ssiz_t pos, Ssiz_t n,
const char *cs)
678 {
return Replace(pos, n, cs, cs ? strlen(cs) : 0); }
680 inline TString &TString::Replace(Ssiz_t pos, Ssiz_t n,
const TString& s)
681 {
return Replace(pos, n, s.Data(), s.Length()); }
683 inline TString &TString::Replace(Ssiz_t pos, Ssiz_t n1,
const TString &s,
685 {
return Replace(pos, n1, s.Data(), TMath::Min(s.Length(), n2)); }
687 inline TString &TString::ReplaceAll(
const TString &s1,
const TString &s2)
688 {
return ReplaceAll(s1.Data(), s1.Length(), s2.Data(), s2.Length()) ; }
690 inline TString &TString::ReplaceAll(
const TString &s1,
const char *s2)
691 {
return ReplaceAll(s1.Data(), s1.Length(), s2, s2 ? strlen(s2) : 0); }
693 inline TString &TString::ReplaceAll(
const char *s1,
const TString &s2)
694 {
return ReplaceAll(s1, s1 ? strlen(s1) : 0, s2.Data(), s2.Length()); }
696 inline TString &TString::ReplaceAll(
const char *s1,
const char *s2)
697 {
return ReplaceAll(s1, s1 ? strlen(s1) : 0, s2, s2 ? strlen(s2) : 0); }
699 inline TString &TString::Swap(TString &other) {
702 Rep_t tmp = other.fRep;
709 inline char &TString::operator()(Ssiz_t i)
710 {
return GetPointer()[i]; }
712 inline char TString::operator()(Ssiz_t i)
const
713 {
return GetPointer()[i]; }
715 inline char &TString::operator[](Ssiz_t i)
716 { AssertElement(i);
return GetPointer()[i]; }
718 inline char TString::operator[](Ssiz_t i)
const
719 { AssertElement(i);
return GetPointer()[i]; }
721 inline const char *TSubString::Data()
const
737 return fStr.Data() + fBegin;
741 inline char TSubString::operator[](Ssiz_t i)
const
742 { AssertElement(i);
return fStr.GetPointer()[fBegin+i]; }
744 inline char TSubString::operator()(Ssiz_t i)
const
745 {
return fStr.GetPointer()[fBegin+i]; }
747 inline TSubString &TSubString::operator=(
const TSubString &s)
748 { fStr = s.fStr; fBegin = s.fBegin; fExtent = s.fExtent;
return *
this; }
752 inline Bool_t operator==(
const TString &s1,
const TString &s2)
754 return ((s1.Length() == s2.Length()) &&
755 !memcmp(s1.Data(), s2.Data(), s1.Length()));
758 inline Bool_t operator!=(
const TString &s1,
const TString &s2)
759 {
return !(s1 == s2); }
761 inline Bool_t operator<(
const TString &s1,
const TString &s2)
762 {
return s1.CompareTo(s2) < 0; }
764 inline Bool_t operator>(
const TString &s1,
const TString &s2)
765 {
return s1.CompareTo(s2) > 0; }
767 inline Bool_t operator<=(
const TString &s1,
const TString &s2)
768 {
return s1.CompareTo(s2) <= 0; }
770 inline Bool_t operator>=(
const TString &s1,
const TString &s2)
771 {
return s1.CompareTo(s2) >= 0; }
774 inline Bool_t operator!=(
const TString &s1,
const char *s2)
775 {
return !(s1 == s2); }
777 inline Bool_t operator<(
const TString &s1,
const char *s2)
778 {
return s1.CompareTo(s2) < 0; }
780 inline Bool_t operator>(
const TString &s1,
const char *s2)
781 {
return s1.CompareTo(s2) > 0; }
783 inline Bool_t operator<=(
const TString &s1,
const char *s2)
784 {
return s1.CompareTo(s2) <= 0; }
786 inline Bool_t operator>=(
const TString &s1,
const char *s2)
787 {
return s1.CompareTo(s2) >= 0; }
789 inline Bool_t operator==(
const char *s1,
const TString &s2)
790 {
return (s2 == s1); }
792 inline Bool_t operator!=(
const char *s1,
const TString &s2)
793 {
return !(s2 == s1); }
795 inline Bool_t operator<(
const char *s1,
const TString &s2)
796 {
return s2.CompareTo(s1) > 0; }
798 inline Bool_t operator>(
const char *s1,
const TString &s2)
799 {
return s2.CompareTo(s1) < 0; }
801 inline Bool_t operator<=(
const char *s1,
const TString &s2)
802 {
return s2.CompareTo(s1) >= 0; }
804 inline Bool_t operator>=(
const char *s1,
const TString &s2)
805 {
return s2.CompareTo(s1) <= 0; }
811 inline Bool_t operator==(
const TString &s1,
const TSubString &s2)
812 {
return (s2 == s1); }
814 inline Bool_t operator==(
const char *s1,
const TSubString &s2)
815 {
return (s2 == s1); }
817 inline Bool_t operator!=(
const TSubString &s1,
const char *s2)
818 {
return !(s1 == s2); }
820 inline Bool_t operator!=(
const TSubString &s1,
const TString &s2)
821 {
return !(s1 == s2); }
823 inline Bool_t operator!=(
const TSubString &s1,
const TSubString &s2)
824 {
return !(s1 == s2); }
826 inline Bool_t operator!=(
const TString &s1,
const TSubString &s2)
827 {
return !(s2 == s1); }
829 inline Bool_t operator!=(
const char *s1,
const TSubString &s2)
830 {
return !(s2 == s1); }
834 inline Bool_t operator==(
const char *s1,
const std::string_view &s2)
836 return std::string_view(s1) == s2;
839 inline Bool_t operator==(
const std::string_view &s1,
const char *s2)
841 return s1 == std::string_view(s2);
850 std::string printValue(
const TString* val);
851 std::string printValue(
const TSubString* val);
852 std::string printValue(
const std::string_view* val);