00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00032
00033 #ifndef _cl_header_string_container_
00034 #define _cl_header_string_container_
00035
00036 #if defined(_MSC_VER)
00037 #pragma once
00038 #endif
00039
00040 #include "../api_core.h"
00041 #include "string_data.h"
00042
00043 class CL_MemoryPool;
00044
00049 template<typename CharType, typename ReferenceClass, typename StdString>
00050 class CL_API_CORE CL_StringContainer : public CL_StringData<CharType, ReferenceClass, StdString>
00051 {
00052 public:
00053
00054 #ifndef WIN32
00055
00056
00057
00058
00059 typedef unsigned int size_type;
00060 typedef CharType char_type;
00061 typedef CharType *iterator;
00062 typedef const CharType *const_iterator;
00063
00064
00065 iterator begin() { return CL_StringData<CharType, ReferenceClass, StdString>::begin(); }
00066
00070 iterator end() { return CL_StringData<CharType, ReferenceClass, StdString>::end(); }
00071
00075 size_type size() const { return CL_StringData<CharType, ReferenceClass, StdString>::size(); }
00076
00080 size_type length() const { return CL_StringData<CharType, ReferenceClass, StdString>::length(); }
00081
00085 bool empty() const { return CL_StringData<CharType, ReferenceClass, StdString>::empty(); }
00086
00090 const CharType *data() const { return CL_StringData<CharType, ReferenceClass, StdString>::data(); }
00091 CharType *data() { return CL_StringData<CharType, ReferenceClass, StdString>::data(); }
00092
00093 #endif
00094
00095 CL_StringContainer();
00096
00100 CL_StringContainer(const StdString &source);
00101
00105 CL_StringContainer(const CL_StringContainer &source);
00106
00111 CL_StringContainer(const CL_StringData<CharType, ReferenceClass, StdString> &source);
00112
00116 CL_StringContainer(const char *c_str);
00117
00122 CL_StringContainer(const char *c_str, size_type length);
00123
00127 CL_StringContainer(const wchar_t *wc_str);
00128
00133 CL_StringContainer(const wchar_t *wc_str, size_type length);
00134
00139 CL_StringContainer(size_type n, CharType c);
00140 ~CL_StringContainer();
00141
00145 operator ReferenceClass() const;
00146
00147 const CharType *c_str() const;
00148
00152 size_type max_size() const { return (size_type) -1; }
00153
00157 size_type capacity() const { return data_capacity; }
00158
00159
00160
00161
00163 void clear();
00164
00168 void reserve(size_type size);
00169
00173 void resize(size_type n);
00174
00179 void resize(size_type n, CharType c);
00180
00181
00182
00183 CL_StringContainer &assign(const CL_StringData<CharType, ReferenceClass, StdString> &s);
00184
00193 CL_StringContainer &assign(const CL_StringData<CharType, ReferenceClass, StdString> &s, size_type pos, size_type n);
00194
00201 CL_StringContainer &assign(const CharType *s, size_type n);
00202
00208 CL_StringContainer &assign(const CharType *s);
00209
00216 CL_StringContainer &assign(size_type n, CharType c);
00217
00224 iterator insert(iterator pos, const CharType &item)
00225 {
00226 size_type insert_pos = (size_type) (pos - begin());
00227 size_type n = length();
00228 if (insert_pos > n)
00229 insert_pos = n;
00230 resize(n + 1);
00231 CharType *d = data();
00232 for (size_type i = n+1; i > insert_pos; i--)
00233 d[i] = d[i-1];
00234 d[insert_pos] = item;
00235
00236 return begin() + insert_pos;
00237 }
00238
00244 void insert(iterator pos, size_type num_copies, const CharType &item);
00245
00253 CL_StringContainer &insert(size_type pos, const CL_StringData<CharType, ReferenceClass, StdString> &s);
00254
00264 CL_StringContainer &insert(size_type pos, const CL_StringData<CharType, ReferenceClass, StdString> &s, size_type pos1, size_type length);
00265
00272 CL_StringContainer &insert(size_type pos, const CharType *s);
00273
00281 CL_StringContainer &insert(size_type pos, const CharType *s, size_type s_length);
00282
00290 CL_StringContainer &insert(size_type pos, size_type n, CharType c);
00291
00298 CL_StringContainer &append(const CL_StringData<CharType, ReferenceClass, StdString> &s);
00299
00308 CL_StringContainer &append(const CL_StringData<CharType, ReferenceClass, StdString> &s, size_type pos, size_type n);
00309
00310 CL_StringContainer<CharType, ReferenceClass, StdString> &append(const char *s);
00311
00318 CL_StringContainer &append(const char *s, size_type n);
00319
00325 CL_StringContainer &append(const wchar_t *s);
00326
00333 CL_StringContainer &append(const wchar_t *s, size_type n);
00334
00341 CL_StringContainer &append(size_type n, CharType c);
00342
00346 void push_back(CharType c);
00347
00353 iterator erase(iterator p)
00354 {
00355 iterator e = end();
00356 if (p == e)
00357 return e;
00358 return erase(p, p+1);
00359 }
00360
00367 iterator erase(iterator first, iterator last)
00368 {
00369 size_type pos = (size_type) (first - begin());
00370 iterator e = end();
00371 iterator p1 = first;
00372 iterator p2 = last;
00373 while (p2 != e)
00374 {
00375 *p1 = *p2;
00376 p1++;
00377 p2++;
00378 }
00379 size_type new_size = (size_type) (p1 - begin());
00380 resize(new_size);
00381 return begin() + pos;
00382 }
00383
00390 CL_StringContainer &erase(size_type pos = 0, size_type n = CL_StringDataTypes::npos);
00391
00400 CL_StringContainer &replace(size_type pos, size_type n, const CL_StringData<CharType, ReferenceClass, StdString> &s);
00401
00412 CL_StringContainer &replace(size_type pos, size_type n, const CL_StringData<CharType, ReferenceClass, StdString> &s, size_type pos1, size_type n1);
00413
00422 CL_StringContainer &replace(size_type pos, size_type n, const CharType *s, size_type n1);
00423
00431 CL_StringContainer &replace(size_type pos, size_type n, const CharType *s);
00432
00441 CL_StringContainer &replace(size_type pos, size_type n, size_type n1, CharType c);
00442
00451 CL_StringContainer &replace(iterator first, iterator last, const CL_StringData<CharType, ReferenceClass, StdString> &s);
00452
00461 CL_StringContainer &replace(iterator first, iterator last, const CharType *s, size_type n);
00462
00470 CL_StringContainer &replace(iterator first, iterator last, const CharType *s);
00471
00480 CL_StringContainer &replace(iterator first, iterator last, size_type n, CharType c);
00481
00489 size_type copy(CharType *buf, size_type n, size_type pos = 0) const;
00490
00491 CL_StringContainer &operator =(const CL_StringContainer &source);
00492 CL_StringContainer &operator =(const CL_StringData<CharType, ReferenceClass, StdString> &source);
00493 CL_StringContainer &operator =(const char *c_str);
00494 CL_StringContainer &operator =(const wchar_t *c_str);
00495 CL_StringContainer &operator +=(const CL_StringData<CharType, ReferenceClass, StdString> &s);
00496 CL_StringContainer &operator +=(const char *c_str);
00497 CL_StringContainer &operator +=(const wchar_t *c_str);
00498 CL_StringContainer &operator +=(CharType c);
00499
00500 protected:
00501
00503 void init();
00504
00505 CL_MemoryPool *pool;
00506 size_type data_capacity;
00507 enum { local_string_length = 63 };
00508 CharType local_string[local_string_length + 1];
00509 };
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559 #endif
00560