acl  3.5.3.0
string.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <vector>
4 #include <list>
5 #include <string>
6 #include <stdarg.h>
7 #include <utility>
8 
9 struct ACL_VSTRING;
10 struct ACL_LINE_STATE;
11 
12 namespace acl {
13 
14 class dbuf_pool;
15 
16 /**
17  * 该类为字符串处理类,支持大部分 std::string 中的功能,同时支持其不支持的一些
18  * 功能;该类内部自动保证最后一个字符为 \0
19  */
21 {
22 public:
23  /**
24  * 构造函数
25  * @param n {size_t} 初始时分配的内存大小
26  * @param bin {bool} 是否以二进制方式构建缓冲区对象,该值为 true 时,
27  * 则当调用 += int|int64|short|char 或调用 << int|int64|short|char
28  * 时,则按二进制方式处理,否则按文本方式处理
29  */
30  string(size_t n, bool bin);
31  explicit string(size_t n);
32  string(void);
33 
34  /**
35  * 构造函数
36  * @param s {const string&} 源字符串对象,初始化后的类对象内部自动复制
37  * 该字符串
38  */
39  string(const string& s);
40 
41  /**
42  * 构造函数
43  * @param s {const char*} 内部自动用该字符串初始化类对象,s 必须是
44  * 以 \0 结尾
45  */
46  string(const char* s);
47 
48  /**
49  * 构造函数
50  * @param s {const char*} 源缓冲内容
51  * @param n {size_t} s 缓冲区数据长度
52  */
53  string(const void* s, size_t n);
54 
55 #if defined(_WIN32) || defined(_WIN64)
56  /**
57  * 采用内存映射文件方式构造对象
58  * @param fd {int} 文件句柄
59  * @param max {size_t} 所映射的最大空间大小
60  * @param n {size_t} 初始化大小
61  */
62  string(void* fd, size_t max, size_t n);
63 #else
64  string(int fd, size_t max, size_t n);
65 #endif
66 
67  virtual ~string(void);
68 
69  /**
70  * 设置字符串类对象为二进制处理模式
71  * @param bin {bool} 当该值为 true 时,则设置字符串类对象为二进制处理
72  * 方式;否则为文本方式;为 true 时,则当调用 += int|int64|short|char
73  * 或调用 << int|int64|short|char 时,则按二进制方式处理,否则按文本
74  * 方式处理
75  * @return {string&}
76  */
77  string& set_bin(bool bin);
78 
79  /**
80  * 设置缓冲区的最大长度,以避免缓冲区溢出
81  * @param max {int}
82  * @return {string&}
83  */
84  string& set_max(int max);
85 
86  /**
87  * 判断当前字符串类对象是否为二进制处理方式
88  * @return {bool} 返回值为 true 时则表示为二进制方式
89  */
90  bool get_bin() const;
91 
92  /**
93  * 返回当前缓冲区的最大长度限制,若返回值 <= 0 则表示没有限制
94  * @return {int}
95  */
96  int get_max(void) const;
97 
98  /**
99  * 根据字符数组下标获得指定位置的字符,输入参数必须为合法值,否则则
100  * 内部产生断言
101  * @param n {size_t} 指定的位置(该值 >= 0 且 < 字符串长度),如果越界
102  * 则产生断言
103  * @return {char} 返回指定位置的字符
104  */
105  char operator[](size_t n) const;
106 
107  /**
108  * 根据字符数组下标获得指定位置的字符,输入参数必须为合法值,否则则
109  * 内部产生断言
110  * @param n {int} 指定的位置(该值 >= 0 且 < 字符串长度),如果越界,
111  * 则产生断言
112  * @return {char} 返回指定位置的字符
113  */
114  char operator[](int n) const;
115 
116  /**
117  * 左值赋值重载,用户可以直接使用对象的数组下标进行赋值,如果下标组值
118  * 越界,则内部会自动扩充缓冲区空间
119  * @param n {size_t} 数组下标位置
120  * @return {char&}
121  */
122  char& operator[](size_t n);
123 
124  /**
125  * 左值赋值重载,用户可以直接使用对象的数组下标进行赋值,如果下标组值
126  * 越界,则内部会自动扩充缓冲区空间
127  * @param n {int} 数组下标位置,该值必须 >= 0
128  * @return {char&}
129  */
130  char& operator[](int n);
131 
132  /**
133  * 对目标字符串类对象赋值
134  * @param s {const char*} 源字符串
135  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
136  */
137  string& operator=(const char* s);
138 
139  /**
140  * 对目标字符串类对象赋值
141  * @param s {const string&} 源字符串对象
142  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
143  */
144  string& operator=(const string& s);
145 
146  /**
147  * 对目标字符串类对象赋值
148  * @param s {const string*} 源字符串对象
149  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
150  */
151  string& operator=(const string* s);
152 
153  /**
154  * 对目标字符串类对象赋值
155  * @param s {const std::string&} 源字符串对象
156  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
157  */
158  string& operator=(const std::string& s);
159 
160  /**
161  * 对目标字符串类对象赋值
162  * @param s {const std::string*} 源字符串对象
163  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
164  */
165  string& operator=(const std::string* s);
166 
167 #if defined(_WIN32) || defined(_WIN64)
168  /**
169  * 对目标字符串类对象赋值
170  * @param n {long long int} 源 64 位符号长整数,若当前对象的当前状态为
171  * 二进制模式,则该函数便会以二进制方式赋值给字符串对象,否则以文本方
172  * 式赋值给字符串对象;关于二进制模式还是文本方式,其含义参见
173  * set_bin(bool)
174  * @return {string&} 返回当前字对象的引用,便于对该类对象连续进行操作
175  */
176  string& operator=(__int64 n);
177 
178  /**
179  * 对目标字符串类对象赋值
180  * @param n {unsinged long long int} 源 64 位无符号长整数,若字符串对象
181  * 的当前状态为二进制模式,则该函数便会以二进制方式赋值给字符串对象,
182  * 否则以文本方式赋值给字符串对象;关于二进制模式还是文本方式,其含义
183  * 参见 set_bin(bool)
184  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
185  */
186  string& operator=(unsigned __int64);
187 #else
188  string& operator=(long long int);
189  string& operator=(unsigned long long int);
190 #endif
191 
192  /**
193  * 对目标字符串类对象赋值
194  * @param n {char} 源有符号字符;若字符串对象的当前状态为二进制模式,
195  * 则该函数便会以二进制方式赋值给字符串对象,否则以文本方式赋值给字
196  * 符串对象;关于二进制模式还是文本方式,其含义参见 set_bin(bool)
197  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
198  */
199  string& operator=(char n);
200 
201  /**
202  * 对目标字符串类对象赋值
203  * @param n {char} 源无符号字符;若对象的当前状态为二进制模式,则该函数
204  * 便会以二进制方式赋值给字符串对象,否则以文本方式赋值给字符串对象;
205  * 关于二进制模式还是文本方式,其含义参见 set_bin(bool)
206  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
207  */
208  string& operator=(unsigned char n);
209 
210  /**
211  * 对目标字符串类对象赋值
212  * @param n {char} 源有符号长整型;若对象当前状态为二进制模式,则该函数
213  * 便会以二进制方式赋值给字符串对象,否则以文本方式赋值给字符串对象;
214  * 关于二进制模式还是文本方式,其含义参见 set_bin(bool)
215  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
216  */
217  string& operator=(long n);
218 
219  /**
220  * 对目标字符串类对象赋值
221  * @param n {char} 源无符号长整型;若字对象的当前状态为二进制模式,
222  * 则该函数便会以二进制方式赋值给字符串对象,否则以文本方式赋值给
223  * 字符串对象;关于二进制模式还是文本方式,其含义参见 set_bin(bool)
224  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
225  */
226  string& operator=(unsigned long n);
227 
228  /**
229  * 对目标字符串类对象赋值
230  * @param n {char} 源有符号整型;若字符串对象的当前状态为二进制模式,
231  * 则该函数便会以二进制方式赋值给字符串对象,否则以文本方式赋值给字符
232  * 串对象;关于二进制模式还是文本方式,其含义参见 set_bin(bool)
233  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
234  */
235  string& operator=(int n);
236 
237  /**
238  * 对目标字符串类对象赋值
239  * @param n {char} 源无符号整型;若字符串对象的当前状态为二进制模式,
240  * 则该函数便会以二进制方式赋值给字符串对象,否则以文本方式赋值给字符
241  * 串对象;关于二进制模式还是文本方式,其含义参见 set_bin(bool)
242  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
243  */
244  string& operator=(unsigned int n);
245 
246  /**
247  * 对目标字符串类对象赋值
248  * @param n {char} 源有符号短整型;若字符串对象的当前状态为二进制模式,
249  * 则该函数便会以二进制方式赋值给字符串对象,否则以文本方式赋值给字符
250  * 串对象;关于二进制模式还是文本方式,其含义参见 set_bin(bool)
251  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
252  */
253  string& operator=(short n);
254 
255  /**
256  * 对目标字符串类对象赋值
257  * @param n {char} 源无符号短整型;若对象的当前状态为二进制模式,则该
258  * 函数便会以二进制方式赋值给字符串对象,否则以文本方式赋值给字符串
259  * 对象;关于二进制模式还是文本方式,其含义参见 set_bin(bool)
260  * @return {string&} 返回当前对象的引用,便于对该类对象连续进行操作
261  */
262  string& operator=(unsigned short n);
263 
264  /**
265  * 向目标字符串对象尾部添加字符串
266  * @param s {const char*} 源字符串指针
267  * @return {string&} 目标字符串对象的引用
268  */
269  string& operator+=(const char* s);
270 
271  /**
272  * 向目标字符串对象尾部添加字符串
273  * @param s {const string&} 源字符串对象引用
274  * @return {string&} 目标字符串对象的引用
275  */
276  string& operator+=(const string& s);
277 
278  /**
279  * 向目标字符串对象尾部添加字符串
280  * @param s {const string*} 源字符串对象指针
281  * @return {string&} 目标字符串对象的引用
282  */
283  string& operator+=(const string* s);
284 
285  /**
286  * 向目标字符串对象尾部添加字符串
287  * @param s {const std::string&} 源字符串对象引用
288  * @return {string&} 目标字符串对象的引用
289  */
290  string& operator+=(const std::string& s);
291 
292  /**
293  * 向目标字符串对象尾部添加字符串
294  * @param s {const std::string*} 源字符串对象指针
295  * @return {string&} 目标字符串对象的引用
296  */
297  string& operator+=(const std::string* s);
298 
299 #if defined(_WIN32) || defined(_WIN64)
300  /**
301  * 向目标字符串对象尾部添加有符号长整型数字,当为目标字符串对象为
302  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
303  * @param n {long long int} 源 64 位有符号整数
304  * @return {string&} 目标字符串对象的引用
305  */
306  string& operator+=(__int64 n);
307 
308  /**
309  * 向目标字符串对象尾部添加无符号长整型数字,当为目标字符串对象为
310  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
311  * @param n {long long int} 源 64 位无符号整数
312  * @return {string&} 目标字符串对象的引用
313  */
314  string& operator+=(unsigned __int64 n);
315 #else
316  string& operator+=(long long int n);
317  string& operator+=(unsigned long long int n);
318 #endif
319 
320  /**
321  * 向目标字符串对象尾部添加有符号长整型数字,当为目标字符串对象为
322  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
323  * @param n {long} 源有符号长整数
324  * @return {string&} 目标字符串对象的引用
325  */
326  string& operator+=(long n);
327 
328  /**
329  * 向目标字符串对象尾部添加无符号长整型数字,当为目标字符串对象为
330  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
331  * @param n {long} 源无符号长整数
332  * @return {string&} 目标字符串对象的引用
333  */
334  string& operator+=(unsigned long n);
335 
336  /**
337  * 向目标字符串对象尾部添加有符号整型数字,当为目标字符串对象为
338  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
339  * @param n {long} 源有符号整数
340  * @return {string&} 目标字符串对象的引用
341  */
342  string& operator+=(int n);
343 
344  /**
345  * 向目标字符串对象尾部添加无符号整型数字,当为目标字符串对象为
346  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
347  * @param n {long} 源无符号整数
348  * @return {string&} 目标字符串对象的引用
349  */
350  string& operator+=(unsigned int n);
351 
352  /**
353  * 向目标字符串对象尾部添加有符号短整型数字,当为目标字符串对象为
354  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
355  * @param n {long} 源有符号短整数
356  * @return {string&} 目标字符串对象的引用
357  */
358  string& operator+=(short n);
359 
360  /**
361  * 向目标字符串对象尾部添加无符号短整型数字,当为目标字符串对象为
362  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
363  * @param n {long} 源无符号短整数
364  * @return {string&} 目标字符串对象的引用
365  */
366  string& operator+=(unsigned short n);
367 
368  /**
369  * 向目标字符串对象尾部添加有符号字符,当为目标字符串对象为
370  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
371  * @param n {long} 源有符号字符
372  * @return {string&} 目标字符串对象的引用
373  */
374  string& operator+=(char n);
375 
376  /**
377  * 向目标字符串对象尾部添加无符号字符,当为目标字符串对象为
378  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
379  * @param n {long} 源无符号字符
380  * @return {string&} 目标字符串对象的引用
381  */
382  string& operator+=(unsigned char n);
383 
384  /**
385  * 向目标字符串对象尾部添加字符串
386  * @param s {const string&} 源字符串对象引用
387  * @return {string&} 目标字符串对象的引用
388  */
389  string& operator<<(const string& s);
390 
391  /**
392  * 向目标字符串对象尾部添加字符串
393  * @param s {const string*} 源字符串对象指针
394  * @return {string&} 目标字符串对象的引用
395  */
396  string& operator<<(const string* s);
397 
398  /**
399  * 向目标字符串对象尾部添加字符串
400  * @param s {const std::string&} 源字符串对象引用
401  * @return {string&} 目标字符串对象的引用
402  */
403  string& operator<<(const std::string& s);
404 
405  /**
406  * 向目标字符串对象尾部添加字符串
407  * @param s {const std::string*} 源字符串对象指针
408  * @return {string&} 目标字符串对象的引用
409  */
410  string& operator<<(const std::string* s);
411 
412  /**
413  * 向目标字符串对象尾部添加字符串
414  * @param s {const char*} 源字符串指针
415  * @return {string&} 目标字符串对象的引用
416  */
417  string& operator<<(const char* s);
418 #if defined(_WIN32) || defined(_WIN64)
419  /**
420  * 向目标字符串对象尾部添加有符号长整型数字,当为目标字符串对象为
421  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
422  * @param n {long long int} 源 64 位有符号整数
423  * @return {string&} 目标字符串对象的引用
424  */
425  string& operator<<(__int64 n);
426 
427  /**
428  * 向目标字符串对象尾部添加无符号长整型数字,当为目标字符串对象为
429  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
430  * @param n {long long int} 源 64 位无符号整数
431  * @return {string&} 目标字符串对象的引用
432  */
433  string& operator<<(unsigned __int64 n);
434 #else
435  string& operator<<(long long int n);
436  string& operator<<(unsigned long long int n);
437 #endif
438 
439  /**
440  * 向目标字符串对象尾部添加有符号长整型数字,当为目标字符串对象为
441  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
442  * @param n {long} 源有符号长整数
443  * @return {string&} 目标字符串对象的引用
444  */
445  string& operator<<(long n);
446 
447  /**
448  * 向目标字符串对象尾部添加无符号长整型数字,当为目标字符串对象为
449  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
450  * @param n {long} 源无符号长整数
451  * @return {string&} 目标字符串对象的引用
452  */
453  string& operator<<(unsigned long n);
454 
455  /**
456  * 向目标字符串对象尾部添加有符号整型数字,当为目标字符串对象为
457  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
458  * @param n {long} 源有符号整数
459  * @return {string&} 目标字符串对象的引用
460  */
461  string& operator<<(int n);
462 
463  /**
464  * 向目标字符串对象尾部添加无符号整型数字,当为目标字符串对象为
465  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
466  * @param n {long} 源无符号整数
467  * @return {string&} 目标字符串对象的引用
468  */
469  string& operator<<(unsigned int n);
470 
471  /**
472  * 向目标字符串对象尾部添加有符号短整型数字,当为目标字符串对象为
473  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
474  * @param n {long} 源有符号短整数
475  * @return {string&} 目标字符串对象的引用
476  */
477  string& operator<<(short n);
478 
479  /**
480  * 向目标字符串对象尾部添加无符号短整型数字,当为目标字符串对象为
481  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
482  * @param n {long} 源无符号短整数
483  * @return {string&} 目标字符串对象的引用
484  */
485  string& operator<<(unsigned short n);
486 
487  /**
488  * 向目标字符串对象尾部添加有符号字符,当为目标字符串对象为
489  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
490  * @param n {long} 源有符号字符
491  * @return {string&} 目标字符串对象的引用
492  */
493  string& operator<<(char n);
494 
495  /**
496  * 向目标字符串对象尾部添加无符号字符,当为目标字符串对象为
497  * 二进制方式时,则按二进制数字方式添加;否则按文本方式添加
498  * @param n {long} 源无符号字符
499  * @return {string&} 目标字符串对象的引用
500  */
501  string& operator<<(unsigned char n);
502 
503  /**
504  * 将字符串对象中的内容赋予目标字符串对象
505  * @param s {string*} 目标字符串对象
506  * @return {size_t} 返回拷贝的实际字节数,empty() == true 时,则返回 0
507  */
508  size_t operator>>(string* s);
509 
510  /**
511  * 将字符串对象中的内容赋予目标字符串对象
512  * @param s {string&} 目标字符串对象
513  * @return {size_t} 返回拷贝的实际字节数,empty() == true 时,则返回 0
514  */
515  size_t operator>>(string& s);
516 
517  /**
518  * 将字符串对象中的内容赋予目标字符串对象
519  * @param s {std::string*} 目标字符串对象
520  * @return {size_t} 返回拷贝的实际字节数,empty() == true 时,则返回 0
521  */
522  size_t operator>>(std::string* s);
523 
524  /**
525  * 将字符串对象中的内容赋予目标字符串对象
526  * @param s {std::string&} 目标字符串对象
527  * @return {size_t} 返回拷贝的实际字节数,empty() == true 时,则返回 0
528  */
529  size_t operator>>(std::string& s);
530 
531 #if defined(_WIN32) || defined(_WIN64)
532  /**
533  * 将字符串对象中的内容赋予目标 64 位有符号整数
534  * @param n {string*} 目标 64 位有符号整数
535  * @return {size_t} 返回拷贝的实际字节数,empty() == true 时,则返回 0
536  */
537  size_t operator>>(__int64& n);
538 
539  /**
540  * 将字符串对象中的内容赋予目标 64 位无符号整数
541  * @param n {string*} 目标 64 位无符号整数
542  * @return {size_t} 返回拷贝的实际字节数,empty() == true 时,则返回 0
543  */
544  size_t operator>>(unsigned __int64& n);
545 #else
546  size_t operator>>(long long int&);
547  size_t operator>>(unsigned long long int&);
548 #endif
549 
550  /**
551  * 将字符串对象中的内容赋予目标 32 位有符号整数
552  * @param n {string*} 目标 32 位有符号整数
553  * @return {size_t} 返回拷贝的实际字节数,empty() == true 时,则返回 0
554  */
555  size_t operator>>(int& n);
556 
557  /**
558  * 将字符串对象中的内容赋予目标 32 位无符号整数
559  * @param n {string*} 目标 32 位无符号整数
560  * @return {size_t} 返回拷贝的实际字节数,empty() == true 时,则返回 0
561  */
562  size_t operator>>(unsigned int& n);
563 
564  /**
565  * 将字符串对象中的内容赋予目标 16 位有符号整数
566  * @param n {string*} 目标 16 位有符号整数
567  * @return {size_t} 返回拷贝的实际字节数,empty() == true 时,则返回 0
568  */
569  size_t operator>>(short& n);
570 
571  /**
572  * 将字符串对象中的内容赋予目标 16 位无符号整数
573  * @param n {string*} 目标 16 位无符号整数
574  * @return {size_t} 返回拷贝的实际字节数,empty() == true 时,则返回 0
575  */
576  size_t operator>>(unsigned short& n);
577 
578  /**
579  * 将字符串对象中的内容赋予目标 8 位有符号字符
580  * @param n {string*} 目标 16 位有符号字符
581  * @return {size_t} 返回拷贝的实际字节数,empty() == true 时,则返回 0
582  */
583  size_t operator>>(char& n);
584 
585  /**
586  * 将字符串对象中的内容赋予目标 8 位无符号字符
587  * @param n {string*} 目标 16 位无符号字符
588  * @return {size_t} 返回拷贝的实际字节数,empty() == true 时,则返回 0
589  */
590  size_t operator>>(unsigned char& n);
591 
592  /**
593  * 判断当前对象的内容与所给的字符串对象内容是否相等(内部区分大小写)
594  * @param s {const string&} 输入的字符串对象引用
595  * @return {bool} 返回 true 表示字符串内容相同
596  */
597  bool operator==(const string& s) const;
598 
599  /**
600  * 判断当前对象的内容与所给的字符串对象内容是否相等(内部区分大小写)
601  * @param s {const string&} 输入的字符串对象指针
602  * @return {bool} 返回 true 表示字符串内容相同
603  */
604  bool operator==(const string* s) const;
605 
606  /**
607  * 判断当前对象的内容与所给的字符串内容是否相等(内部区分大小写)
608  * @param s {const string&} 输入的字符串对象指针
609  * @return {bool} 返回 true 表示字符串内容相同
610  */
611  bool operator==(const char* s) const;
612 
613  /**
614  * 判断当前对象的内容与所给的字符串对象内容是否不等(内部区分大小写)
615  * @param s {const string&} 输入的字符串对象引用
616  * @return {bool} 返回 true 表示字符串内容不同
617  */
618  bool operator!=(const string& s) const;
619 
620  /**
621  * 判断当前对象的内容与所给的字符串对象内容是否不等(内部区分大小写)
622  * @param s {const string&} 输入的字符串对象指针
623  * @return {bool} 返回 true 表示字符串内容不同
624  */
625  bool operator!=(const string* s) const;
626 
627  /**
628  * 判断当前对象的内容与所给的字符串内容是否不等(内部区分大小写)
629  * @param s {const string&} 输入的字符串对象指针
630  * @return {bool} 返回 true 表示字符串内容不同
631  */
632  bool operator!=(const char* s) const;
633 
634  /**
635  * 判断当前对象的内容是否小于所给的字符串对象内容(内部区分大小写)
636  * @param s {const string&} 输入的字符串对象引用
637  * @return {bool} 返回 true 表示当前字符串对象的内容小于输入的字符串
638  * 对象内容
639  */
640  bool operator<(const string& s) const;
641 
642  /**
643  * 判断当前对象的内容是否大于所给的字符串对象内容(内部区分大小写)
644  * @param s {const string&} 输入的字符串对象引用
645  * @return {bool} 返回 true 表示当前字符串对象的内容大于输入的字符串
646  * 对象内容
647  */
648  bool operator>(const string& s) const;
649 
650  /**
651  * 将当前对象直接转为字符串指针(即将内部缓冲区直接导出)
652  * @return {const char*} 返回值永远为非空指针,有可能为空串
653  */
654  operator const char*() const;
655 
656  /**
657  * 将当前字符串对象直接转为通用指针(即将内部缓冲区直接导出)
658  * @return {const char*} 返回值永远为非空指针
659  */
660  operator const void*() const;
661 
662  /**
663  * 将一个有符号字符添加进当前字符串对象的尾部
664  * @param ch {char} 有符号字符
665  * @return {string&} 当前字符串对象的引用
666  */
667  string& push_back(char ch);
668 
669  /**
670  * 比较两个字符串对象的内容是否相同(区分大小写)
671  * @param s {const string&} 输入的字符串对象的引用
672  * @param case_sensitive {bool} 为 true 表示区分大小写
673  * @return {bool} 返回 true 表示二者相等
674  */
675  bool equal(const string& s, bool case_sensitive = true) const;
676 
677  /**
678  * 检查当前 string 对象是否以指定的字符串开始
679  * @param s {const char*}
680  * @param case_sensitive {bool} 是否区分大小写
681  * @return {bool}
682  */
683  bool begin_with(const char* s, bool case_sensitive = true) const;
684  bool begin_with(const char* s, size_t len, bool case_sensitive = true) const;
685  bool begin_with(const string& s, bool case_sensitive = true) const;
686  bool begin_with(const void* v, size_t len) const;
687 
688  /**
689  * 检查当前 string 对象是否以指定的字符串结束
690  * @param s {const char*}
691  * @param case_sensitive {bool} 是否区分大小写
692  * @return {bool}
693  */
694  bool end_with(const char* s, bool case_sensitive = true) const;
695  bool end_with(const char* s, size_t len, bool case_sensitive = true) const;
696  bool end_with(const string& s, bool case_sensitive = true) const;
697  bool end_with(const void* v, size_t len) const;
698 
699  /**
700  * 比较两个字符串对象的内容是否相同(区分大小写)
701  * @param s {const string&} 输入的字符串对象的引用
702  * @return {int} 0:表示二者相同; > 0:当前字符串内容大于输入的内容;
703  * < 0 :当前字符串内容小于输入的内容
704  */
705  int compare(const string& s) const;
706 
707  /**
708  * 比较两个字符串对象的内容是否相同(区分大小写)
709  * @param s {const string&} 输入的字符串对象的指针
710  * @return {int} 0:表示二者相同; > 0:当前字符串内容大于输入的内容;
711  * < 0 :当前字符串内容小于输入的内容
712  */
713  int compare(const string* s) const;
714 
715  /**
716  * 比较两个字符串的内容是否相同
717  * @param s {const string&} 输入的字符串对象的引用
718  * @param case_sensitive {bool} 为 true 表示区分大小写
719  * @return {int} 0:表示二者相同; > 0:当前字符串内容大于输入的内容;
720  * < 0 :当前字符串内容小于输入的内容
721  */
722  int compare(const char* s, bool case_sensitive = true) const;
723 
724  /**
725  * 比较当前对象的缓冲区内容是否与所给的缓冲区的内容相同
726  * @param ptr {const void*} 输入的缓冲区地址
727  * @param len {size_t} ptr 的缓冲区内数据长度
728  * @return {int} 返回结果含义如下:
729  * 0:表示二者相同;
730  * > 0:当前对象缓冲区内容大于输入的内容;
731  * < 0 :当前对象缓冲内容小于输入的内容
732  */
733  int compare(const void* ptr, size_t len) const;
734 
735  /**
736  * 比较当前对象缓冲区内容是否与所给的缓冲区的内容相同,限定比较数据长度
737  * @param s {const void*} 输入的缓冲区地址
738  * @param len {size_t} ptr 的缓冲区内数据长度
739  * @param case_sensitive {bool} 为 true 表示区分大小写
740  * @return {int} 0:表示二者相同; > 0:当前对象缓冲区内容大于输入的内容;
741  * < 0 :当前对象缓冲内容小于输入的内容
742  */
743  int ncompare(const char* s, size_t len, bool case_sensitive = true) const;
744 
745  /**
746  * 从尾部向前比较当前对象的缓冲区内容是否与所给的缓冲区的内容相同,
747  * 限定比较数据长度
748  * @param s {const void*} 输入的缓冲区地址
749  * @param len {size_t} ptr 的缓冲区内数据长度
750  * @param case_sensitive {bool} 为 true 表示区分大小写
751  * @return {int} 0:表示二者相同;
752  * > 0:当前对象缓冲区内容大于输入的内容;
753  * < 0 :当前对象缓冲内容小于输入的内容
754  */
755  int rncompare(const char* s, size_t len, bool case_sensitive = true) const;
756 
757  /**
758  * 在当前字符串缓冲区中查找空行的位置,可以循环调用本方法以获得所有的
759  * 符合条件的内容
760  * @param left_count {int*} 当该指针非空时存储当前字符串剩余的数据长度
761  * @param buf {string*} 当找到空行时,则将上一次空行(不含该空行)和
762  * 本次空行(包含该空行)之间的数据存放于该缓冲区内,注:内部并不负责
763  * 清空该缓冲区,因为采用数据追加方式
764  * @return {int} 返回 0 表示未找到空行;返回值 > 0 表示空行的下一个
765  * 位置(因为需要找到一个空行返回的是该空行的下一个位置,所以若找到
766  * 空行则返回值一定大于 0);返回值 < 0 表示内部出错
767  */
768  int find_blank_line(int* left_count = NULL, string* buf = NULL);
769 
770  /**
771  * 重置内部查询状态,当需要重新开始调用 find_blank_line 时需要调用本
772  * 方法以重置内部查询状态
773  * @return {string&}
774  */
775  string& find_reset(void);
776 
777  /**
778  * 查找指定字符在当前对象缓冲区的位置(下标从 0 开始)
779  * @param n {char} 要查找的有符号字符
780  * @return {int} 字符在缓冲区中的位置,若返回值 < 0 则表示不存在
781  */
782  int find(char n) const;
783 
784  /**
785  * 查找指定字符串在当前对象缓冲区的起始位置(下标从 0 开始)
786  * @param needle {const char*} 要查找的有符号字符串
787  * @param case_sensitive {bool} 为 true 表示区分大小写
788  * @return {char*} 字符串在缓冲区中的起始位置,返回空指针则表示不存在
789  */
790  char* find(const char* needle, bool case_sensitive=true) const;
791 
792  /**
793  * 从尾部向前查找指定字符串在当前对象缓冲区的起始位置(下标从 0 开始)
794  * @param needle {const char*} 要查找的有符号字符串
795  * @param case_sensitive {bool} 为 true 表示区分大小写
796  * @return {char*} 字符串在缓冲区中的起始位置,若返回值为空指针则表示不存在
797  */
798  char* rfind(const char* needle, bool case_sensitive=true) const;
799 
800  /**
801  * 返回从当前字符串对象中缓冲区指定位置以左的内容
802  * @param n {size_t} 下标位置,当该值大于等于当前字符串的数据长度时,
803  * 则返回整个字符串对象;返回值不包含该值指定位置的字符内容
804  * @return {string} 返回值为一完整的对象,不需要单独释放,该函数的效率
805  * 可能并不太高
806  */
807  string left(size_t n);
808 
809  /**
810  * 返回从当前字符串对象中缓冲区指定位置以右的内容
811  * @param n {size_t} 下标位置,当该值大于等于当前字符串的数据长度时,
812  * 则返回的字符串对象内容为空;返回值不包含该值指定位置的字符内容
813  * @return {const string} 返回值为一完整的对象,不需要单独释放,该
814  * 函数的效率可能并不太高
815  */
816  string right(size_t n);
817 
818  /**
819  * 将当前对象的缓冲内容拷贝一部分数据至目标缓冲内
820  * @param buf {void*} 目标缓冲区地址
821  * @param size {size_t} buf 缓冲区长度
822  * @param move {bool} 在拷贝完数据后,是否需要将后面的数据向前移动并
823  * 覆盖前面的已拷贝的数据
824  * @return {size_t} 返回拷贝的实际字节数,当 empty() == true 时,则返回 0
825  */
826  size_t scan_buf(void* buf, size_t size, bool move = false);
827 
828  /**
829  * 从当前对象的缓冲区中拷贝一行数据(包含"\r\n")至目标缓冲区内,当数据
830  * 被拷贝至目标缓冲区后,在源缓冲区内未被拷贝的数据会发生移动并覆盖被
831  * 拷贝的数据区域
832  * @param out {string&} 目标缓冲区,函数内部不会先自动清空该缓冲区
833  * @param nonl {bool} 返回的一行数据是否去掉尾部的 "\r\n" 或 "\n"
834  * @param n {size_t*} 该参数为非空指针时,则存储拷贝到的数据长度;当读
835  * 到一个空行且 nonl 为 true 时,则该地址存储 0
836  * @param move {bool} 在拷贝完数据后,是否需要将后面的数据向前移动并
837  * 覆盖前面的已拷贝的数据
838  * @return {bool} 是否拷贝了一个完整行数据,如果返回 false 还需要根据
839  * empty() == true 来判断当前缓冲区中是否还有数据
840  */
841  bool scan_line(string& out, bool nonl = true, size_t* n = NULL,
842  bool move = false);
843 
844  /**
845  * 当使用 scan_xxx 类方法对缓冲区进行操作时未指定 move 动作,则调用本
846  * 函数可以使缓冲区内剩余的数据向前移动至缓冲区首部
847  * @return {size_t} 移动的字节数
848  */
849  size_t scan_move();
850 
851  /**
852  * 返回当前对象缓冲区中第一个不含数据的尾部地址
853  * @return {char*} 返回值为 NULL 则说明内部数据为空,即 empty() == true
854  */
855  char* buf_end(void);
856 
857  /**
858  * 返回当前对象缓冲区的起始地址
859  * @return {void*} 返回地址永远非空
860  */
861  void* buf() const;
862 
863  /**
864  * 以字符串方式返回当前对象缓冲区的起始地址
865  * @return {char*} 返回地址永远非空
866  */
867  char* c_str() const;
868 
869  /**
870  * 返回当前对象字符串的长度(不含\0)
871  * @return {size_t} 返回值 >= 0
872  */
873  size_t length() const;
874 
875  /**
876  * 返回当前对象字符串的长度(不含\0),功能与 length 相同
877  * @return {size_t} 返回值 >= 0
878  */
879  size_t size() const;
880 
881  /**
882  * 返回当前对象的缓冲区的空间长度,该值 >= 缓冲区内数据长度
883  * @return {size_t} 返回值 > 0
884  */
885  size_t capacity() const;
886 
887  /**
888  * 判断当前对象的缓冲区内数据长度是否为 0
889  * @return {bool} 返回 true 表示数据为空
890  */
891  bool empty() const;
892 
893  /**
894  * 返回当前对象内部所用的 acl C 库中的 ACL_VSTRING 对象地址
895  * @return {ACL_VSTRING*} 返回值永远非空
896  */
897  ACL_VSTRING* vstring(void) const;
898 
899  /**
900  * 将当前对象的缓冲区的下标位置移至指定位置
901  * @param n {size_t} 目标下标位置,当该值 >= capacity 时,内部会
902  * 重新分配更大些的内存
903  * @return {string&} 当前对象的引用
904  */
905  string& set_offset(size_t n);
906 
907  /**
908  * 调用该函数可以预先保证所需要的缓冲区大小
909  * @param n {size_t} 希望的缓冲区空间大小值
910  * @return {string&} 当前对象的引用
911  */
912  string& space(size_t n);
913 
914  /**
915  * 将当前对象存储的字符串进行分割
916  * @param sep {const char*} 进行分割时的分割标记
917  * @param quoted {bool} 当为 true 时,则对于由单/双引号引起来的
918  * 字符串内容,不做分割,但此时要求 sep 中不得存在单/双号
919  * @return {std::list<string>&} 返回 list 格式的分割结果,返回的结果
920  * 不需要释放,其引用了当前对象的一个内部指针
921  */
922  std::list<string>& split(const char* sep, bool quoted = false);
923 
924  /**
925  * 将当前对象存储的字符串进行分割
926  * @param sep {const char*} 进行分割时的分割标记
927  * @param quoted {bool} 当为 true 时,则对于由单/双引号引起来的
928  * 字符串内容,不做分割,但此时要求 sep 中不得存在单/双号
929  * @return {std::vector<string>&} 返回 vector 格式的分割结果,返回的
930  * 结果不需要释放,其引用了当前对象的一个内部指针
931  */
932  std::vector<string>& split2(const char* sep, bool quoted = false);
933 
934  /**
935  * 以 '=' 为分隔符将当前对象存储的字符串分割成 name/value 对,分割时会
936  * 自动去掉源字符串的起始处、结尾处以及分隔符 '=' 两边的空格及 TAB
937  * @return {std::pair<string, string>&} 如果当前对象存储的字符串
938  * 不符合分割条件(即不是严格的 name=value格式),则返回的结果中字符
939  * 串对象为空串,返回的结果不需要释放,其引用了当前对象的一个内部地址
940  */
941  std::pair<string, string>& split_nameval(void);
942 
943  /**
944  * 将字符串拷贝到当前对象的缓冲区中
945  * @param ptr {const char*} 源字符串地址,需以 '\0' 结束
946  * @return {string&} 当前对象的引用
947  */
948  string& copy(const char* ptr);
949 
950  /**
951  * 将源数据的定长数据拷贝至当前对象的缓冲区中
952  * @param ptr {const void*} 源数据地址
953  * @param len {size_t} ptr 源数据长度
954  * @return {string&} 当前对象的引用
955  */
956  string& copy(const void* ptr, size_t len);
957 
958  /**
959  * 将源字符串的数据移动至当前对象的缓冲区中,内部会自动判断源数据
960  * 地址是否就在当前对象的缓冲区中
961  * @param src {const char*} 源数据地址
962  * @return {string&} 当前对象的引用
963  */
964  string& memmove(const char* src);
965 
966  /**
967  * 将源字符串的数据移动至当前对象的缓冲区中,内部会自动判断源数据
968  * 地址是否就在当前对象的缓冲区中
969  * @param src {const char*} 源数据地址
970  * @param len {size_t} 移动数据的长度
971  * @return {string&} 当前对象的引用
972  */
973  string& memmove(const char* src, size_t len);
974 
975  /**
976  * 将指定字符串添加在当前对象数据缓冲区数据的尾部
977  * @param s {const string&} 源数据对象引用
978  * @return {string&} 当前对象的引用
979  */
980  string& append(const string& s);
981 
982  /**
983  * 将指定字符串添加在当前对象数据缓冲区数据的尾部
984  * @param s {const string&} 源数据对象指针
985  * @return {string&} 当前对象的引用
986  */
987  string& append(const string* s);
988 
989  /**
990  * 将指定字符串添加在当前对象数据缓冲区数据的尾部
991  * @param s {const string&} 源数据对象指针
992  * @return {string&} 当前对象的引用
993  */
994  string& append(const char* s);
995 
996  /**
997  * 将指定缓冲区中的数据添加在当前对象数据缓冲区数据的尾部
998  * @param ptr {const void*} 源数据对象指针
999  * @param len {size_t} ptr 数据长度
1000  * @return {string&} 当前对象的引用
1001  */
1002  string& append(const void* ptr, size_t len);
1003 
1004  /**
1005  * 将指定字符串数据添加在当前对象数据缓冲区数据的首部
1006  * @param s {const char*} 源数据地址
1007  * @return {string&} 当前对象的引用
1008  */
1009  string& prepend(const char* s);
1010 
1011  /**
1012  * 将指定内存数据添加在当前对象数据缓冲区数据的首部
1013  * @param ptr {const void*} 源数据地址
1014  * @param len {size_t} ptr 数据长度
1015  * @return {string&} 当前对象的引用
1016  */
1017  string& prepend(const void* ptr, size_t len);
1018 
1019  /**
1020  * 将内存数据插入指定下标位置开始的当前对象缓冲区中
1021  * @param start {size_t} 当前对象缓冲区的开始插入下标值
1022  * @param ptr {const void*} 内存数据的地址
1023  * @param len {size_t} 内存数据的长度
1024  * @return {string&} 当前对象的引用
1025  */
1026  string& insert(size_t start, const void* ptr, size_t len);
1027 
1028  /**
1029  * 带格式方式的添加数据(类似于 sprintf 接口方式)
1030  * @param fmt {const char*} 格式字符串
1031  * @param ... 变参数据
1032  * @return {string&} 当前对象的引用
1033  */
1034  string& format(const char* fmt, ...) ACL_CPP_PRINTF(2, 3);
1035 
1036  /**
1037  * 带格式方式的添加数据(类似于 vsprintf 接口方式)
1038  * @param fmt {const char*} 格式字符串
1039  * @param ap {va_list} 变参数据
1040  * @return {string&} 当前对象的引用
1041  */
1042  string& vformat(const char* fmt, va_list ap);
1043 
1044  /**
1045  * 带格式方式在当前对象的尾部添加数据
1046  * @param fmt {const char*} 格式字符串
1047  * @param ... 变参数据
1048  * @return {string&} 当前对象的引用
1049  */
1050  string& format_append(const char* fmt, ...) ACL_CPP_PRINTF(2, 3);
1051 
1052  /**
1053  * 带格式方式在当前对象的尾部添加数据
1054  * @param fmt {const char*} 格式字符串
1055  * @param ap {va_list} 变参数据
1056  * @return {string&} 当前对象的引用
1057  */
1058  string& vformat_append(const char* fmt, va_list ap);
1059 
1060  /**
1061  * 将当前对象中的数据的字符进行替换
1062  * @param from {char} 源字符
1063  * @param to {char} 目标字符
1064  * @return {string&} 当前对象的引用
1065  */
1066  string& replace(char from, char to);
1067 
1068  /**
1069  * 将当前对象的数据截短,缓冲区内部移动下标指针地址
1070  * @param n {size_t} 数据截短后的数据长度,如果该值 >= 当前缓冲区
1071  * 数据长度,则内部不做任何变化
1072  * @return {string&} 当前对象的引用
1073  */
1074  string& truncate(size_t n);
1075 
1076  /**
1077  * 在当前对象的缓冲区数据中去掉指定的字符串内容,在处理过程中会发生
1078  * 数据移动情况
1079  * @param needle {const char*} 指定需要去掉的字符串数据
1080  * @param each {bool} 当为 true 时,则每一个出现在 needle 中的字符都
1081  * 会在当前对象的缓存区中去掉;否则,仅在当前对象缓冲区中去掉完整的
1082  * needle 字符串
1083  * @return {string&} 当前对象的引用
1084  * 如 acl::string s("hello world!");
1085  * 若 s.strip("hel", true), 则结果为: s == "o word!"
1086  * 若 s.strip("hel", false), 则结果为: s = "lo world!"
1087  */
1088  string& strip(const char* needle, bool each = false);
1089 
1090  /**
1091  * 将当前对象缓冲区左边的空白(包含空格及TAB)去掉
1092  * @return {string&} 当前对象的引用
1093  */
1094  string& trim_left_space();
1095 
1096  /**
1097  * 将当前对象缓冲区右边的空白(包含空格及TAB)去掉
1098  * @return {string&} 当前对象的引用
1099  */
1100  string& trim_right_space();
1101 
1102  /**
1103  * 将当前对象缓冲区中所有的空白(包含空格及TAB)去掉
1104  * @return {string&} 当前对象的引用
1105  */
1106  string& trim_space();
1107 
1108  /**
1109  * 将当前对象缓冲区左边的回车换行符去掉
1110  * @return {string&} 当前对象的引用
1111  */
1112  string& trim_left_line();
1113 
1114  /**
1115  * 将当前对象缓冲区右边的回车换行符去掉
1116  * @return {string&} 当前对象的引用
1117  */
1118  string& trim_right_line();
1119 
1120  /**
1121  * 将当前对象缓冲区中所有的回车换行符去掉
1122  * @return {string&} 当前对象的引用
1123  */
1124  string& trim_line();
1125 
1126  /**
1127  * 清空当前对象的数据缓冲区
1128  * @return {string&} 当前对象的引用
1129  */
1130  string& clear();
1131 
1132  /**
1133  * 将当前对象的数据缓冲区中的数据均转为小写
1134  * @return {string&} 当前对象的引用
1135  */
1136  string& lower(void);
1137 
1138  /**
1139  * 将当前对象的数据缓冲区中的数据均转为大写
1140  * @return {string&} 当前对象的引用
1141  */
1142  string& upper(void);
1143 
1144  /**
1145  * 从当前缓冲区中将指定偏移量指定长度的数据拷贝至目标缓冲区中
1146  * @param out {string&} 目标缓冲区,内部采用追加方式,并不清空该对象
1147  * @param p {size_t} 当前缓冲区的起始位置
1148  * @param len {size_t} 从 p 起始位置开始拷贝的数据量,当该值为 0 时
1149  * 则拷贝指定 p 位置后所有的数据,否则拷贝指定长度的数据,若指定的
1150  * 数据长度大于实际要拷贝的长度,则仅拷贝实际存在的数据
1151  * @return {size_t} 返回拷贝的实际数据长度,p 越界时则该返回值为 0
1152  */
1153  size_t substr(string& out, size_t p = 0, size_t len = 0) const;
1154 
1155  /**
1156  * 将当前对象的数据缓冲区中的数据进行 base64 转码
1157  * @return {string&} 当前对象的引用
1158  */
1159  string& base64_encode(void);
1160 
1161  /**
1162  * 将输入的源数据进行 base64 转码并存入当前对象的缓冲区中
1163  * @param ptr {const void*} 源数据的地址
1164  * @param len {size_t} 源数据长度
1165  * @return {string&} 当前对象的引用
1166  */
1167  string& base64_encode(const void* ptr, size_t len);
1168 
1169  /**
1170  * 如果当前对象的缓冲区中的数据是经 base64 编码的,则此函数将这些
1171  * 数据进行解码
1172  * @return {string&} 当前对象的引用,如果解码出错,则内部缓冲区会被自动清空,
1173  * 调用 string::empty() 返回 true
1174  */
1175  string& base64_decode(void);
1176 
1177  /**
1178  * 将输入的 base64 编码的数据进行解码并存入当前对象的缓冲区中
1179  * @param s {const char*} 经 base64 编码的源数据
1180  * @return {string&} 当前对象的引用,如果解码出错,则内部缓冲区会被自动清空,
1181  * 调用 string::empty() 返回 true
1182  */
1183  string& base64_decode(const char* s);
1184 
1185  /**
1186  * 将输入的 base64 编码的数据进行解码并存入当前对象的缓冲区中
1187  * @param ptr {const void*} 经 base64 编码的源数据
1188  * @param len {size_t} ptr 数据长度
1189  * @return {string&} 当前对象的引用,如果解码出错,则内部缓冲区会被自动清空,
1190  * 调用 string::empty() 返回 true
1191  */
1192  string& base64_decode(const void* ptr, size_t len);
1193 
1194  /**
1195  * 将输入的源数据进行 url 编码并存入当前对象的缓冲区中
1196  * @param s {const char*} 源数据
1197  * @param dbuf {dbuf_pool*} 内存池对象,如果非空,则内部的动态内存在
1198  * 该对象上分配且当调用者在释放该对象时内部临时动态内存随之被释放,
1199  * 否则使用 acl_mymalloc 分配并自动释放
1200  * @return {string&} 当前对象的引用
1201  */
1202  string& url_encode(const char* s, dbuf_pool* dbuf = NULL);
1203 
1204  /**
1205  * 将输入的用 url 编码的源数据解码并存入当前对象的缓冲区中
1206  * @param s {const char*} 经 url 编码的源数据
1207  * @param dbuf {dbuf_pool*} 内存池对象,如果非空,则内部的动态内存在
1208  * 该对象上分配且当调用者在释放该对象时内部临时动态内存随之被释放,
1209  * @return {string&} 当前对象的引用
1210  */
1211  string& url_decode(const char* s, dbuf_pool* dbuf = NULL);
1212 
1213  /**
1214  * 将源数据进行 H2B 编码并存入当前对象的缓冲区中
1215  * @param s {const void*} 源数据地址
1216  * @param len {size_t} 源数据长度
1217  * @return {string&} 当前对象的引用
1218  */
1219  string& hex_encode(const void* s, size_t len);
1220 
1221  /**
1222  * 将源数据进行 H2B 解码并存入当前对象的缓冲区中
1223  * @param s {const char*} 源数据地址
1224  * @param len {size_t} 源数据长度
1225  * @return {string&} 当前对象的引用
1226  */
1227  string& hex_decode(const char* s, size_t len);
1228 
1229  /**
1230  * 从文件全路径中提取文件名
1231  * @param path {const char*} 文件全路径字符串,非空字符串
1232  * @return {string&} 当前对象的引用
1233  */
1234  string& basename(const char* path);
1235 
1236  /**
1237  * 从文件全路径中提取文件所在目录
1238  * @param path {const char*} 文件全路径字符串,非空字符串
1239  * @return {string&} 当前对象的引用
1240  */
1241  string& dirname(const char* path);
1242 
1243  /**
1244  * 将 32 位有符号整数转为字符串存(内部使用了线程局部变量)
1245  * @param n {int} 32 位有符号整数
1246  * @return {string&} 转换结果对象的引用,其引用了内部的一个线程局部变量
1247  */
1248  static string& parse_int(int n);
1249 
1250  /**
1251  * 将 32 位无符号整数转为字符串存(内部使用了线程局部变量)
1252  * @param n {int} 32 位无符号整数
1253  * @return {string&} 转换结果对象的引用,其引用了内部的一个线程局部变量
1254  */
1255  static string& parse_int(unsigned int n);
1256 #if defined(_WIN32) || defined(_WIN64)
1257  static string& parse_int64(__int64 n);
1258  static string& parse_int64(unsigned __int64 n);
1259 #else
1260  /**
1261  * 将 64 位有符号整数转为字符串存(内部使用了线程局部变量)
1262  * @param n {long long int} 64 位有符号整数
1263  * @return {string&} 转换结果对象的引用,其引用了内部的一个线程局部变量
1264  */
1265  static string& parse_int64(long long int n);
1266 
1267  /**
1268  * 将 64 位无符号整数转为字符串存(内部使用了线程局部变量)
1269  * @param n {unsigned long long int} 64 位无符号整数
1270  * @return {string&} 转换结果对象的引用,其引用了内部的一个线程局部变量
1271  */
1272  static string& parse_int64(unsigned long long int n);
1273 #endif
1274 
1275  /**
1276  * 模板函数,可用在以下场景:
1277  * string s1, s2;
1278  * T v;
1279  * s1 = s2 + v;
1280  */
1281  template<typename T>
1282  string operator+(T v)
1283  {
1284  string s(*this);
1285  s += v;
1286  return s;
1287  }
1288 
1289 private:
1290  ACL_VSTRING* vbf_;
1291  char* scan_ptr_;
1292  std::list<string>* list_tmp_;
1293  std::vector<string>* vector_tmp_;
1294  std::pair<string, string>* pair_tmp_;
1295  ACL_LINE_STATE* line_state_;
1296  int line_state_offset_;
1297  bool use_bin_;
1298 
1299  void init(size_t len);
1300 };
1301 
1302 /**
1303  * 模板函数,可用在以下场景:
1304  * string s1, s2;
1305  * T v;
1306  * s1 = v + s2;
1307  */
1308 template<typename T>
1309 string operator+(T v, const string& rhs)
1310 {
1311  string s;
1312  s = v;
1313  s += rhs;
1314  return s;
1315 }
1316 
1317 /**
1318  * 示例:
1319  * string s, s1 = "hello", s2 = "world";
1320  * s = s1 + " " + s2;
1321  * s = ">" + s1 + " " + s2;
1322  * s = 1000 + s1 + " " + s2 + 1000;
1323  */
1324 
1325 } // namespce acl
#define ACL_CPP_PRINTF(format_idx, arg_idx)
Definition: atomic.hpp:75
ACL_API ACL_VSTRING const char * format
Definition: acl_vstring.h:239
string operator+(T v, const string &rhs)
Definition: string.hpp:1309
string operator+(T v)
Definition: string.hpp:1282
ACL_API void const char * fmt
Definition: acl_aio.h:771
#define ACL_CPP_API