35# pragma warning(disable : 4710)
38void TestStringClass();
57 void AddRef() { refcount++; }
79 friend class Archiver;
81 void EnsureAlloced(
size_t,
bool keepold =
true);
82 void EnsureDataWritable();
87 str(
const char *text);
88 str(
const str&
string);
89 str(
const str&
string,
size_t start,
size_t end);
93 str(
const unsigned int num);
95 str(
const unsigned long num);
96 str(
const long long num);
97 str(
const unsigned long long num);
100 str& operator=(str&&
string);
102 size_t length(
void)
const;
103 const char *c_str(
void)
const;
105 void append(
const char *text);
106 void append(
const str& text);
108 char operator[](intptr_t index)
const;
109 char& operator[](intptr_t index);
111 void operator=(
const str& text);
112 void operator=(
const char *text);
114 friend str operator+(
const str& a,
const str& b);
115 friend str operator+(
const str& a,
const char *b);
116 friend str operator+(
const char *a,
const str& b);
118 friend str operator+(
const str& a,
const float b);
119 friend str operator+(
const str& a,
const int b);
120 friend str operator+(
const str& a,
const unsigned b);
121 friend str operator+(
const str& a,
const bool b);
122 friend str operator+(
const str& a,
const char b);
124 str& operator+=(
const str& a);
125 str& operator+=(
const char *a);
126 str& operator+=(
const float a);
127 str& operator+=(
const char a);
128 str& operator+=(
const int a);
129 str& operator+=(
const unsigned a);
130 str& operator+=(
const bool a);
132 str& operator-=(
int c);
133 str& operator--(
int);
135 friend bool operator==(
const str& a,
const str& b);
136 friend bool operator==(
const str& a,
const char *b);
137 friend bool operator==(
const char *a,
const str& b);
139 friend bool operator!=(
const str& a,
const str& b);
140 friend bool operator!=(
const str& a,
const char *b);
141 friend bool operator!=(
const char *a,
const str& b);
143 operator const char *()
const;
145 int icmpn(
const char *text,
size_t n)
const;
146 int icmpn(
const str& text,
size_t n)
const;
147 int icmp(
const char *text)
const;
148 int icmp(
const str& text)
const;
149 int cmpn(
const char *text,
size_t n)
const;
150 int cmpn(
const str& text,
size_t n)
const;
155 static char *tolower(
char *s1);
156 static char *toupper(
char *s1);
158 static int icmpn(
const char *s1,
const char *s2,
size_t n);
159 static int icmp(
const char *s1,
const char *s2);
160 static int cmpn(
const char *s1,
const char *s2,
size_t n);
161 static int cmp(
const char *s1,
const char *s2);
163 static void snprintf(
char *dst,
int size,
const char *fmt, ...);
166 static bool isNumeric(
const char *str);
167 bool isNumeric(
void)
const;
169 void CapLength(
size_t newlen);
171 void BackSlashesToSlashes();
172 void SlashesToBackSlashes();
173 void DefaultExtension(
const char *extension);
174 const char *GetExtension()
const;
175 void StripExtension();
180char *strstrip(
char *
string);
181char *strlwc(
char *
string);
183inline char str::operator[](intptr_t index)
const
192 assert((index >= 0) && (index < (
int)m_data->len));
196 if ((index < 0) || (index >= (
int)m_data->len)) {
200 return m_data->data[index];
203inline size_t str::length(
void)
const
205 return (m_data != NULL) ? m_data->len : 0;
220inline str::str(
const char *text)
230 EnsureAlloced(len + 1);
231 strcpy(m_data->data, text);
237inline str::str(
const str& text)
241 text.m_data->AddRef();
248 m_data = text.m_data;
251inline str::str(
const str& text,
size_t start,
size_t end)
257 if (end > text.length()) {
261 if (start > text.length()) {
262 start = text.length();
272 EnsureAlloced(len + 1);
274 for (i = 0; i < len; i++) {
275 m_data->data[i] = text[start + i];
278 m_data->data[len] = 0;
283inline str::str(
const char ch)
288 m_data->data[0] = ch;
293inline str::str(
const float num)
299 snprintf(text,
sizeof(text),
"%.3f", num);
301 EnsureAlloced(len + 1);
302 strcpy(m_data->data, text);
306inline str::str(
const int num)
312 snprintf(text,
sizeof(text),
"%d", num);
314 EnsureAlloced(len + 1);
315 strcpy(m_data->data, text);
319inline str::str(
const unsigned int num)
325 snprintf(text,
sizeof(text),
"%u", num);
327 EnsureAlloced(len + 1);
328 strcpy(m_data->data, text);
332inline str::str(
const long num)
338 snprintf(text,
sizeof(text),
"%ld", num);
340 EnsureAlloced(len + 1);
341 strcpy(m_data->data, text);
345inline str::str(
const unsigned long num)
351 snprintf(text,
sizeof(text),
"%lu", num);
353 EnsureAlloced(len + 1);
354 strcpy(m_data->data, text);
358inline str::str(
const long long num)
364 snprintf(text,
sizeof(text),
"%lld", num);
366 EnsureAlloced(len + 1);
367 strcpy(m_data->data, text);
371inline str::str(
const unsigned long long num)
377 snprintf(text,
sizeof(text),
"%llu", num);
379 EnsureAlloced(len + 1);
380 strcpy(m_data->data, text);
384inline const char *str::c_str(
void)
const
393inline str::str(
str&&
string)
396 string.m_data = NULL;
399inline str& str::operator=(
str&&
string)
405 m_data =
string.m_data;
406 string.m_data = NULL;
411inline void str::append(
const char *text)
420 EnsureAlloced(len + 1);
422 strcat(m_data->data, text);
427inline void str::append(
const str& text)
429 append(text.c_str());
432inline char& str::operator[](intptr_t index)
435 static char dummy = 0;
440 EnsureDataWritable();
447 assert((index >= 0) && (index < (
int)m_data->len));
451 if ((index < 0) || (index >= (
int)m_data->len)) {
455 return m_data->data[index];
458inline void str::operator=(
const str& text)
463 text.m_data->AddRef();
470 m_data = text.m_data;
473inline void str::operator=(
const char *text)
480 if (text == m_data->data) {
491 m_data =
new strdata;
493 m_data->alloced = len + 1;
494 m_data->data =
new char[len + 1];
495 strcpy(m_data->data, text);
499inline str operator+(
const str& a,
const str& b)
508inline str operator+(
const str& a,
const char *b)
517inline str operator+(
const char *a,
const str& b)
526inline str operator+(
const str& a,
const bool b)
530 result.append(b ?
"true" :
"false");
535inline str operator+(
const str& a,
const char b)
545inline str& str::operator+=(
const str& a)
551inline str& str::operator+=(
const char *a)
557inline str& str::operator+=(
const char a)
568inline str& str::operator+=(
const bool a)
570 append(a ?
"true" :
"false");
574inline bool operator==(
const str& a,
const str& b)
576 return (!strcmp(a.c_str(), b.c_str()));
579inline bool operator==(
const str& a,
const char *b)
585 return (!strcmp(a.c_str(), b));
588inline bool operator==(
const char *a,
const str& b)
594 return (!strcmp(a, b.c_str()));
597inline bool operator!=(
const str& a,
const str& b)
602inline bool operator!=(
const str& a,
const char *b)
607inline bool operator!=(
const char *a,
const str& b)
612inline int str::icmpn(
const char *text,
size_t n)
const
616 return str::icmpn(c_str(), text, n);
619inline int str::icmpn(
const str& text,
size_t n)
const
621 return str::icmpn(c_str(), text.c_str(), n);
624inline int str::icmp(
const char *text)
const
628 return str::icmp(c_str(), text);
631inline int str::icmp(
const str& text)
const
633 return str::icmp(c_str(), text.c_str());
636inline int str::cmpn(
const char *text,
size_t n)
const
640 return str::cmpn(c_str(), text, n);
643inline int str::cmpn(
const str& text,
size_t n)
const
645 return str::cmpn(c_str(), text.c_str(), n);
648inline void str::tolower(
void)
651 EnsureDataWritable();
653 str::tolower(m_data->data);
657inline void str::toupper(
void)
660 EnsureDataWritable();
662 str::toupper(m_data->data);
666inline bool str::isNumeric(
void)
const
669 return str::isNumeric(m_data->data);
672inline str::operator
const char *(void)
const
@ string
string value
Definition json.hpp:2859