Codemesh Runtime v3 C++ API Reference  3.9.205
xmog_quickstring.h
1 //
2 // Copyright (c) 1999-2020 by Codemesh, Inc.. ALL RIGHTS RESERVED.
3 //
4 
5 
6 #ifndef xmog_quickstring_inc
7 #define xmog_quickstring_inc
8 
9 
10 #if (XMOG_WINDOWS==1 && _MSC_VER <= 1200)
11 
12 #define XMOG_QSTR(x) xmog_qstr_##x##_char
13 #define XMOG_QSTR_1(x,y) xmog_qstr_##x##_##y
14 #define XMOG_QSTR_TYPE(x,y) class xmog_qstr_##x##_##y \
15 {\
16 private:\
17  \
18  y buffer[ x ];\
19  \
20  y * pBuffer;\
21  \
22  size_t cUsed;\
23  \
24 public:\
25  \
26  xmog_qstr_##x##_##y() :\
27  pBuffer( 0 ),\
28  cUsed( 0 )\
29  {\
30  }\
31  \
32  \
33  xmog_qstr_##x##_##y( const y * pStr, size_t max = (size_t)-1 ) :\
34  pBuffer( 0 ),\
35  cUsed( 0 )\
36  {\
37  if( max != 0 )\
38  append( pStr, max == (size_t)-1 ? 0 : max );\
39  else\
40  buffer[ 0 ] = 0;\
41  }\
42  \
43  xmog_qstr_##x##_##y( xmog_qstr_##x##_##y & rhs ) :\
44  pBuffer( 0 ),\
45  cUsed( 0 )\
46  {\
47  if( rhs.cUsed > 0 )\
48  append( (const y*)rhs, rhs.cUsed );\
49  else\
50  buffer[ 0 ] = 0;\
51  }\
52  \
53  \
54  xmog_qstr_##x##_##y & operator = ( const xmog_qstr_##x##_##y & rhs )\
55  {\
56  if( pBuffer != NULL )\
57  {\
58  delete[] pBuffer;\
59  pBuffer = NULL;\
60  }\
61  \
62  cUsed = 0;\
63  \
64  if( rhs.cUsed > 0 )\
65  append( (const y*)rhs, rhs.cUsed );\
66  else\
67  buffer[ 0 ] = 0;\
68  \
69  return *this;\
70  }\
71  \
72  \
73  xmog_qstr_##x##_##y & operator = ( const y * pStr )\
74  {\
75  if( pBuffer != NULL )\
76  {\
77  delete[] pBuffer;\
78  pBuffer = NULL;\
79  }\
80  \
81  cUsed = 0;\
82  buffer[ 0 ] = 0;\
83  \
84  append( pStr );\
85  \
86  return *this;\
87  }\
88  \
89  ~xmog_qstr_##x##_##y()\
90  {\
91  if( pBuffer )\
92  delete[] pBuffer;\
93  buffer[ 0 ] = 0;\
94  pBuffer = 0;\
95  }\
96  \
97  operator y * ()\
98  {\
99  return pBuffer ? pBuffer : buffer;\
100  }\
101  \
102  operator const y * () const\
103  {\
104  return pBuffer ? pBuffer : buffer;\
105  }\
106  \
107  void alloc( size_t size )\
108  {\
109  if( size > x )\
110  pBuffer = new y[ size ];\
111  }\
112  \
113  void append( const y * str, size_t max = 0 )\
114  {\
115  if( str == 0 )\
116  return;\
117  \
118  size_t len = max ? max : strlen( str );\
119  \
120  if( pBuffer == 0 && cUsed + len < x )\
121  {\
122  strncpy( buffer + cUsed, str, len + 1 );\
123  cUsed += len;\
124  }\
125  else\
126  {\
127  y * temp = new y[ cUsed + len + 1 ];\
128  \
129  if( pBuffer )\
130  {\
131  strncpy( temp, pBuffer, cUsed );\
132  delete[] pBuffer;\
133  }\
134  else\
135  strncpy( temp, buffer, cUsed );\
136  \
137  strncpy( temp + cUsed, str, len + 1 );\
138  pBuffer = temp;\
139  cUsed += len;\
140  }\
141  \
142  (pBuffer?pBuffer:buffer)[ cUsed ] = 0;\
143  }\
144  \
145  void replace( y src, y dest )\
146  {\
147  y * pElem = pBuffer ? pBuffer : buffer;\
148  \
149  for( jint i=(jint)cUsed-1; i>=0; --i, pElem++ )\
150  if( *pElem == src )\
151  *pElem = dest;\
152  }\
153  \
154  size_t length() const\
155  {\
156  return cUsed;\
157  }\
158 };
159 
160 XMOG_QSTR_TYPE(32,char)
161 XMOG_QSTR_TYPE(64,char)
162 XMOG_QSTR_TYPE(256,char)
163 XMOG_QSTR_TYPE(512,char)
164 XMOG_QSTR_TYPE(1024,char)
165 
166 #else
167 
168 #define XMOG_QSTR(x) xmog_qstr<x>
169 #define XMOG_QSTR_1(x,y) xmog_qstr<x,y>
170 
171 template < int PreAlloc, class ElemType = char > class xmog_qstr
172 {
173 private:
174 
175  ElemType buffer[ PreAlloc ];
176 
177  ElemType * pBuffer;
178 
179  size_t cUsed;
180 
181 public:
182 
183  xmog_qstr() :
184  pBuffer( 0 ),
185  cUsed( 0 )
186  {
187  }
188 
189 
190  xmog_qstr( const ElemType * pStr, size_t max = (size_t)-1 ) :
191  pBuffer( 0 ),
192  cUsed( 0 )
193  {
194  if( max != 0 )
195  append( pStr, max == (size_t)-1 ? 0 : max );
196  else
197  buffer[ 0 ] = 0;
198  }
199 
200  xmog_qstr( xmog_qstr & rhs ) :
201  pBuffer( 0 ),
202  cUsed( 0 )
203  {
204  if( rhs.cUsed > 0 )
205  append( (const ElemType*)rhs, rhs.cUsed );
206  else
207  buffer[ 0 ] = 0;
208  }
209 
210 
211  xmog_qstr & operator = ( const xmog_qstr & rhs )
212  {
213  if( pBuffer != NULL )
214  {
215  delete[] pBuffer;
216  pBuffer = NULL;
217  }
218 
219  cUsed = 0;
220 
221  if( rhs.cUsed > 0 )
222  append( (const ElemType*)rhs, rhs.cUsed );
223  else
224  buffer[ 0 ] = 0;
225 
226  return *this;
227  }
228 
229 
230  xmog_qstr & operator = ( const ElemType * pStr )
231  {
232  if( pBuffer != NULL )
233  {
234  delete[] pBuffer;
235  pBuffer = NULL;
236  }
237 
238  cUsed = 0;
239  buffer[ 0 ] = 0;
240 
241  append( pStr );
242 
243  return *this;
244  }
245 
246  ~xmog_qstr()
247  {
248  if( pBuffer )
249  delete[] pBuffer;
250  buffer[ 0 ] = 0;
251  pBuffer = 0;
252  }
253 
254  operator ElemType * ()
255  {
256  return pBuffer ? pBuffer : buffer;
257  }
258 
259  operator const ElemType * () const
260  {
261  return pBuffer ? pBuffer : buffer;
262  }
263 
264  void alloc( size_t size )
265  {
266  if( size > PreAlloc )
267  pBuffer = new ElemType[ size ];
268  }
269 
270  void append( const ElemType * str, size_t max = 0 )
271  {
272  if( str == 0 )
273  return;
274 
275  size_t len = max ? max : strlen( str );
276 
277  if( pBuffer == 0 && cUsed + len < PreAlloc )
278  {
279  strncpy( buffer + cUsed, str, len + 1 );
280  cUsed += len;
281  }
282  else
283  {
284  ElemType * temp = new ElemType[ cUsed + len + 1 ];
285 
286  if( pBuffer )
287  {
288  strncpy( temp, pBuffer, cUsed );
289  delete[] pBuffer;
290  }
291  else
292  strncpy( temp, buffer, cUsed );
293 
294  strncpy( temp + cUsed, str, len + 1 );
295  pBuffer = temp;
296  cUsed += len;
297  }
298 
299  (pBuffer?pBuffer:buffer)[ cUsed ] = 0;
300  }
301 
302  void replace( ElemType src, ElemType dest )
303  {
304  ElemType * pElem = pBuffer ? pBuffer : buffer;
305 
306  for( jint i=(jint)cUsed-1; i>=0; --i, pElem++ )
307  if( *pElem == src )
308  *pElem = dest;
309  }
310 
311  size_t length() const
312  {
313  return cUsed;
314  }
315 };
316 
317 #endif // _MSC_VER <= 1200
318 
319 #endif //xmog_quickstring_inc
xmog_qstr
Definition: xmog_quickstring.h:171

Copyright (c) 1999-2020 by Codemesh, Inc., ALL RIGHTS RESERVED.